diff --git a/conf/caldav.php b/conf/caldav.php deleted file mode 100755 index c3d3f50..0000000 --- a/conf/caldav.php +++ /dev/null @@ -1,103 +0,0 @@ - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/sources/README.md b/sources/README.md deleted file mode 100644 index c1b3da7..0000000 --- a/sources/README.md +++ /dev/null @@ -1,36 +0,0 @@ -AgenDAV - CalDAV web client -=========================== - -AgenDAV is a CalDAV web client which features an AJAX interface to allow -users to manage their own calendars and shared ones. It's released under -the GPLv3 license. - -Requisites ----------- - -* A CalDAV server (developed mainly with [DAViCal](http://www.davical.org/)) -* A web server -* PHP >= 5.3.0 -* PHP mbstring extension -* PHP cURL extension -* MySQL > 5.1 or PostgreSQL >= 8.1 - -Thanks ------- - -AgenDAV is possible thanks to the following projects: - -* [CodeIgniter](http://codeigniter.com) -* [DAViCal](http://www.davical.org/) -* [AWL, Andrew's Web Libraries](http://andrew.mcmillan.net.nz/projects/awl) -* [iCalCreator](http://www.kigkonsult.se/iCalcreator/) -* [FullCalendar](http://arshaw.com/fullcalendar/) -* [jQuery](http://jquery.com) -* [jQuery UI](http://jqueryui.com) -* [Freeow!](http://pjdietz.com/jquery-plugins/freeow/) -* [Really Simple Color Picker](http://laktek.com/2008/10/27/really-simple-color-picker-in-jquery/) -* [qTip2](http://craigsworks.com/projects/qtip2/) -* [timePicker](https://github.com/perifer/timePicker) -* [LoadMask](http://code.google.com/p/jquery-loadmask/) -* [FatCow.com free icons](http://www.fatcow.com/free-icons) -* And other projects I may forget (please, ask for credit!) diff --git a/sources/artwork/agendav_300transp.png b/sources/artwork/agendav_300transp.png deleted file mode 100644 index ed3e5fc..0000000 Binary files a/sources/artwork/agendav_300transp.png and /dev/null differ diff --git a/sources/artwork/agendav_logo.svg b/sources/artwork/agendav_logo.svg deleted file mode 100644 index a9ac516..0000000 --- a/sources/artwork/agendav_logo.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - AgenDAV - - - - - - diff --git a/sources/artwork/favicon.ico b/sources/artwork/favicon.ico deleted file mode 100644 index 1602e72..0000000 Binary files a/sources/artwork/favicon.ico and /dev/null differ diff --git a/sources/artwork/favicon128.png b/sources/artwork/favicon128.png deleted file mode 100644 index fe81adf..0000000 Binary files a/sources/artwork/favicon128.png and /dev/null differ diff --git a/sources/artwork/favicon16.png b/sources/artwork/favicon16.png deleted file mode 100644 index 4941837..0000000 Binary files a/sources/artwork/favicon16.png and /dev/null differ diff --git a/sources/artwork/favicon32.png b/sources/artwork/favicon32.png deleted file mode 100644 index 683cb09..0000000 Binary files a/sources/artwork/favicon32.png and /dev/null differ diff --git a/sources/artwork/favicon64.png b/sources/artwork/favicon64.png deleted file mode 100644 index 4acc5bd..0000000 Binary files a/sources/artwork/favicon64.png and /dev/null differ diff --git a/sources/artwork/raw.png b/sources/artwork/raw.png deleted file mode 100644 index a750991..0000000 Binary files a/sources/artwork/raw.png and /dev/null differ diff --git a/sources/bin/.gitignore b/sources/bin/.gitignore deleted file mode 100644 index f6a4255..0000000 --- a/sources/bin/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -compiler-latest.zip -compiler.jar -yui* diff --git a/sources/bin/agendavcli b/sources/bin/agendavcli deleted file mode 100755 index cc1f029..0000000 --- a/sources/bin/agendavcli +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -PHPCLI=`which php-cli 2>/dev/null` -if [ "x$PHPCLI" == "x" ]; then - PHPCLI=`which php 2>/dev/null` -fi - -# Find path to web/public dir -realpath() { - [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" -} - -PUBLIC_DIR=`realpath "$0"|sed 's_agendavcli\$__g'`../web/public - -$PHPCLI "${PUBLIC_DIR}"/index.php cli ${1-} diff --git a/sources/bin/prepare-static.php b/sources/bin/prepare-static.php deleted file mode 100755 index a7e9b99..0000000 --- a/sources/bin/prepare-static.php +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/php - - 'http://closure-compiler.googlecode.com/files/compiler-latest.zip', - 'yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar' => - 'http://yui.zenfs.com/releases/yuicompressor/yuicompressor-2.4.7.zip' - ); - -$web_dir = getcwd() . '/../web/'; -$public_dir = $web_dir . 'public/'; -$js_dir = $web_dir . 'public/js/'; -$css_dir = $web_dir . 'public/css/'; -$app_dir = $web_dir . 'application/'; - -// Google Closure Compiler and YUI -foreach ($compilers as $path => $url) { - $file = basename($path); - if (!file_exists($file)) { - $zip = '/tmp/tmp_'.$file.'.zip'; - $ziphandle = fopen($zip, 'w'); - $options = array( - CURLOPT_FILE => $ziphandle, - CURLOPT_TIMEOUT => 28800, - CURLOPT_URL => $url, - ); - $ch = curl_init(); - curl_setopt_array($ch, $options); - curl_exec($ch); - - // Use -j to extract here - exec('unzip -j ' . $zip . ' ' . $path); - fclose($ziphandle); - } -} - -// Load file list -define('BASEPATH', $app_dir); -require_once($app_dir . 'hooks/Defs.php'); - -$defs = new Defs(); -$defs->definitions(); - - -// JS -$jsmin = $js_dir . 'jquery-base-' . AGENDAV_VERSION . '.js'; -$jsfull = $js_dir . 'agendav-' . AGENDAV_VERSION . '.js'; - -$jsfullhandle = fopen($jsfull, 'w'); -$jsminhandle = fopen($jsmin, 'w'); -$i = 0; -foreach (Defs::$jsfiles as $js) { - echo "Processing $js..."; - $contents = ''; - if (strpos($js, '.min.') !== FALSE) { - echo " already minimized.\n"; - $contents = file_get_contents($js_dir . $js); - } else { - echo " using compiler.jar.\n"; - $cmd = 'java -jar compiler.jar --compilation_level ' - .'SIMPLE_OPTIMIZATIONS --js ' . $js_dir . $js; - $cmdhandle = popen($cmd, 'r'); - while (!feof($cmdhandle)) { - $contents .= fread($cmdhandle, 8192); - } - } - - // Write on two files - if ($i < 2) { - fwrite($jsminhandle, $contents); - } else { - fwrite($jsfullhandle, $contents); - } - $i++; -} -fclose($jsfullhandle); -fclose($jsminhandle); - - -// CSS -$cssmin = $css_dir . 'agendav-' . AGENDAV_VERSION . '.css'; -$cssprint = $css_dir . 'agendav-' . AGENDAV_VERSION . '.print.css'; -$tmp = array_keys($compilers); -$yuicompressor = basename($tmp[1]); - -$csshandle = fopen($cssmin, 'w'); -$cssprinthandle = fopen($cssprint, 'w'); -$tasks = array('cssfiles', 'printcssfiles'); -foreach ($tasks as $task) { - foreach (Defs::$$task as $css) { - echo "Processing $css..."; - $contents = ''; - if (strpos($css, '.min.') !== FALSE) { - echo " already minimized.\n"; - $contents = file_get_contents($css_dir . $css); - } else { - echo " using ".$yuicompressor."\n"; - $cmd = 'java -jar '.$yuicompressor.' --type css' - .' ' . $css_dir . $css; - $cmdhandle = popen($cmd, 'r'); - while (!feof($cmdhandle)) { - $contents .= fread($cmdhandle, 8192); - } - } - - // Write - if ($task == 'cssfiles') { - fwrite($csshandle, $contents); - } else { - fwrite($cssprinthandle, $contents); - } - } -} -fclose($csshandle); -fclose($cssprinthandle); - diff --git a/sources/doc/Makefile b/sources/doc/Makefile deleted file mode 100644 index b516c1f..0000000 --- a/sources/doc/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/AgenDAV.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/AgenDAV.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/AgenDAV" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/AgenDAV" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - make -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/sources/doc/source/_themes/LICENSE b/sources/doc/source/_themes/LICENSE deleted file mode 100644 index 81f4d30..0000000 --- a/sources/doc/source/_themes/LICENSE +++ /dev/null @@ -1,45 +0,0 @@ -Modifications: - -Copyright (c) 2010 Kenneth Reitz. - - -Original Project: - -Copyright (c) 2010 by Armin Ronacher. - - -Some rights reserved. - -Redistribution and use in source and binary forms of the theme, with or -without modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - -* The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -We kindly ask you to only use these themes in an unmodified manner just -for Flask and Flask-related products, not for unrelated projects. If you -like the visual style and want to use it for your own projects, please -consider making some larger changes to the themes (such as changing -font faces, sizes, colors or margins). - -THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/sources/doc/source/_themes/flask_theme_support.py b/sources/doc/source/_themes/flask_theme_support.py deleted file mode 100644 index 33f4744..0000000 --- a/sources/doc/source/_themes/flask_theme_support.py +++ /dev/null @@ -1,86 +0,0 @@ -# flasky extensions. flasky pygments style based on tango style -from pygments.style import Style -from pygments.token import Keyword, Name, Comment, String, Error, \ - Number, Operator, Generic, Whitespace, Punctuation, Other, Literal - - -class FlaskyStyle(Style): - background_color = "#f8f8f8" - default_style = "" - - styles = { - # No corresponding class for the following: - #Text: "", # class: '' - Whitespace: "underline #f8f8f8", # class: 'w' - Error: "#a40000 border:#ef2929", # class: 'err' - Other: "#000000", # class 'x' - - Comment: "italic #8f5902", # class: 'c' - Comment.Preproc: "noitalic", # class: 'cp' - - Keyword: "bold #004461", # class: 'k' - Keyword.Constant: "bold #004461", # class: 'kc' - Keyword.Declaration: "bold #004461", # class: 'kd' - Keyword.Namespace: "bold #004461", # class: 'kn' - Keyword.Pseudo: "bold #004461", # class: 'kp' - Keyword.Reserved: "bold #004461", # class: 'kr' - Keyword.Type: "bold #004461", # class: 'kt' - - Operator: "#582800", # class: 'o' - Operator.Word: "bold #004461", # class: 'ow' - like keywords - - Punctuation: "bold #000000", # class: 'p' - - # because special names such as Name.Class, Name.Function, etc. - # are not recognized as such later in the parsing, we choose them - # to look the same as ordinary variables. - Name: "#000000", # class: 'n' - Name.Attribute: "#c4a000", # class: 'na' - to be revised - Name.Builtin: "#004461", # class: 'nb' - Name.Builtin.Pseudo: "#3465a4", # class: 'bp' - Name.Class: "#000000", # class: 'nc' - to be revised - Name.Constant: "#000000", # class: 'no' - to be revised - Name.Decorator: "#888", # class: 'nd' - to be revised - Name.Entity: "#ce5c00", # class: 'ni' - Name.Exception: "bold #cc0000", # class: 'ne' - Name.Function: "#000000", # class: 'nf' - Name.Property: "#000000", # class: 'py' - Name.Label: "#f57900", # class: 'nl' - Name.Namespace: "#000000", # class: 'nn' - to be revised - Name.Other: "#000000", # class: 'nx' - Name.Tag: "bold #004461", # class: 'nt' - like a keyword - Name.Variable: "#000000", # class: 'nv' - to be revised - Name.Variable.Class: "#000000", # class: 'vc' - to be revised - Name.Variable.Global: "#000000", # class: 'vg' - to be revised - Name.Variable.Instance: "#000000", # class: 'vi' - to be revised - - Number: "#990000", # class: 'm' - - Literal: "#000000", # class: 'l' - Literal.Date: "#000000", # class: 'ld' - - String: "#4e9a06", # class: 's' - String.Backtick: "#4e9a06", # class: 'sb' - String.Char: "#4e9a06", # class: 'sc' - String.Doc: "italic #8f5902", # class: 'sd' - like a comment - String.Double: "#4e9a06", # class: 's2' - String.Escape: "#4e9a06", # class: 'se' - String.Heredoc: "#4e9a06", # class: 'sh' - String.Interpol: "#4e9a06", # class: 'si' - String.Other: "#4e9a06", # class: 'sx' - String.Regex: "#4e9a06", # class: 'sr' - String.Single: "#4e9a06", # class: 's1' - String.Symbol: "#4e9a06", # class: 'ss' - - Generic: "#000000", # class: 'g' - Generic.Deleted: "#a40000", # class: 'gd' - Generic.Emph: "italic #000000", # class: 'ge' - Generic.Error: "#ef2929", # class: 'gr' - Generic.Heading: "bold #000080", # class: 'gh' - Generic.Inserted: "#00A000", # class: 'gi' - Generic.Output: "#888", # class: 'go' - Generic.Prompt: "#745334", # class: 'gp' - Generic.Strong: "bold #000000", # class: 'gs' - Generic.Subheading: "bold #800080", # class: 'gu' - Generic.Traceback: "bold #a40000", # class: 'gt' - } diff --git a/sources/doc/source/_themes/proBlue/LICENSE.txt b/sources/doc/source/_themes/proBlue/LICENSE.txt deleted file mode 100644 index b90e2b5..0000000 --- a/sources/doc/source/_themes/proBlue/LICENSE.txt +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) 2010, Kasey Kelly, Issac Kelly -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name "Kelly Creative Tech" nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/sources/doc/source/_themes/proBlue/README.txt b/sources/doc/source/_themes/proBlue/README.txt deleted file mode 100644 index 51e822c..0000000 --- a/sources/doc/source/_themes/proBlue/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -This is the proBlue theme for Sphinx. - -http://www.kellycreativetech.com/Blog/entry/ProBlue_Sphinx_Theme/ - -You can install it by putting it in your docs directory (next to _static) -then you can set in your conf.py - - html_theme = 'proBlue' - html_theme_path = ["."] \ No newline at end of file diff --git a/sources/doc/source/_themes/proBlue/static/proBlue.css b/sources/doc/source/_themes/proBlue/static/proBlue.css deleted file mode 100644 index e6ac7f6..0000000 --- a/sources/doc/source/_themes/proBlue/static/proBlue.css +++ /dev/null @@ -1,316 +0,0 @@ -/** - * Sphinx stylesheet -- default theme - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -@import url("basic.css"); - -/* -- fontfaces ----------------------------------------------------------- */ -@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,700); -@import url(http://fonts.googleapis.com/css?family=PT+Mono); - -@import url(http://fonts.googleapis.com/css?family=Source+Sans+Pro); -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Open Sans', helvetica, arial, serif; - font-size: 100%; - background-color: #111111; - color: #555555; - margin: 0; - padding: 0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 300px; -} - -hr{ - border: 1px solid #B1B4B6; -} - -div.document { - background-color: #ececec; -} - -div.body { - background-color: #fafafa; - color: #3E4349; - padding: 1em 30px 30px 30px; - font-size: 0.9em; - border-left:1px solid #ddd; -} - -div.footer { - color: #999; - width: 100%; - padding: 9px 0 18px; - text-align: center; - font-size: 60%; - background: #fff; -} - -div.footer a { - color: #444; -} -div.footer a:hover, div.related a:hover { -border-bottom:1px solid #4362b0; -} -div.related { - background-color: #0046c0; - background-image: -moz-linear-gradient(top, #0046c0, #173fa2); /* FF3.6 */ - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #0046c0),color-stop(1, #173fa2)); /* Saf4+, Chrome */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0046c0', EndColorStr='#173fa2'); /* IE6,IE7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#0046c0', EndColorStr='#173fa2')"; /* IE8 */ - line-height: 54px; - color: #ffffff; - text-shadow: 0px 1px 1px rgba(0,0,0,0.4); - font-size: 1.1em; -} - -div.related a { - color: #fff; -} - -div.related .right { - font-size: 0.9em; -} - -div.sphinxsidebar { - font-size: 0.9em; - line-height: 1.5em; - width: 300px -} -div.sphinxsidebar a{ -display:block; -border-bottom:1px solid #ccc; -} - -div.sphinxsidebarwrapper{ - padding: 20px 0; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Source Sans Pro', arial, serif; - color: #222; - font-size: 1.6em; - font-weight: normal; - margin: 0; - padding: 24px 10px 0; - text-shadow: 1px 1px 1px white; -} - -div.sphinxsidebar h3 a { - color: #222; -} - -div.sphinxsidebar p { - color: #888888; - padding: 5px 20px; - margin: 0.5em 0px; -} - -div.sphinxsidebar p.topless { -} - -div.sphinxsidebar ul { - margin: 10px 10px 10px 20px; - padding: 0; -} - -div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points{ - list-style:none; - margin: 10px 0 10px 20px; -} -div.sphinxsidebar ul li{ -font-size:16px; -} - -div.sphinxsidebar ul li li{ -font-size:12px; -} - -div.sphinxsidebar li a { - color: #333; - display:block; - border-bottom:1px solid #ccc; -} -div.sphinxsidebar li a:hover, div.sphinxsidebar a:hover { - border-bottom:1px solid #c07100; -} -div.sphinxsidebar li li a { - color: #555; - border-bottom:1px solid #ddd; -} - -div.sphinxsidebar a:hover { - color: #c07100; -} - -div.sphinxsidebar input { - border: 1px solid #ddd; - border-bottom: 1px solid #bbb; - font-family: 'Open Sans', helvetica, arial, serif; - font-size: 1.3em; - padding: 0.2em 0.4em; - -moz-box-shadow: 0px 0px 3px rgba(0,0,0,0.1); - -webkit-box-shadow: 0px 0px 3px rgba(0,0,0,0.1); - box-shadow: 0px 0px 3px rgba(0,0,0,0.1); -} -div.sphinxsidebar input:focus { - border: 1px solid #bbb; - border-bottom: 1px solid #999; -} -div.sphinxsidebar input[type=text]{ - margin-left: 20px; - padding: 0.23em 0.4em; - color:#333; -} -div.sphinxsidebar input[type=submit]{ - background-color: #0046c0; - background-image: -moz-linear-gradient(top, #0046c0, #173fa2); /* FF3.6 */ - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #0046c0),color-stop(1, #173fa2)); /* Saf4+, Chrome */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0046c0', EndColorStr='#173fa2'); /* IE6,IE7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#0046c0', EndColorStr='#173fa2')"; /* IE8 */ - color:#fff; - cursor: pointer; -} -div.sphinxsidebar input[type=submit]:hover{ - background-color: #0353e3; - background-image: -moz-linear-gradient(top, #0353e3, #063da0); /* FF3.6 */ - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #0353e3),color-stop(1, #063da0)); /* Saf4+, Chrome */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0353e3', EndColorStr='#063da0'); /* IE6,IE7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#0353e3', EndColorStr='#063da0')"; /* IE8 */ -} - -div.sphinxsidebar input[type=submit]:active{ - background-image: -moz-linear-gradient(top, #0b34ce, #052392); /* FF3.6 */ - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #0b34ce),color-stop(1, #052392)); /* Saf4+, Chrome */ - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#0b34ce', EndColorStr='#052392'); /* IE6,IE7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#0b34ce', EndColorStr='#052392')"; /* IE8 */ -} - - - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #0046c0; - text-decoration: none; -} - -a:hover { - color: #c07100; - border-bottom:1px solid #eee; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Source Sans Pro', arial, serif; - font-weight: normal; - color: #000; - margin: 36px 0px 9px 0px; - padding: 5px 0 5px 0px; - text-shadow: 0px 1px 0 white; - border-bottom: 1px solid #ddd; -} - -div.body h1 { margin-top: 0; font-size: 280%; } -div.body h2 { font-size: 200%; } -div.body h3 { font-size: 180%; } -div.body h4 { font-size: 150%; } -div.body h5 { font-size: 130%; } -div.body h6 { font-size: 120%; } - -a.headerlink { - color: #c07100; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c07100; - color: white; -} - -div.body p, div.body dd, div.body li { - line-height: 1.5em; -} -div.body p{ -margin:1.2em 0; -} -div.admonition p.admonition-title + p { - display: inline; -} - -div.highlight{ - background-color: white; -} - -div.note { - background-color: #eeeeee; - border: 1px solid #cccccc; -} - -div.seealso { - background-color: #ffffcc; - border: 1px solid #ffff66; -} - -div.topic { - background-color: #fafafa; - border-width: 0; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #ff6666; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - font: 12px/18px 'PT Mono', arial, serif; - padding: 10px; - background-color: #fcfadd; - border:1px solid #ddd; - color: #222222; - line-height: 1.5em; - font-size: 1.1em; - margin: 1.5em 0 1.5em 0; - -webkit-box-shadow: 0px 0px 4px #d8d8d8; - -moz-box-shadow: 0px 0px 4px #d8d8d8; - box-shadow: 0px 0px 4px #d8d8d8; -} -.pre{ - font-family: 'PT Mono', arial, serif; - font-size: 0.9em; -} - -tt { - color: #222222; - padding: 1px 2px; - font-size: 1.2em; - font-family: 'PT Mono', monospace; -} - -#table-of-contents ul { - padding-left: 2em; -} diff --git a/sources/doc/source/_themes/proBlue/theme.conf b/sources/doc/source/_themes/proBlue/theme.conf deleted file mode 100644 index d083625..0000000 --- a/sources/doc/source/_themes/proBlue/theme.conf +++ /dev/null @@ -1,3 +0,0 @@ -[theme] -inherit = nature -stylesheet = proBlue.css diff --git a/sources/doc/source/admin/configuration.rst b/sources/doc/source/admin/configuration.rst deleted file mode 100644 index 83466b7..0000000 --- a/sources/doc/source/admin/configuration.rst +++ /dev/null @@ -1,461 +0,0 @@ -Configuration -============= - -Configuring AgenDAV requires modifying some PHP text files located in the -``web/config/`` directory. - -The following files are usually found as ``filename.php.template``, so make -a copy of them with the correct file name to make them work. - -.. note:: - - ``ldap.php`` was removed in AgenDAV 1.1.1 - -General configuration (config.php) ----------------------------------- - -``config.php`` file specifies general options about AgenDAV environment. It -loads a set of default option values from ``defaults.php``, but it is -recommended to configure all of the following variables. - -Please, do not modify ``defaults.php``, as it is a file that updates on -every AgenDAV upgrade to avoid problems if you forget any configuration -setting. - -.. confval:: base_url - - Specify here your full public URL to access AgenDAV, adding a trailing - slash. Example:: - - $config['base_url'] = 'https://agendav.host/'; - -.. confval:: show_in_log - - Array of logging levels which will appear in logs. Possible logging - levels are: - - * ``ERROR``: error messages, recommended - * ``INFO``: informational messages, recommended - * ``AUTHERR``: authentication errors - * ``AUTHOK``: successful authentications - * ``INTERNALS``: AgenDAV internal processing actions, not recommended unless - you are having problems or you want to debug AgenDAV - * ``DEBUG``: CodeIgniter internal debug. Do not enable unless you know - what you are doing - - Example:: - - $config['show_in_log']= array('ERROR','INFO','AUTHERR', 'AUTHOK'); - -.. confval:: log_path - - Full path where logs will be created. Add a trailing slash. Example:: - - $config['log_path'] = '/var/log/agendav/'; - - Make sure the user that runs your web server has write permission on that - directory. - -.. confval:: encryption_key - - Random string which will be used to encrypt some cookie values. - -.. confval:: cookie_prefix - - Prefix that should be prepended to your cookie names. Useful if you have - several sites hosted on the same hostname and you want to avoid name - collisions - -.. confval:: cookie_domain - - Domain the cookie will be defined for. Use ``.domain.tld`` or - ``full.host.domain.tld``, depending on what you want. - -.. confval:: cookie_path - - Path the cookie will be defined for. - -.. confval:: cookie_secure - - Create cookies only for use in https environments. Set it TRUE if your - users access AgenDAV via https. - -.. confval:: proxy_ips - - Comma delimited IPs of your proxies, which will make CodeIgniter - framework to trust the HTTP_X_FORWARDED_FOR header. Leave it blank if - your AgenDAV installation isn't being accessed via HTTP proxy. - -.. confval:: site_title - - Title of every page - -.. confval:: logo - - Image filename which will be used as a logo. Has to be a valid filename - placed inside ``web/public/img/`` directory. - -.. confval:: login_page_logo - - Image filename which will be used as a logo only for login page. It's - usually bigger than the normal logo. Has to be a valid filename placed - inside ``web/public/img/`` directory. - - .. versionadded:: 1.2.6 - -.. confval:: footer - - Text to be placed in the footer. - -.. confval:: logout_redirect_to - - When logging out from AgenDAV, the URL the user will be redirected to. - - Can be left empty to redirect user to login page again. - -.. confval:: additional_js - - Array of additional JavaScript files which you will be loading on every - page. They have to be placed inside ``web/public/js`` - -.. confval:: show_public_caldav_url - - Whether to show CalDAV URL links or not in the edit dialog - - .. seealso:: :confval:`public_caldav_url` - -.. confval:: default_language - - Language to be used in AgenDAV interface. - - Have a look at directory ``web/lang`` for a list of available languages. - - Note that the value given to this setting will be used as application - locale with ``setlocale()``. - - .. versionadded:: 1.2 - -.. confval:: default_time_format - - Preferred time format: 12 hours (e.g. 3pm / 2:30am) or 24 hours - (e.g. 15:00 / 2:30). - - Set this option using a **string** (``'12'`` or ``'24'``). - - .. versionadded:: 1.2 - -.. confval:: default_date_format - - Preferred date format to be used inside date fields (only in forms). - Possible values are: - - * ``ymd``: e.g. 2011/10/22 - * ``dmy``: e.g. 22/10/2011 - * ``mdy``: e.g. 10/22/2011 - - .. versionadded:: 1.2 - -.. confval:: format_full_date - - Human readable format for dates, using ``strftime`` syntax - (http://php.net/strftime). Some examples: - - * ``%a %e %B %Y``: Mon 5 March 2012 - * ``%a %e de %B de %Y``: Lun 5 de marzo de 2012 (localized using ``es_ES`` as :confval:`default_language`) - - .. versionadded:: 1.2.5 - -.. confval:: format_column_month - - Sets how the UI calendar should format the column header in month view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_column_week - - Sets how the UI calendar should format the column header in week view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_column_day - - Sets how the UI calendar should format the column header in day view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_column_table - - Sets how the UI calendar should format the column header in table (called *agenda*) view. Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_title_month - - Sets how the UI calendar should format the title in month view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_title_week - - Sets how the UI calendar should format the title in week view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_title_day - - Sets how the UI calendar should format the title in day view. - Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: format_title_table - - Sets how the UI calendar should format the title header in table (called *agenda*) view. Uses `FullCalendar own syntax `_ - - .. versionadded:: 1.2.5 - -.. confval:: default_first_day - - Which day should be considered the first of the week. Starting with 0 - (Sunday), 1 means Monday and so on. - - Use a numerical value, not an integer. - - .. versionadded:: 1.2 - -.. confval:: default_timezone - - Timezone to be used internally. Will be used for recalculating other - timezone dates and hours to be sent to the browser, ignoring browser - configured timezone. - - Make sure you use a valid timezone from http://php.net/timezones - - .. versionadded:: 1.2 - -.. confval:: default_calendar_color - - .. deprecated:: 1.2.3 - - Default background and foreground colors for calendars. Has to be - specified as an associative array. Example:: - - // Default background color: #B5C7EB - // Default foreground (text) color: #000000 - $config['default_calendar_color'] = array('B5C7EB' => '000000'); - -.. confval:: additional_calendar_colors - - .. deprecated:: 1.2.3 - - List of selectable background and foreground color combinations. Specify - them as an associative array. Example:: - - // background color => foreground color - $config['additional_calendar_colors'] = array( - 'FAC5C0' => '000000', - 'B7E3C0' => '000000', - 'CAB2FC' => '000000', - 'F8F087' => '000000', - 'E6D5C1' => '000000', - 'FFC48C' => '000000', - 'DAF5FF' => '000000', - 'C4C4BC' => '000000', - ); - -.. confval:: calendar_colors - - List of selectable background colors. Foreground color will be - automatically calculated depending on the darkness of the color. Specify - them as an array. Example:: - - $config['calendar_colors'] = array( - '9CC4E4', - '3A89C9', - '107FC9', - 'FAC5C0', - 'FF4E50', - 'BD3737', - 'C9DF8A', - '77AB59', - '36802D', - 'F8F087', - 'E6D5C1', - '3E4147', - ); - - -Database configuration (database.php) -------------------------------------- - -``database.php`` contains how to connect to your MySQL database. Just follow -inline comments, it's pretty straight forward. - -CalDAV specific options (caldav.php) ------------------------------------- - -Here you will configure every single aspect of your CalDAV server. - -.. confval:: caldav_url - - .. deprecated:: 1.2.4 - - .. seealso:: :confval:`caldav_principal_url` :confval:`caldav_calendar_url` - -.. confval:: caldav_http_auth_method - - You can specify which HTTP authentication method does your CalDAV server - require. Use any of the cURL ``CURLOPT_HTTPAUTH`` valid values (see - http://www.php.net/manual/en/function.curl-setopt.php), or leave it empty - to make AgenDAV auto-detect which authentication method to use. - - Using the auto-detect feature will slow down requests when using Basic - auth. If you know which authentication method does your server use you're - advised to set the right value on this option. - - Example:: - - // Automatic guess - $config['caldav_http_auth_method'] = null; - - // SabreDAV - $config['caldav_http_auth_method'] = CURLAUTH_DIGEST; - - // DAViCal - $config['caldav_http_auth_method'] = CURLAUTH_BASIC; - - .. versionadded:: 1.2.5 - - -.. confval:: caldav_principal_url - - Used by AgenDAV to generate a principal URL for your CalDAV server. The - placeholder ``%u`` will be replaced by an username. - - Needs a trailing slash. - - Example:: - - // Example 1: DAViCal - $config['caldav_principal_url'] = 'http://10.0.0.12/caldav.php/%u/'; - - // Example 2: SabreDAV - $config['caldav_principal_url'] = 'http://10.0.0.12/calendarserver.php/principals/%u/'; - - // Example 3: Calendar server - $config['caldav_principal_url'] = 'http://10.0.0.12/calendars/users/%u/'; - - Principal URL for user ``my_user`` for example 2 will be: - - http://10.0.12/calendarserver.php/principals/my_user/ - - .. seealso:: :confval:`caldav_calendar_url` - -.. confval:: caldav_calendar_url - - Used by AgenDAV to generate a calendar collection URL or resource URL for - your CalDAV server. The placeholder ``%s`` will be replaced by AgenDAV - with required values. - - Example:: - - // DAViCal - $config['caldav_calendar_url'] = 'http://10.0.0.12/caldav.php/%s/'; - - Resource with UID=aaa0001 on calendar 'work' for user3 will become: - - http://10.0.12/caldav.php/user3/work/aaa0001/ - - Calendar 'test' for user1 will become: - - http://10.0.12/caldav.php/user3/test/ - - .. seealso:: :confval:`caldav_principal_url` - -.. confval:: public_caldav_url - - The URL that will be shown to users if :confval:`show_public_caldav_url` is - enabled. It's not used for internal connections. Placeholder ``%s`` will - be replaced by current username and calendar. - - Needs a trailing slash. - - Example:: - - $config['public_caldav_url'] = 'https://public.caldav.tld/caldav.php/%s/'; - - Will become for user ``user2`` and calendar ``myhomecalendar``: - - https://public.caldav.tld/caldav.php/user2/myhomecalendar/ - -.. confval:: enable_calendar_sharing - - Enables an option to share calendars between users. - - Note that calendar sharing requires full WebDAV ACL support on your - CalDAV server. Some servers, such as SabreDAV (at least on current - release, 1.5.6), don't support them, so you should set this option - to FALSE if your server can't handle ACLs. - -.. confval:: owner_permissions - - List of DAV permissions used for the calendar owner when sharing a - calendar. As DAV ACLs are used, when editing a calendar sharing options a - full ACL has to be built with the following structure: - - * Permissions given to the owner (this option) - * Permissions given to users with read-only profile (:confval:`read_profile_permissions`) - * Permissions given to users with read and write profile (:confval:`read_write_profile_permissions`) - * Permissions given to the rest of users (:confval:`default_permissions`) - - Please, refer to your CalDAV server documentation to know which - permissions does it support. - - For DAViCal you can follow `Permissions page on DAViCal wiki - `_. Default values of this option - will work all right for DAViCal. - -.. confval:: share_permissions - - .. deprecated:: 1.2.5 - - .. seealso:: See :confval:`read_profile_permissions` and - :confval:`read_write_profile_permissions` - -.. confval:: read_profile_permissions - - List of DAV permissions used for users given read-only permission on a - calendar. - - .. versionadded:: 1.2.5 - -.. confval:: read_write_profile_permissions - - List of DAV permissions used for users given read and write permission on - a calendar. - - .. versionadded:: 1.2.5 - -.. confval:: default_permissions - - List of DAV permissions used for users which are not owner neither - granted users when some user shares a calendar with other ones. - - Please, refer to your CalDAV server documentation to know which - permissions does it support. - - Default value lets users just to make free/busy queries in DAViCal. - -Other configuration files -------------------------- - -Advanced options (advanced.php) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This file should be kept untouched unless you know what you are trying to -modify. It contains several options that make AgenDAV work by default. diff --git a/sources/doc/source/admin/index.rst b/sources/doc/source/admin/index.rst deleted file mode 100644 index cbac376..0000000 --- a/sources/doc/source/admin/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -Installation and configuration -============================== - -.. toctree:: - :numbered: - - installation - upgrading - configuration - troubleshooting diff --git a/sources/doc/source/admin/installation.rst b/sources/doc/source/admin/installation.rst deleted file mode 100644 index b0428dd..0000000 --- a/sources/doc/source/admin/installation.rst +++ /dev/null @@ -1,134 +0,0 @@ -Installation -============ - -In this section you will be able to install AgenDAV. - -Prerequisites -------------- - -AgenDAV |release| requires the following software to be installed: - -* A CalDAV server (developed mainly with `DAViCal `_ -* A web server -* PHP >= 5.3.0 -* PHP mbstring extension -* PHP cURL extension -* MySQL > 5.1 or PostgreSQL >= 8.1 - -Downloading AgenDAV and uncompressing -------------------------------------- - -AgenDAV |release| can be obtained at `AgenDAV official webpage -`_, but you can use GitHub to download latest version. -Have a look at ``_. - -Uncompress it using ``tar``:: - - $ tar xzf adobo-agendav-...tar.gz - $ cd adobo-agendav-.../ - -Database and tables -------------------- - -AgenDAV requires a database to store some information. Supported RDBMs are -MySQL and PostgreSQL. - -First of all you have to create a user and a database for that user. - -Second, you'll have to create initial AgenDAV tables using provided SQL -files inside ``sql/`` directory. - -Last step is applying database upgrades to initial database tables. - -Steps 1&2: MySQL -**************** -Create an user in MySQL like this:: - - $ mysql --default-character-set=utf8 -uroot -p - Enter password: - [...] - mysql> GRANT ALL PRIVILEGES ON agendav.* TO agendav@localhost IDENTIFIED BY 'yourpassword' - mysql> CREATE DATABASE agendav CHARACTER SET utf8 COLLATE utf8_general_ci; - mysql> FLUSH PRIVILEGES; - mysql> ^D - -And then run the initial schema creation file:: - - $ mysql --default-character-set=utf8 -uagendav \ - -p agendav < sql/mysql.schema.sql - Enter password: - $ - -Note the UTF8 parts on the previous commands. If you don't specify them you -will have some issues with special characters. - -Steps 1&2: PostgreSQL -********************* - -Use the special ``postgres`` system user to manage your installation. You -can add a new user and a new database the following way:: - - # su postgres - $ psql - postgres=# CREATE USER agendav WITH PASSWORD 'somepassword'; - postgres=# CREATE DATABASE agendav ENCODING 'UTF8'; - postgres=# GRANT ALL PRIVILEGES ON DATABASE agendav TO agendav; - postgres=# \q - $ exit - -Then you have to edit the file ``pg_hba.conf``, which is usually located at -``/var/lib/pgsql/``. Add the following line before other definitions:: - - # TYPE DATABASE USER CIDR-ADDRESS METHOD - local agendav agendav trust - -After that just restart PostgreSQL and load the initial schema:: - - $ psql -U agendav agendav < sql/pgsql.schema.sql - - -Step 3: Apply latest database schema -************************************ - -Initial database structure created with `*.sql` files provides only a base -structure for AgenDAV. It has to be modified to apply latest release -changes. To do this, follow instructions on :ref:`dbupgrade`. - - -Configuring Apache web server ------------------------------ - -Apache has to be configured to point to ``web/public`` directory, using its -own VirtualHost or just an Alias. - -Example using a dedicated virtualhost:: - - - ServerAdmin admin@email.host - DocumentRoot /path/to/agendav/web/public - ServerName agendav.host - ErrorLog logs/agendav_error_log - CustomLog logs/agendav_access_log common - - -Example using the Alias directive:: - - Alias /agendav /path/to/agendav/web/public - -.. note:: - Make sure that you have the following PHP settings *disabled*: - - * ``magic_quotes_gpc`` - * ``magic_quotes_runtime`` - -Other web servers -***************** - -AgenDAV should work on all other web server software if they support PHP -scripts, but this is untested. - -Configure AgenDAV ------------------ - -Now you can proceed to configure AgenDAV following the :doc:`configuration` -section. diff --git a/sources/doc/source/admin/troubleshooting.rst b/sources/doc/source/admin/troubleshooting.rst deleted file mode 100644 index 113e254..0000000 --- a/sources/doc/source/admin/troubleshooting.rst +++ /dev/null @@ -1,83 +0,0 @@ -Troubleshooting AgenDAV -======================= - -If you are having problems with AgenDAV, check you have met all the -requisites and search AgenDAV logs/web server logs for error lines. - -You can write to `AgenDAV general list -`_ asking for help. Make -sure you include the following information: - -* Software details (OS, PHP version, web server you're using, CalDAV server) -* Clear description of your problem -* Important log lines - -Try the following before writing: - -Check configuration and installation environment ------------------------------------------------- - -AgenDAV ships, since version 1.2.4, a simple script that checks installation -environment and configuration files to make sure you meet all basic -requisites. - -To run it, edit file :file:`web/public/configtest.php` to set the constant -``ENABLE_SETUP_TESTS`` to ``TRUE``. - -Once you save the file with that change, point your browser to -``http://host/path/agendav/configtest.php`` and look for red cells. You'll -find some suggestions to fix the problems. - -Remember to set ``ENABLE_SETUP_TESTS`` back to ``FALSE`` inside -``configtest.php``. - -More verbose logs ------------------ - -Edit ``web/config/config.php`` and add the value ``INTERNALS`` inside -``show_in_log`` variable. For example:: - - $config['show_in_log']= array('ERROR','INFO','AUTHERR', 'AUTHOK','INTERNALS'); - -Check AgenDAV logs (make sure you have Check AgenDAV logs (make sure you -have a valid path configured in :confval:`log_path` and the user which runs -the webserver has writing access to it) and your webserver logs. - -You can add the value ``DEBUG`` to make CodeIgniter (the PHP framework) log -some more lines. - -Show errors ------------ - -You can switch to ``development`` environment to force PHP to print errors -on generated pages. By default AgenDAV is configured to hide errors to -users. - -To achieve that just edit the file ``web/public/index.php`` and replace the -following line:: - - define('ENVIRONMENT', 'production'); - -with:: - - define('ENVIRONMENT', 'development'); - - -Capture traffic ---------------- - -Sometimes CalDAV servers send unexpected data to AgenDAV or AgenDAV tries to -do an unsupported operation on your CalDAV server. When this happens it's a -good idea to run a traffic capture tool (like ``tcpdump`` or ``Wireshark``) -to see what's happening under the hood. This is only possible if you use -plain HTTP on your AgenDAV<->CalDAV server communication. - -Debug your browser status -------------------------- - -Most browsers can show you network activity and JavaScript errors using its -own interfaces. They can be very handful if you happen to find a bug on -AgenDAV. Some examples of browser which include this support are: - -* Mozilla Firefox with Firebug extension -* Google Chrome/Chromium with Developer Tools (no addon required) diff --git a/sources/doc/source/admin/upgrading.rst b/sources/doc/source/admin/upgrading.rst deleted file mode 100644 index 9e42163..0000000 --- a/sources/doc/source/admin/upgrading.rst +++ /dev/null @@ -1,74 +0,0 @@ -.. _upgrading: - -Upgrading -========= - -AgenDAV upgrades can be split into two simple steps. - -Before starting this process, make sure you have a backup of your current -AgenDAV directory, specially the ``web/config/`` directory, and dump your -database schema and contents. - -Please, do not continue unless you have both backups. - -Read all the :ref:`releasenotes` from the version you were using -to current release, because some configuration files may have changed. Apply -those changes after updating the files from AgenDAV. - -.. _filesupgrade: - -Files upgrade -------------- - -a) Updating from tar.gz file -**************************** - -You can replace the whole AgenDAV directory with the new files, but it's -recommended to keep your old folder with a different name (e.g. -``agendav_old/``). You'll need it to copy back your configuration files. - -After downloading the new tar.gz file and uncompressing it, copy your -configuration files from the old directory:: - - $ cd agendav_old/web/config/ - $ cp -a advanced.php caldav.php config.php database.php \ - /path/to/new/agendav/web/config/ - - -b) Updating from git -******************** - -If you downloaded AgenDAV from the git repository at GitHub then you can -checkout latest stable release from the ``master`` branch, or an specific -version using its tag. - -Just pull latest changes and checkout the release you want. For example, -checking out AgenDAV 1.2.5 can be achieved with:: - - $ git pull - [...] - $ git checkout 1.2.5 - -.. _dbupgrade: - -Database upgrade ----------------- - -.. note:: - - AgenDAV <= 1.2.5.1 have a bug that makes database upgrades to fail, - complaining about a missing ``migration_lang.php`` file. If you have - AgenDAV configured to use a language other than English, set - :confval:`default_language` to ``en`` before running ``agendav dbupdate`` - -The database upgrade process included in AgenDAV since 1.2.5 lets you -apply the latest schema changes without having to deal with ``.sql`` files -and with no need to check which files you should apply to your current -version. - -Just use the provided ``bin/agendavcli`` script this way:: - - $ ./bin/agendavcli dbupdate - - - diff --git a/sources/doc/source/agendav_160px.png b/sources/doc/source/agendav_160px.png deleted file mode 100644 index d4b52ba..0000000 Binary files a/sources/doc/source/agendav_160px.png and /dev/null differ diff --git a/sources/doc/source/conf.py b/sources/doc/source/conf.py deleted file mode 100644 index fad34e7..0000000 --- a/sources/doc/source/conf.py +++ /dev/null @@ -1,223 +0,0 @@ -# -*- coding: utf-8 -*- -# -# AgenDAV documentation build configuration file, created by -# sphinx-quickstart on Mon Sep 12 13:51:17 2011. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'AgenDAV' -copyright = u'2011-2012, Jorge López Pérez' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '1.2.6.2' -# The full version, including alpha/beta/rc tags. -release = '1.2.6.2' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -highlight_language = 'php' - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -sys.path.append(os.path.abspath('_themes')) -html_theme_path = ['_themes'] - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'proBlue' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -html_logo = 'agendav_160px.png' - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -html_show_sourcelink = False - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'AgenDAVdoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' - -# The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'AgenDAV.tex', u'AgenDAV Documentation', - u'Jorge López Pérez', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'agendav', u'AgenDAV Documentation', - [u'Jorge López Pérez'], 1) -] - -def setup(app): - app.add_object_type('confval', 'confval', - objname='configuration value', - indextemplate='pair: %s; configuration value') diff --git a/sources/doc/source/index.rst b/sources/doc/source/index.rst deleted file mode 100644 index 55e8899..0000000 --- a/sources/doc/source/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. AgenDAV documentation master file, created by - sphinx-quickstart on Mon Sep 12 13:51:17 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -AgenDAV |release| documentation -=============================== - -AgenDAV is a CalDAV web client which features an AJAX interface to allow -users to manage their own calendars and shared ones. It's released under -the GPLv3 license. - -Contents: - -.. toctree:: - :maxdepth: 2 - - admin/index - translations - releasenotes diff --git a/sources/doc/source/releasenotes.rst b/sources/doc/source/releasenotes.rst deleted file mode 100644 index e1dfef5..0000000 --- a/sources/doc/source/releasenotes.rst +++ /dev/null @@ -1,171 +0,0 @@ -.. _releasenotes: - -Release notes -============= - -.. _v1.2.6.2: - - -1.2.6.1 and 1.2.6.2 (2012-10-15) --------------------------------- - -This release just fixes a problem with some timezones which have three -components, such as America/Argentina/Cordoba. AgenDAV 1.2.6 refused to parse calendars -that contained events with those kind of timezones. - -.. _v1.2.6: - - -1.2.6 (2012-09-03) ------------------- - -* This release requires neither configuration changes nor DB schema updates. -* Reminders feature has been added. Reminders will be attached to events, but this version of AgenDAV is not capable of showing popups for them yet. Other CalDAV clients, such as smartphones and desktop applications, will understand them. -* A new ``log_create_permissions`` option has been added to ``advanced.php`` configuration file. Default is ``0640`` - -.. _v1.2.5.1: - -1.2.5.1 (2012-06-11) --------------------- - -.. note:: - - This version has a bug that will make :ref:`dbupgrade` to fail if you - have AgenDAV configured to use a language other than English. Please, set - :confval:`default_language` to ``en`` before running ``agendav - dbupdate`` - -* This release fixes some invalid SQL queries included in the database update process - - -.. _v1.2.5: - -1.2.5 (2012-06-07) ------------------- - -* DB schema needs to be updated, but a new database upgrade process is now available. No more ``*.sql`` files, just read :ref:`dbupgrade` section. - -* This release requires PHP cURL support. Make sure your PHP installation - has the cURL module enabled - -* Now you can share a calendar in read-only mode. You're advised to create a - new ``caldav.php`` configuration file using the provided template - -* Date and time format options have been moved inside ``config.php``. Prior - to this release they were set inside lang files, which didn't make much - sense. Have a look at new options :confval:`format_full_date`, - :confval:`format_column_month`, :confval:`format_column_week`, - :confval:`format_column_day`, :confval:`format_column_table`, - :confval:`format_title_month`, :confval:`format_title_week`, - :confval:`format_title_day` and :confval:`format_title_table` - -* Translations are now managed using `Transifex `_. Note that default language has been renamed from ``en_US`` to ``en``, as I think it's a neutral English - -.. _v1.2.4: - -1.2.4 (2012-01-16) ------------------- - -This release requires no database changes. Contains a fix for localization -support for IE7, and lots of aesthetical changes, besides upgraded libraries -(jQuery 1.7.1, qTip2 and iCalcreator). Session cookies are now smaller and -contain only session identifiers. - -* You have to create a new ``caldav.php`` config file using the provided template (``caldav.php.template``) because :confval:`caldav_url` has been split into two new configuration parameters. Some CalDAV servers use different URLs for principals and calendar collections/resources, and the previous model didn't work with them: - - * :confval:`caldav_principal_url` will be used to generate principal URLs - * :confval:`caldav_calendar_url` will be used to generate calendar and resource URLs - -* A new :confval:`enable_calendar_sharing` setting has been added to ``caldav.php`` to disable calendar sharing for those servers that don't support WebDAV ACLs - -* ``advanced.php`` configuration file has been updated, make sure you don't overwrite your own changes. - -* Note that required PHP version is 5.3.0 and not 5.2, there was an error on the requisites list. - -* A setup test script has been included to check if your system meets some basic requisites. Follow the :doc:`admin/troubleshooting` section for more details. - -.. _v1.2.3: - -1.2.3 (2011-11-08) ------------------- - -This release fixes some bugs with am/pm indicators under some circumstances, -editing recurring events, include_path problems and other bugs. - -It also introduces dynamic text color calculation and new default calendar -colors, so it's recommended to remove the following settings from -``config.php``: - -* :confval:`default_calendar_color`: now the first color from :confval:`calendar_colors` is used -* :confval:`additional_calendar_colors`: this option has been replaced by :confval:`calendar_colors` - -Copy :confval:`calendar_colors` definition from ``config.php.template`` to your ``config.php`` - -This release requires no database upgrades. - -.. _v1.2.2: - -1.2.2 (2011-10-25) ------------------- - -This release fixes important issues with recurrent events. It also fixes -the am/pm indicator on times. - -It requires no database upgrades. - -.. _v1.2.1: - -1.2.1 (2011-10-24) ------------------- - -This release mainly fixes issues with timezone differences and Daylight Save -Time problems. - -Also updates iCalcreator library to latest version (2.10.15) and qTip2. - -It requires no database upgrades. - - -.. _v1.2: - -1.2 (2011-10-17) ----------------- - -* DB schema needs to be altered. UTF8 wasn't being used by default, and - sessions table wasn't using InnoDB. Apply the changes on - ``sql/changes/1.1.1_to_1.2.mysql``, which are the following:: - - ALTER DATABASE agendav CHARACTER SET utf8 COLLATE utf8_general_ci; - ALTER TABLE sessions CONVERT TO CHARACTER SET utf8; - ALTER TABLE sessions ENGINE InnoDB; - ALTER TABLE shared CONVERT TO CHARACTER SET utf8; - -* Main configuration file (``config.php``) has been completely **rewritten** - to make it easier to write. Please, use the provided ``config.php.template`` - as the base for a new ``config.php`` - -* Interface translation and timezone configuration is now possible in - AgenDAV. Please, make sure you set correct values on ``config.php`` - -* AgenDAV has lots of corrections and fixes. See the ``CHANGELOG`` - -.. _v1.1.1: - -1.1.1 (2011-09-24) ------------------- - -* Fix DB schema. Wasn't properlty updated on sql/schema.sql, which - caused a problem with sessions - - To correct this issue without completely recreating your current database, - run the following two queries:: - - CREATE INDEX last_activity_idx ON sessions(last_activity); - ALTER TABLE sessions MODIFY user_agent VARCHAR(120); - -* Remove LDAP dependency. AgenDAV now authenticates against CalDAV - server. - - Before this change, AgenDAV authenticated users at first using LDAP, and - then your CalDAV server had to authenticate them again. With this change, - AgenDAV completely relies on your CalDAV server. diff --git a/sources/doc/source/translations.rst b/sources/doc/source/translations.rst deleted file mode 100644 index 97aa895..0000000 --- a/sources/doc/source/translations.rst +++ /dev/null @@ -1,31 +0,0 @@ -Translating AgenDAV -=================== - -AgenDAV translation system is based on labels which get translated into -full sentences/paragraphs. They can contain placeholders which get replaced -by the system depending on the context. - -How to add a translation ------------------------- -1. Access `AgenDAV project in Transifex - `_ and use the - *Create language_* to add the missing language. You'll have to wait - until I approve the request. Once you have it created, you'll be able - to use Transifex interface to translate AgenDAV strings. - -2. Search the corresponding `CodeIgniter translation - `_ and download its zip file. - -3. Uncompress the CodeIgniter translation into ``web/application/language`` - -4. Edit ``web/config/languages.php`` and add a new entry like this:: - - $config['lang_rels']['fr_FR'] = array( - 'codeigniter' => 'french', - ); - - This supposes the language file you downloadad for CodeIgniter resulted - in a directory called ``french/`` - -5. You're done! Set :confval:`default_language` to your new language name -(``fr_FR`` in our example) diff --git a/sources/libs/awl/AWLUtilities.php b/sources/libs/awl/AWLUtilities.php deleted file mode 100644 index 6c3cafb..0000000 --- a/sources/libs/awl/AWLUtilities.php +++ /dev/null @@ -1,543 +0,0 @@ - -* @copyright Catalyst IT Ltd, Morphoss Ltd -* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU LGPL version 3 or later -*/ - -if ( !function_exists('dbg_error_log') ) { - /** - * Writes a debug message into the error log using printf syntax. If the first - * parameter is "ERROR" then the message will _always_ be logged. - * Otherwise, the first parameter is a "component" name, and will only be logged - * if $c->dbg["component"] is set to some non-null value. - * - * If you want to see every log message then $c->dbg["ALL"] can be set, to - * override the debugging status of the individual components. - * - * @var string $component The component to identify itself, or "ERROR", or "LOG:component" - * @var string $format A format string for the log message - * @var [string $parameter ...] Parameters for the format string. - */ - function dbg_error_log() { - global $c; - $args = func_get_args(); - $type = "DBG"; - $component = array_shift($args); - if ( substr( $component, 0, 3) == "LOG" ) { - // Special escape case for stuff that always gets logged. - $type = 'LOG'; - $component = substr($component,4); - } - else if ( $component == "ERROR" ) { - $type = "***"; - } - else if ( isset($c->dbg["ALL"]) ) { - $type = "ALL"; - } - else if ( !isset($c->dbg[strtolower($component)]) ) return; - - $argc = func_num_args(); - if ( 2 <= $argc ) { - $format = array_shift($args); - } - else { - $format = "%s"; - } - @error_log( $c->sysabbr.": $type: $component:". vsprintf( $format, $args ) ); - } -} - - - -if ( !function_exists('apache_request_headers') ) { - /** - * Compatibility so we can use the apache function name and still work with CGI - * @package awl - */ - eval(' - function apache_request_headers() { - foreach($_SERVER as $key=>$value) { - if (substr($key,0,5)=="HTTP_") { - $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5))))); - $out[$key]=$value; - } - } - return $out; - } - '); -} - - - -if ( !function_exists('dbg_log_array') ) { - /** - * Function to dump an array to the error log, possibly recursively - * - * @var string $component Which component should this log message identify itself from - * @var string $name What name should this array dump identify itself as - * @var array $arr The array to be dumped. - * @var boolean $recursive Should the dump recurse into arrays/objects in the array - */ - function dbg_log_array( $component, $name, $arr, $recursive = false ) { - if ( !isset($arr) || (gettype($arr) != 'array' && gettype($arr) != 'object') ) { - dbg_error_log( $component, "%s: array is not set, or is not an array!", $name); - return; - } - foreach ($arr as $key => $value) { - dbg_error_log( $component, "%s: >>%s<< = >>%s<<", $name, $key, - (gettype($value) == 'array' || gettype($value) == 'object' ? gettype($value) : $value) ); - if ( $recursive && (gettype($value) == 'array' || (gettype($value) == 'object' && "$key" != 'self' && "$key" != 'parent') ) ) { - dbg_log_array( $component, "$name"."[$key]", $value, $recursive ); - } - } - } -} - - - -if ( !function_exists("session_simple_md5") ) { - /** - * Make a plain MD5 hash of a string, identifying the type of hash it is - * - * @param string $instr The string to be salted and MD5'd - * @return string The *MD5* and the MD5 of the string - */ - function session_simple_md5( $instr ) { - global $c; - if ( isset($c->dbg['password']) ) dbg_error_log( "Login", "Making plain MD5: instr=$instr, md5($instr)=".md5($instr) ); - return ( '*MD5*'. md5($instr) ); - } -} - - - -if ( !function_exists("session_salted_md5") ) { - /** - * Make a salted MD5 string, given a string and (possibly) a salt. - * - * If no salt is supplied we will generate a random one. - * - * @param string $instr The string to be salted and MD5'd - * @param string $salt Some salt to sprinkle into the string to be MD5'd so we don't get the same PW always hashing to the same value. - * @return string The salt, a * and the MD5 of the salted string, as in SALT*SALTEDHASH - */ - function session_salted_md5( $instr, $salt = "" ) { - if ( $salt == "" ) $salt = substr( md5(rand(100000,999999)), 2, 8); - global $c; - if ( isset($c->dbg['password']) ) dbg_error_log( "Login", "Making salted MD5: salt=$salt, instr=$instr, md5($salt$instr)=".md5($salt . $instr) ); - return ( sprintf("*%s*%s", $salt, md5($salt . $instr) ) ); - } -} - - - -if ( !function_exists("session_salted_sha1") ) { - /** - * Make a salted SHA1 string, given a string and (possibly) a salt. PHP5 only (although it - * could be made to work on PHP4 (@see http://www.openldap.org/faq/data/cache/347.html). The - * algorithm used here is compatible with OpenLDAP so passwords generated through this function - * should be able to be migrated to OpenLDAP by using the part following the second '*', i.e. - * the '{SSHA}....' part. - * - * If no salt is supplied we will generate a random one. - * - * @param string $instr The string to be salted and SHA1'd - * @param string $salt Some salt to sprinkle into the string to be SHA1'd so we don't get the same PW always hashing to the same value. - * @return string A *, the salt, a * and the SHA1 of the salted string, as in *SALT*SALTEDHASH - */ - function session_salted_sha1( $instr, $salt = "" ) { - if ( $salt == "" ) $salt = substr( str_replace('*','',base64_encode(sha1(rand(100000,9999999),true))), 2, 9); - global $c; - if ( isset($c->dbg['password']) ) dbg_error_log( "Login", "Making salted SHA1: salt=$salt, instr=$instr, encoded($instr$salt)=".base64_encode(sha1($instr . $salt, true).$salt) ); - return ( sprintf("*%s*{SSHA}%s", $salt, base64_encode(sha1($instr.$salt, true) . $salt ) ) ); - } -} - - -if ( !function_exists("session_validate_password") ) { - /** - * Checks what a user entered against the actual password on their account. - * @param string $they_sent What the user entered. - * @param string $we_have What we have in the database as their password. Which may (or may not) be a salted MD5. - * @return boolean Whether or not the users attempt matches what is already on file. - */ - function session_validate_password( $they_sent, $we_have ) { - if ( preg_match('/^\*\*.+$/', $we_have ) ) { - // The "forced" style of "**plaintext" to allow easier admin setting - return ( "**$they_sent" == $we_have ); - } - - if ( preg_match('/^\*(.+)\*{[A-Z]+}.+$/', $we_have, $regs ) ) { - if ( function_exists("session_salted_sha1") ) { - // A nicely salted sha1sum like "**{SSHA}" - $salt = $regs[1]; - $sha1_sent = session_salted_sha1( $they_sent, $salt ) ; - return ( $sha1_sent == $we_have ); - } - else { - dbg_error_log( "ERROR", "Password is salted SHA-1 but you are using PHP4!" ); - echo << - -Salted SHA1 Password format not supported with PHP4 - - -

Salted SHA1 Password format not supported with PHP4

-

At some point you have used PHP5 to set the password for this user and now you are - using PHP4. You will need to assign a new password to this user using PHP4, or ensure - you use PHP5 everywhere (recommended).

-

AWL has now switched to using salted SHA-1 passwords by preference in a format - compatible with OpenLDAP.

- - -EOERRMSG; - exit; - } - } - - if ( preg_match('/^\*MD5\*.+$/', $we_have, $regs ) ) { - // A crappy unsalted md5sum like "*MD5*" - $md5_sent = session_simple_md5( $they_sent ) ; - return ( $md5_sent == $we_have ); - } - else if ( preg_match('/^\*(.+)\*.+$/', $we_have, $regs ) ) { - // A nicely salted md5sum like "**" - $salt = $regs[1]; - $md5_sent = session_salted_md5( $they_sent, $salt ) ; - return ( $md5_sent == $we_have ); - } - - // Anything else is bad - return false; - - } -} - - - -if ( !function_exists("replace_uri_params") ) { - /** - * Given a URL (presumably the current one) and a parameter, replace the value of parameter, - * extending the URL as necessary if the parameter is not already there. - * @param string $uri The URI we will be replacing parameters in. - * @param array $replacements An array of replacement pairs array( "replace_this" => "with this" ) - * @return string The URI with the replacements done. - */ - function replace_uri_params( $uri, $replacements ) { - $replaced = $uri; - foreach( $replacements AS $param => $new_value ) { - $rxp = preg_replace( '/([\[\]])/', '\\\\$1', $param ); // Some parameters may be arrays. - $regex = "/([&?])($rxp)=([^&]+)/"; - dbg_error_log("core", "Looking for [%s] to replace with [%s] regex is %s and searching [%s]", $param, $new_value, $regex, $replaced ); - if ( preg_match( $regex, $replaced ) ) - $replaced = preg_replace( $regex, "\$1$param=$new_value", $replaced); - else - $replaced .= "&$param=$new_value"; - } - if ( ! preg_match( '/\?/', $replaced ) ) { - $replaced = preg_replace("/&(.+)$/", "?\$1", $replaced); - } - $replaced = str_replace("&", "--AmPeRsAnD--", $replaced); - $replaced = str_replace("&", "&", $replaced); - $replaced = str_replace("--AmPeRsAnD--", "&", $replaced); - dbg_error_log("core", "URI <<$uri>> morphed to <<$replaced>>"); - return $replaced; - } -} - - -if ( !function_exists("uuid") ) { -/** - * Generates a Universally Unique IDentifier, version 4. - * - * RFC 4122 (http://www.ietf.org/rfc/rfc4122.txt) defines a special type of Globally - * Unique IDentifiers (GUID), as well as several methods for producing them. One - * such method, described in section 4.4, is based on truly random or pseudo-random - * number generators, and is therefore implementable in a language like PHP. - * - * We choose to produce pseudo-random numbers with the Mersenne Twister, and to always - * limit single generated numbers to 16 bits (ie. the decimal value 65535). That is - * because, even on 32-bit systems, PHP's RAND_MAX will often be the maximum *signed* - * value, with only the equivalent of 31 significant bits. Producing two 16-bit random - * numbers to make up a 32-bit one is less efficient, but guarantees that all 32 bits - * are random. - * - * The algorithm for version 4 UUIDs (ie. those based on random number generators) - * states that all 128 bits separated into the various fields (32 bits, 16 bits, 16 bits, - * 8 bits and 8 bits, 48 bits) should be random, except : (a) the version number should - * be the last 4 bits in the 3rd field, and (b) bits 6 and 7 of the 4th field should - * be 01. We try to conform to that definition as efficiently as possible, generating - * smaller values where possible, and minimizing the number of base conversions. - * - * @copyright Copyright (c) CFD Labs, 2006. This function may be used freely for - * any purpose ; it is distributed without any form of warranty whatsoever. - * @author David Holmes - * - * @return string A UUID, made up of 32 hex digits and 4 hyphens. - */ - - function uuid() { - - // The field names refer to RFC 4122 section 4.1.2 - - return sprintf('%04x%04x-%04x-%03x4-%04x-%04x%04x%04x', - mt_rand(0, 65535), mt_rand(0, 65535), // 32 bits for "time_low" - mt_rand(0, 65535), // 16 bits for "time_mid" - mt_rand(0, 4095), // 12 bits before the 0100 of (version) 4 for "time_hi_and_version" - bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)), - // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res" - // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d) - // 8 bits for "clk_seq_low" - mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535) // 48 bits for "node" - ); - } -} - -if ( !function_exists("translate") ) { - require("Translation.php"); -} - - if ( !function_exists("clone") && version_compare(phpversion(), '5.0') < 0) { - /** - * PHP5 screws with the assignment operator changing so that $a = $b means that - * $a becomes a reference to $b. There is a clone() that we can use in PHP5, so - * we have to emulate that for PHP4. Bleargh. - */ - eval( 'function clone($object) { return $object; }' ); -} - -if ( !function_exists("quoted_printable_encode") ) { - /** - * Process a string to fit the requirements of RFC2045 section 6.7. Note that - * this works, but replaces more characters than the minimum set. For readability - * the spaces aren't encoded as =20 though. - */ - function quoted_printable_encode($string) { - return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",str_replace("%20"," ",rawurlencode($string)))); - } -} - - -if ( !function_exists("check_by_regex") ) { - /** - * Verify a value is OK by testing a regex against it. If it is an array apply it to - * each element in the array recursively. If it is an object we don't mess - * with it. - */ - function check_by_regex( $val, $regex ) { - if ( is_null($val) ) return null; - switch( $regex ) { - case 'int': $regex = '#^\d+$#'; break; - } - if ( is_array($val) ) { - foreach( $val AS $k => $v ) { - $val[$k] = check_by_regex($v,$regex); - } - } - else if ( ! is_object($val) ) { - if ( preg_match( $regex, $val, $matches) ) { - $val = $matches[0]; - } - else { - $val = ''; - } - } - return $val; - } -} - - -if ( !function_exists("param_to_global") ) { - /** - * Convert a parameter to a global. We first look in _POST and then in _GET, - * and if they passed in a bunch of valid characters, we will make sure the - * incoming is cleaned to only match that set. - * - * @param string $varname The name of the global variable to put the answer in - * @param string $match_regex The part of the parameter matching this regex will be returned - * @param string $alias1 An alias for the name that we should look for first. - * @param " ... More aliases, in the order which they should be examined. $varname will be appended to the end. - */ - function param_to_global( ) { - $args = func_get_args(); - - $varname = array_shift($args); - $GLOBALS[$varname] = null; - - $match_regex = null; - $argc = func_num_args(); - if ( $argc > 1 ) { - $match_regex = array_shift($args); - } - - $args[] = $varname; - foreach( $args AS $k => $name ) { - if ( isset($_POST[$name]) ) { - $result = $_POST[$name]; - break; - } - else if ( isset($_GET[$name]) ) { - $result = $_GET[$name]; - break; - } - } - if ( !isset($result) ) return null; - - if ( isset($match_regex) ) { - $result = check_by_regex( $result, $match_regex ); - } - - $GLOBALS[$varname] = $result; - return $result; - } -} - - -if ( !function_exists("get_fields") ) { - /** - * @var array $_AWL_field_cache is a cache of the field names for a table - */ - $_AWL_field_cache = array(); - - /** - * Get the names of the fields for a particular table - * @param string $tablename The name of the table. - * @return array of string The public fields in the table. - */ - function get_fields( $tablename ) { - global $_AWL_field_cache; - - if ( !isset($_AWL_field_cache[$tablename]) ) { - dbg_error_log( "core", ":get_fields: Loading fields for table '$tablename'" ); - $qry = new AwlQuery(); - $db = $qry->GetConnection(); - $qry->SetSQL($db->GetFields($tablename)); - $qry->Exec("core"); - $fields = array(); - while( $row = $qry->Fetch() ) { - $fields[$row->fieldname] = $row->typename . ($row->precision >= 0 ? sprintf('(%d)',$row->precision) : ''); - } - $_AWL_field_cache[$tablename] = $fields; - } - return $_AWL_field_cache[$tablename]; - } -} - - -if ( !function_exists("force_utf8") ) { - function define_byte_mappings() { - global $byte_map, $nibble_good_chars; - - # Needed for using Grant McLean's byte mappings code - $ascii_char = '[\x00-\x7F]'; - $cont_byte = '[\x80-\xBF]'; - - $utf8_2 = '[\xC0-\xDF]' . $cont_byte; - $utf8_3 = '[\xE0-\xEF]' . $cont_byte . '{2}'; - $utf8_4 = '[\xF0-\xF7]' . $cont_byte . '{3}'; - $utf8_5 = '[\xF8-\xFB]' . $cont_byte . '{4}'; - - $nibble_good_chars = "/^($ascii_char+|$utf8_2|$utf8_3|$utf8_4|$utf8_5)(.*)$/s"; - - # From http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT - $byte_map = array( - "\x80" => "\xE2\x82\xAC", # EURO SIGN - "\x82" => "\xE2\x80\x9A", # SINGLE LOW-9 QUOTATION MARK - "\x83" => "\xC6\x92", # LATIN SMALL LETTER F WITH HOOK - "\x84" => "\xE2\x80\x9E", # DOUBLE LOW-9 QUOTATION MARK - "\x85" => "\xE2\x80\xA6", # HORIZONTAL ELLIPSIS - "\x86" => "\xE2\x80\xA0", # DAGGER - "\x87" => "\xE2\x80\xA1", # DOUBLE DAGGER - "\x88" => "\xCB\x86", # MODIFIER LETTER CIRCUMFLEX ACCENT - "\x89" => "\xE2\x80\xB0", # PER MILLE SIGN - "\x8A" => "\xC5\xA0", # LATIN CAPITAL LETTER S WITH CARON - "\x8B" => "\xE2\x80\xB9", # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - "\x8C" => "\xC5\x92", # LATIN CAPITAL LIGATURE OE - "\x8E" => "\xC5\xBD", # LATIN CAPITAL LETTER Z WITH CARON - "\x91" => "\xE2\x80\x98", # LEFT SINGLE QUOTATION MARK - "\x92" => "\xE2\x80\x99", # RIGHT SINGLE QUOTATION MARK - "\x93" => "\xE2\x80\x9C", # LEFT DOUBLE QUOTATION MARK - "\x94" => "\xE2\x80\x9D", # RIGHT DOUBLE QUOTATION MARK - "\x95" => "\xE2\x80\xA2", # BULLET - "\x96" => "\xE2\x80\x93", # EN DASH - "\x97" => "\xE2\x80\x94", # EM DASH - "\x98" => "\xCB\x9C", # SMALL TILDE - "\x99" => "\xE2\x84\xA2", # TRADE MARK SIGN - "\x9A" => "\xC5\xA1", # LATIN SMALL LETTER S WITH CARON - "\x9B" => "\xE2\x80\xBA", # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - "\x9C" => "\xC5\x93", # LATIN SMALL LIGATURE OE - "\x9E" => "\xC5\xBE", # LATIN SMALL LETTER Z WITH CARON - "\x9F" => "\xC5\xB8", # LATIN CAPITAL LETTER Y WITH DIAERESIS - ); - - for( $i=160; $i < 256; $i++ ) { - $ch = chr($i); - $byte_map[$ch] = iconv('ISO-8859-1', 'UTF-8', $ch); - } - } - define_byte_mappings(); - - function force_utf8( $input ) { - global $byte_map, $nibble_good_chars; - - $output = ''; - $char = ''; - $rest = ''; - while( $input != '' ) { - if ( preg_match( $nibble_good_chars, $input, $matches ) ) { - $output .= $matches[1]; - $rest = $matches[2]; - } - else { - preg_match( '/^(.)(.*)$/s', $input, $matches ); - $char = $matches[1]; - $rest = $matches[2]; - if ( isset($byte_map[$char]) ) { - $output .= $byte_map[$char]; - } - else { - # Must be valid UTF8 already - $output .= $char; - } - } - $input = $rest; - } - return $output; - } - -} - - -/** -* Try and extract something like "Pacific/Auckland" or "America/Indiana/Indianapolis" if possible. -*/ -function olson_from_tzstring( $tzstring ) { - if ( in_array($tzstring,timezone_identifiers_list()) ) return $tzstring; - if ( preg_match( '{((Antarctica|America|Africa|Atlantic|Asia|Australia|Indian|Europe|Pacific)/(([^/]+)/)?[^/]+)$}', $tzstring, $matches ) ) { -// dbg_error_log( 'INFO', 'Found timezone "%s" from string "%s"', $matches[1], $tzstring ); - return $matches[1]; - } - switch( $tzstring ) { - case 'New Zealand Standard Time': case 'New Zealand Daylight Time': return 'Pacific/Auckland'; break; - case 'Central Standard Time': case 'Central Daylight Time': return 'America/Chicago'; break; - case 'Eastern Standard Time': case 'Eastern Daylight Time': return 'America/New_York'; break; - case 'Pacific Standard Time': case 'Pacific Daylight Time': return 'America/Los_Angeles'; break; - } - return null; -} - - -/** - * Return the AWL version - */ -function awl_version() { - global $c; -$c->awl_library_version = 0.46; - return $c->awl_library_version; -} \ No newline at end of file diff --git a/sources/libs/awl/Translation.php b/sources/libs/awl/Translation.php deleted file mode 100644 index 755367f..0000000 --- a/sources/libs/awl/Translation.php +++ /dev/null @@ -1,118 +0,0 @@ - -* @copyright Catalyst IT Ltd -* @license http://gnu.org/copyleft/gpl.html GNU GPL v2 or later -*/ - -if ( !function_exists('i18n') ) { - /** - * Mark a string as being internationalized. This is a semaphore method; it - * does nothing but it allows us to easily identify strings that require - * translation. Generally this is used to mark strings that will be stored - * in the database (like descriptions of permissions). - * - * AWL uses GNU gettext for internationalization (i18n) and localization (l10n) of - * text presented to the user. Gettext needs to know about all places involving strings, - * that must be translated. Mark any place, where localization at runtime shall take place - * by using the function translate(). - * - * In the help I have used 'xlate' rather than 'translate' and 'x18n' rather than 'i18n' - * so that the tools skip this particular file for translation :-) - * - * E.g. instead of: - * print 'TEST to be displayed in different languages'; - * use: - * print xlate('TEST to be displayed in different languages'); - * and you are all set for pure literals. The translation teams will receive that literal - * string as a job to translate and will translate it (when the message is clear enough). - * At runtime the message is then localized when printed. - * The input string can contain a hint to assist translators: - * print xlate('TT '); - * The hint portion of the string will not be printed. - * - * But consider this case: - * $message_to_be_localized = 'TEST to be displayed in different languages'; - * print xlate($message_to_be_localized); - * - * The translate() function is called in the right place for runtime handling, but there - * is no message at gettext preprocessing time to be given to the translation teams, - * just a variable name. Translation of the variable name would break the code! So all - * places potentially feeding this variable have to be marked to be given to translation - * teams, but not translated at runtime! - * - * This method resolves all such cases. Simply mark the candidates: - * $message_to_be_localized = x18n('TEST to be displayed in different languages'); - * print xlate($message_to_be_localized); - * - * @param string the value - * @return string the same value - */ - function i18n($value) { - return $value; /* Just pass the value through */ - } -} - - -if ( !function_exists('translate') ) { - /** - * Convert a string in English to whatever this user's locale is - */ - if ( function_exists('gettext') ) { - function translate( $en ) { - if ( ! isset($en) || $en == '' ) return $en; - $xl = gettext($en); - dbg_error_log('I18N','Translated =%s= into =%s=', $en, $xl ); - return $xl; - } - } - else { - function translate( $en ) { - return $en; - } - } -} - - -if ( !function_exists('init_gettext') ) { - /** - * Initialise our use of Gettext - */ - function init_gettext( $domain, $location ) { - if ( !function_exists('bindtextdomain') ) return; - bindtextdomain( $domain, $location ); - $codeset = bind_textdomain_codeset( $domain, 'UTF-8' ); - textdomain( $domain ); - dbg_error_log('I18N','Bound domain =%s= to location =%s= using character set =%s=', $domain, $location, $codeset ); - } -} - - -if ( !function_exists('awl_set_locale') ) { - /** - * Set the translation to the user's locale. At this stage all we do is - * call the gettext function. - */ - function awl_set_locale( $locale ) { - global $c; - - if ( !is_array($locale) && ! preg_match('/^[a-z]{2}(_[A-Z]{2})?\./', $locale ) ) { - $locale = array( $locale, $locale.'.UTF-8'); - } - if ( !function_exists('setlocale') ) { - dbg_log_array('WARN','No "setlocale()" function? PHP gettext support missing?' ); - return; - } - if ( $newlocale = setlocale( LC_ALL, $locale) ) { - dbg_error_log('I18N','Set locale to =%s=', $newlocale ); - $c->current_locale = $newlocale; - } - else { - dbg_log_array('I18N','Unsupported locale: ', $locale, false ); - } - } -} - diff --git a/sources/libs/awl/XMLDocument.php b/sources/libs/awl/XMLDocument.php deleted file mode 100644 index 6bdb1cc..0000000 --- a/sources/libs/awl/XMLDocument.php +++ /dev/null @@ -1,307 +0,0 @@ - -* @copyright Morphoss Ltd - http://www.morphoss.com/ -* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU LGPL version 3 or later -* -*/ - -require_once("XMLElement.php"); - -/** -* A class for XML Documents which will contain namespaced XML elements -* -* @package awl -*/ -class XMLDocument { - - /**#@+ - * @access private - */ - /** - * holds the namespaces which this document has been configured for. - * @var namespaces - */ - var $namespaces; - - /** - * holds the prefixes which are shorthand for the namespaces. - * @var prefixes - */ - var $prefixes; - - /** - * Holds the root document for the tree - * @var root - */ - var $root; - - /** - * Simple XMLDocument constructor - * - * @param array $namespaces An array of 'namespace' => 'prefix' pairs, where the prefix is used as a short form for the namespace. - */ - function __construct( $namespaces = null ) { - $this->namespaces = array(); - $this->prefixes = array(); - if ( $namespaces != null ) { - foreach( $namespaces AS $ns => $prefix ) { - $this->namespaces[$ns] = $prefix; - $this->prefixes[$prefix] = $prefix; - } - } - $this->next_prefix = 0; - } - - /** - * Add a new namespace to the document, optionally specifying it's short prefix - * - * @param string $namespace The full namespace name to be added - * @param string $prefix An optional short form for the namespace. - */ - function AddNamespace( $namespace, $prefix = null ) { - if ( !isset($this->namespaces[$namespace]) ) { - if ( isset($prefix) && ($prefix == "" || isset($this->prefixes[$prefix])) ) $prefix = null; - if ( $prefix == null ) { - // Try and build a prefix based on the first alphabetic character of the last element of the namespace - if ( preg_match('/^(.*):([^:]+)$/', $namespace, $matches) ) { - $alpha = preg_replace( '/[^a-z]/i', '', $matches[2] ); - $prefix = strtoupper(substr($alpha,0,1)); - } - else { - $prefix = 'X'; - } - $i = ""; - if ( isset($this->prefixes[$prefix]) ) { - for ( $i=1; $i<10 && isset($this->prefixes["$prefix$i"]); $i++ ) { - } - } - if ( isset($this->prefixes["$prefix$i"]) ) { - dbg_error_log("ERROR", "Cannot find a free prefix for this namespace"); - exit; - } - $prefix = "$prefix$i"; - dbg_error_log("XMLDocument", "auto-assigning prefix of '%s' for ns of '%s'", $prefix, $namespace ); - } - else if ( $prefix == "" || isset($this->prefixes[$prefix]) ) { - dbg_error_log("ERROR", "Cannot assign the same prefix to two different namespaces"); - exit; - } - - $this->prefixes[$prefix] = $prefix; - $this->namespaces[$namespace] = $prefix; - } - else { - if ( isset($this->namespaces[$namespace]) && $this->namespaces[$namespace] != $prefix ) { - dbg_error_log("ERROR", "Cannot use the same namespace with two different prefixes"); - exit; - } - $this->prefixes[$prefix] = $prefix; - $this->namespaces[$namespace] = $prefix; - } - } - - - /** - * Return a tag with namespace stripped and replaced with a short form, and the ns added to the document. - * - */ - function GetXmlNsArray() { - - $ns = array(); - foreach( $this->namespaces AS $n => $p ) { - if ( $p == "" ) $ns["xmlns"] = $n; else $ns["xmlns:$p"] = $n; - } - - return $ns; - } - - - /** - * Return a tag with namespace stripped and replaced with a short form, and the ns added to the document. - * - * @param string $in_tag The tag we want a namespace prefix on. - * @param string $namespace The namespace we want it in (which will be parsed from $in_tag if not present - * @param string $prefix The prefix we would like to use. Leave it out and one will be assigned. - * - * @return string The tag with a namespace prefix consistent with previous tags in this namespace. - */ - function Tag( $in_tag, $namespace=null, $prefix=null ) { - - if ( $namespace == null ) { - // Attempt to split out from namespace:tag - if ( preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) { - $namespace = $matches[1]; - $tag = $matches[2]; - } - else { - // There is nothing we can do here - return $in_tag; - } - } - else { - $tag = $in_tag; - } - - if ( !isset($this->namespaces[$namespace]) ) { - $this->AddNamespace( $namespace, $prefix ); - } - $prefix = $this->namespaces[$namespace]; - - return $prefix . ($prefix == "" ? "" : ":") . $tag; - } - - - /** - * Special helper for namespaced tags. - * - * @param object $element The tag are adding a new namespaced element to - * @param string $tag the tag name, possibly prefixed with the namespace - * @param mixed $content The content of the tag - * @param array $attributes An array of key/value pairs of attributes. - * @param string $namespace The namespace for the tag - * - */ - function NSElement( &$element, $in_tag, $content=false, $attributes=false, $namespace=null ) { - if ( $namespace == null && preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) { - $namespace = $matches[1]; - $tag = $matches[2]; - } - else { - $tag = $in_tag; - } - - if ( isset($namespace) && !isset($this->namespaces[$namespace]) ) $this->AddNamespace( $namespace ); - return $element->NewElement( $tag, $content, $attributes, $namespace ); - } - - - /** - * Special helper for tags in the DAV: namespace. - * - * @param object $element The tag are adding a new namespaced element to - * @param string $tag the tag name - * @param mixed $content The content of the tag - * @param array $attributes An array of key/value pairs of attributes. - */ - function DAVElement( &$element, $tag, $content=false, $attributes=false ) { - return $this->NSElement( $element, $tag, $content, $attributes, 'DAV:' ); - } - - - /** - * Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace. - * - * @param object $element The tag are adding a new namespaced element to - * @param string $tag the tag name - * @param mixed $content The content of the tag - * @param array $attributes An array of key/value pairs of attributes. - */ - function CalDAVElement( &$element, $tag, $content=false, $attributes=false ) { - if ( !isset($this->namespaces['urn:ietf:params:xml:ns:caldav']) ) $this->AddNamespace( 'urn:ietf:params:xml:ns:caldav', 'C' ); - return $this->NSElement( $element, $tag, $content, $attributes, 'urn:ietf:params:xml:ns:caldav' ); - } - - - /** - * Special helper for tags in the urn:ietf:params:xml:ns:carddav namespace. - * - * @param object $element The tag are adding a new namespaced element to - * @param string $tag the tag name - * @param mixed $content The content of the tag - * @param array $attributes An array of key/value pairs of attributes. - */ - function CardDAVElement( &$element, $tag, $content=false, $attributes=false ) { - if ( !isset($this->namespaces['urn:ietf:params:xml:ns:carddav']) ) $this->AddNamespace( 'urn:ietf:params:xml:ns:carddav', 'VC' ); - return $this->NSElement( $element, $tag, $content, $attributes, 'urn:ietf:params:xml:ns:carddav' ); - } - - - /** - * Special helper for tags in the urn:ietf:params:xml:ns:caldav namespace. - * - * @param object $element The tag are adding a new namespaced element to - * @param string $tag the tag name - * @param mixed $content The content of the tag - * @param array $attributes An array of key/value pairs of attributes. - */ - function CalendarserverElement( &$element, $tag, $content=false, $attributes=false ) { - if ( !isset($this->namespaces['http://calendarserver.org/ns/']) ) $this->AddNamespace( 'http://calendarserver.org/ns/', 'A' ); - return $this->NSElement( $element, $tag, $content, $attributes, 'http://calendarserver.org/ns/' ); - } - - - /** - * @param string $in_tag The tag name of the new element, possibly namespaced - * @param mixed $content Either a string of content, or an array of sub-elements - * @param array $attributes An array of attribute name/value pairs - * @param array $xmlns An XML namespace specifier - */ - function NewXMLElement( $in_tag, $content=false, $attributes=false, $xmlns=null ) { - if ( $xmlns == null && preg_match('/^(.*):([^:]+)$/', $in_tag, $matches) ) { - $xmlns = $matches[1]; - $tagname = $matches[2]; - } - else { - $tagname = $in_tag; - } - - if ( isset($xmlns) && !isset($this->namespaces[$xmlns]) ) $this->AddNamespace( $xmlns ); - return new XMLElement($tagname, $content, $attributes, $xmlns ); - } - - /** - * Render the document tree into (nicely formatted) XML - * - * @param mixed $root A root XMLElement or a tagname to create one with the remaining parameters. - * @param mixed $content Either a string of content, or an array of sub-elements - * @param array $attributes An array of attribute name/value pairs - * @param array $xmlns An XML namespace specifier - * - * @return A rendered namespaced XML document. - */ - function Render( $root, $content=false, $attributes=false, $xmlns=null ) { - if ( is_object($root) ) { - /** They handed us a pre-existing object. We'll just use it... */ - $this->root = $root; - } - else { - /** We got a tag name, so we need to create the root element */ - $this->root = $this->NewXMLElement( $root, $content, $attributes, $xmlns ); - } - - /** - * Add our namespace attributes here. - */ - foreach( $this->namespaces AS $n => $p ) { - $this->root->SetAttribute( 'xmlns'.($p == '' ? '' : ':') . $p, $n); - } - - /** And render... */ - return $this->root->Render(0,''); - } - - /** - * Return a DAV::href XML element, or an array of them - * @param mixed $url The URL (or array of URLs) to be wrapped in DAV::href tags - * - * @return XMLElement The newly created XMLElement object. - */ - function href($url) { - if ( is_array($url) ) { - $set = array(); - foreach( $url AS $href ) { - $set[] = $this->href( $href ); - } - return $set; - } - return $this->NewXMLElement('href', $url, false, 'DAV:'); - } - -} - - diff --git a/sources/libs/awl/XMLElement.php b/sources/libs/awl/XMLElement.php deleted file mode 100644 index 7134ec5..0000000 --- a/sources/libs/awl/XMLElement.php +++ /dev/null @@ -1,345 +0,0 @@ - -* @copyright Catalyst .Net Ltd, Morphoss Ltd -* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU LGPL version 3 or later -*/ - -require_once('AWLUtilities.php'); - -/** -* A class for XML elements which may have attributes, or contain -* other XML sub-elements -* -* @package awl -*/ -class XMLElement { - protected $tagname; - protected $xmlns; - protected $attributes; - protected $content; - protected $_parent; - - /** - * Constructor - nothing fancy as yet. - * - * @param string $tagname The tag name of the new element - * @param mixed $content Either a string of content, or an array of sub-elements - * @param array $attributes An array of attribute name/value pairs - * @param array $xmlns An XML namespace specifier - */ - function __construct( $tagname, $content=false, $attributes=false, $xmlns=null ) { - $this->tagname=$tagname; - if ( gettype($content) == "object" ) { - // Subtree to be parented here - $this->content = array(&$content); - } - else { - // Array or text - $this->content = $content; - } - $this->attributes = $attributes; - if ( isset($this->attributes['xmlns']) ) { // Oversimplification to be removed - $this->xmlns = $this->attributes['xmlns']; - } - if ( isset($xmlns) ) { - $this->xmlns = $xmlns; - } - } - - - /** - * Count the number of elements - * @return int The number of elements - */ - function CountElements( ) { - if ( $this->content === false ) return 0; - if ( is_array($this->content) ) return count($this->content); - if ( $this->content == '' ) return 0; - return 1; - } - - /** - * Set an element attribute to a value - * - * @param string The attribute name - * @param string The attribute value - */ - function SetAttribute($k,$v) { - if ( gettype($this->attributes) != "array" ) $this->attributes = array(); - $this->attributes[$k] = $v; - if ( strtolower($k) == 'xmlns' ) { - $this->xmlns = $v; - } - } - - /** - * Set the whole content to a value - * - * @param mixed The element content, which may be text, or an array of sub-elements - */ - function SetContent($v) { - $this->content = $v; - } - - /** - * Accessor for the tag name - * - * @return string The tag name of the element - */ - function GetTag() { - return $this->tagname; - } - - /** - * Accessor for the full-namespaced tag name - * - * @return string The tag name of the element, prefixed by the namespace - */ - function GetNSTag() { - return $this->xmlns . ':' . $this->tagname; - } - - /** - * Accessor for a single attribute - * @param string $attr The name of the attribute. - * @return string The value of that attribute of the element - */ - function GetAttribute( $attr ) { - if ( $attr == 'xmlns' ) return $this->xmlns; - if ( isset($this->attributes[$attr]) ) return $this->attributes[$attr]; - return null; - } - - /** - * Accessor for the attributes - * - * @return array The attributes of this element - */ - function GetAttributes() { - return $this->attributes; - } - - /** - * Accessor for the content - * - * @return array The content of this element - */ - function GetContent() { - return $this->content; - } - - /** - * Return an array of elements matching the specified tag, or all elements if no tag is supplied. - * Unlike GetContent() this will always return an array. - * - * @return array The XMLElements within the tree which match this tag - */ - function GetElements( $tag=null, $recursive=false ) { - $elements = array(); - if ( gettype($this->content) == "array" ) { - foreach( $this->content AS $k => $v ) { - if ( !isset($tag) || (isset($v->tagname) && $v->tagname == $tag) ) { - $elements[] = $v; - } - if ( $recursive ) { - $elements = $elements + $v->GetElements($tag,true); - } - } - } - else if ( !isset($tag) || (isset($v->content->tagname) && $this->content->tagname == $tag) ) { - $elements[] = $this->content; - } - return $elements; - } - - - /** - * Return an array of elements matching the specified path - * - * @return array The XMLElements within the tree which match this tag - */ - function GetPath( $path ) { - $elements = array(); - // printf( "Querying within '%s' for path '%s'\n", $this->tagname, $path ); - if ( !preg_match( '#(/)?([^/]+)(/?.*)$#', $path, $matches ) ) return $elements; - // printf( "Matches: %s -- %s -- %s\n", $matches[1], $matches[2], $matches[3] ); - if ( $matches[2] == '*' || strtolower($matches[2]) == strtolower($this->tagname) ) { - if ( $matches[3] == '' ) { - /** - * That is the full path - */ - $elements[] = $this; - } - else if ( gettype($this->content) == "array" ) { - /** - * There is more to the path, so we recurse into that sub-part - */ - foreach( $this->content AS $k => $v ) { - $elements = array_merge( $elements, $v->GetPath($matches[3]) ); - } - } - } - - if ( $matches[1] != '/' && gettype($this->content) == "array" ) { - /** - * If our input $path was not rooted, we recurse further - */ - foreach( $this->content AS $k => $v ) { - $elements = array_merge( $elements, $v->GetPath($path) ); - } - } - // printf( "Found %d within '%s' for path '%s'\n", count($elements), $this->tagname, $path ); - return $elements; - } - - - /** - * Add a sub-element - * - * @param object An XMLElement to be appended to the array of sub-elements - */ - function AddSubTag(&$v) { - if ( gettype($this->content) != "array" ) $this->content = array(); - $this->content[] =& $v; - return count($this->content); - } - - /** - * Add a new sub-element - * - * @param string The tag name of the new element - * @param mixed Either a string of content, or an array of sub-elements - * @param array An array of attribute name/value pairs - * - * @return objectref A reference to the new XMLElement - */ - function &NewElement( $tagname, $content=false, $attributes=false, $xmlns=null ) { - if ( gettype($this->content) != "array" ) $this->content = array(); - $element = new XMLElement($tagname,$content,$attributes,$xmlns); - $this->content[] =& $element; - return $element; - } - - - /** - * Render just the internal content - * - * @return string The content of this element, as a string without this element wrapping it. - */ - function RenderContent($indent=0, $nslist=null ) { - $r = ""; - if ( is_array($this->content) ) { - /** - * Render the sub-elements with a deeper indent level - */ - $r .= "\n"; - foreach( $this->content AS $k => $v ) { - if ( is_object($v) ) { - $r .= $v->Render($indent+1, "", $nslist); - } - } - $r .= substr(" ",0,$indent); - } - else { - /** - * Render the content, with special characters escaped - * - */ - $r .= htmlspecialchars($this->content, ENT_NOQUOTES ); - } - return $r; - } - - - /** - * Render the document tree into (nicely formatted) XML - * - * @param int The indenting level for the pretty formatting of the element - */ - function Render($indent=0, $xmldef="", $nslist=null) { - $r = ( $xmldef == "" ? "" : $xmldef."\n"); - - $attr = ""; - $tagname = $this->tagname; - if ( gettype($this->attributes) == "array" ) { - /** - * Render the element attribute values - */ - foreach( $this->attributes AS $k => $v ) { - if ( preg_match('#^xmlns(:?(.+))?$#', $k, $matches ) ) { - if ( !isset($nslist) ) $nslist = array(); - $prefix = (isset($matches[2]) ? $matches[2] : ''); - if ( isset($nslist[$v]) && $nslist[$v] == $prefix ) continue; // No need to include in list as it's in a wrapping element - $nslist[$v] = $prefix; - if ( !isset($this->xmlns) ) $this->xmlns = $v; - } - $attr .= sprintf( ' %s="%s"', $k, htmlspecialchars($v) ); - } - } - if ( isset($this->xmlns) && isset($nslist[$this->xmlns]) && $nslist[$this->xmlns] != '' ) { - $tagname = $nslist[$this->xmlns] . ':' . $tagname; - } - - $r .= substr(" ",0,$indent) . '<' . $tagname . $attr; - - if ( (is_array($this->content) && count($this->content) > 0) || (!is_array($this->content) && strlen($this->content) > 0) ) { - $r .= ">"; - $r .= $this->RenderContent($indent,$nslist); - $r .= '\n"; - } - else { - $r .= "/>\n"; - } - return $r; - } - - - function __tostring() { - return $this->Render(); - } -} - - -/** -* Rebuild an XML tree in our own style from the parsed XML tags using -* a tail-recursive approach. -* -* @param array $xmltags An array of XML tags we get from using the PHP XML parser -* @param intref &$start_from A pointer to our current integer offset into $xmltags -* @return mixed Either a single XMLElement, or an array of XMLElement objects. -*/ -function BuildXMLTree( $xmltags, &$start_from ) { - $content = array(); - - if ( !isset($start_from) ) $start_from = 0; - - for( $i=0; $i < 50000 && isset($xmltags[$start_from]); $i++) { - $tagdata = $xmltags[$start_from++]; - if ( !isset($tagdata) || !isset($tagdata['tag']) || !isset($tagdata['type']) ) break; - if ( $tagdata['type'] == "close" ) break; - $attributes = ( isset($tagdata['attributes']) ? $tagdata['attributes'] : false ); - if ( $tagdata['type'] == "open" ) { - $subtree = BuildXMLTree( $xmltags, $start_from ); - $content[] = new XMLElement($tagdata['tag'], $subtree, $attributes ); - } - else if ( $tagdata['type'] == "complete" ) { - $value = ( isset($tagdata['value']) ? $tagdata['value'] : false ); - $content[] = new XMLElement($tagdata['tag'], $value, $attributes ); - } - } - - /** - * If there is only one element, return it directly, otherwise return the - * array of them - */ - if ( count($content) == 1 ) { - return $content[0]; - } - return $content; -} - diff --git a/sources/libs/caldav-client/README b/sources/libs/caldav-client/README deleted file mode 100644 index 6449e84..0000000 --- a/sources/libs/caldav-client/README +++ /dev/null @@ -1,8 +0,0 @@ -This directory contains code from the following Open Source projects: - -* DAViCal -* AWL - -(c) Andrew McMillan - - diff --git a/sources/libs/caldav-client/caldav-client.php b/sources/libs/caldav-client/caldav-client.php deleted file mode 100644 index 4b0659f..0000000 --- a/sources/libs/caldav-client/caldav-client.php +++ /dev/null @@ -1,1219 +0,0 @@ - - * - * This file is part of AgenDAV but it's heavily based on DAViCal - * caldav-client-v2.php by Andrew McMillan - * - * AgenDAV is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * AgenDAV is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AgenDAV. If not, see . - */ - -require_once('XMLDocument.php'); - -class CalDAVClient { - /** - * Server, username, password, calendar - * - * @var string - */ - protected $base_url, $user, $pass, $entry, $protocol, $server, $port; - - /** - * The principal-URL we're using - */ - protected $principal_url; - - /** - * The calendar-URL we're using - */ - protected $calendar_url; - - /** - * The calendar-home-set we're using - */ - protected $calendar_home_set; - - /** - * The calendar_urls we have discovered - */ - protected $calendar_urls; - - /** - * The useragent which is send to the caldav server - * - * @var string - */ - public $user_agent = 'DAViCalClient'; - - protected $headers = array(); - protected $body = ""; - protected $requestMethod = "GET"; - protected $httpRequest = ""; // for debugging http headers sent - protected $xmlRequest = ""; // for debugging xml sent - protected $httpResponse = ""; // http headers received - protected $xmlResponse = ""; // xml received - protected $httpResultCode = ""; - - protected $parser; // our XML parser object - - // Requests timeout - private $timeout; - - // cURL handle - private $ch; - - // Full URL - private $full_url; - - /** - * Constructor - * - * Valid options are: - * - * $options['auth'] : Auth type. Can be any of values for - * CURLOPT_HTTPAUTH (from - * http://www.php.net/manual/es/function.curl-setopt.php). Default: - * basic or digest - * - * $options['timeout'] : Timeout in seconds - */ - - // TODO: proxy options, interface used, - function __construct( $base_url, $user, $pass, $options = array()) { - $this->user = $user; - $this->pass = $pass; - $this->headers = array(); - - if ( preg_match( '#^(https?)://([a-z0-9.-]+)(:([0-9]+))?(/.*)$#', $base_url, $matches ) ) { - $this->server = $matches[2]; - $this->base_url = $matches[5]; - if ( $matches[1] == 'https' ) { - $this->protocol = 'ssl'; - $this->port = 443; - } - else { - $this->protocol = 'tcp'; - $this->port = 80; - } - if ( $matches[4] != '' ) { - $this->port = intval($matches[4]); - } - } else { - trigger_error("Invalid URL: '".$base_url."'", E_USER_ERROR); - } - - $this->timeout = isset($options['timeout']) ? - $options['timeout'] : 10; - $this->ch = curl_init(); - curl_setopt_array($this->ch, array( - CURLOPT_CONNECTTIMEOUT => $this->timeout, - CURLOPT_FAILONERROR => FALSE, - CURLOPT_MAXREDIRS => 2, - CURLOPT_FORBID_REUSE => FALSE, - CURLOPT_RETURNTRANSFER => TRUE, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPAUTH => - isset($options['auth']) ? $options['auth'] : - (CURLAUTH_BASIC | CURLAUTH_DIGEST), - CURLOPT_USERAGENT => 'cURL based CalDAV client', - CURLINFO_HEADER_OUT => TRUE, - CURLOPT_HEADER => TRUE, - CURLOPT_SSL_VERIFYPEER => FALSE, - )); - - $this->full_url = $base_url; - } - - /** - * Check with OPTIONS if calendar-access is enabled - * - * Can be used to check authentication against server - * - */ - function CheckValidCalDAV() { - // Clean headers - $this->headers = array(); - $dav_options = $this->DoOptionsRequestAndGetDAVHeader(); - $valid_caldav_server = isset($dav_options['calendar-access']); - - return $valid_caldav_server; - } - - /** - * Issues an OPTIONS request - * - * @param string $url The URL to make the request to - * - * @return array DAV options - */ - function DoOptionsRequestAndGetDAVHeader( $url = null ) { - $this->requestMethod = "OPTIONS"; - $this->body = ""; - $headers = $this->DoRequest($url); - - $result = array(); - - $headers = preg_split('/\r?\n/', $headers); - - // DAV header(s) - $dav_header = preg_grep('/^DAV:/', $headers); - if (is_array($dav_header)) { - $dav_header = array_values($dav_header); - $dav_header = preg_replace('/^DAV: /', '', $dav_header); - - $dav_options = array(); - - foreach ($dav_header as $d) { - $dav_options = array_merge($dav_options, - array_flip(preg_split('/[, ]+/', $d))); - } - - $result = $dav_options; - - } - - return $result; - } - - - /** - * Adds an If-Match or If-None-Match header - * - * @param bool $match to Match or Not to Match, that is the question! - * @param string $etag The etag to match / not match against. - */ - function SetMatch( $match, $etag = '*' ) { - $this->headers['match'] = sprintf( "%s-Match: \"%s\"", ($match ? "If" : "If-None"), $etag); - } - - /** - * Add a Depth: header. Valid values are 0, 1 or infinity - * - * @param int $depth The depth, default to infinity - */ - function SetDepth( $depth = '0' ) { - $this->headers['depth'] = 'Depth: '. ($depth == '1' ? "1" : ($depth == 'infinity' ? $depth : "0") ); - } - - /** - * Add a Depth: header. Valid values are 1 or infinity - * - * @param int $depth The depth, default to infinity - */ - function SetUserAgent( $user_agent = null ) { - $this->user_agent = $user_agent; - curl_setopt($this->ch, CURLOPT_USERAGENT, $user_agent); - } - - /** - * Add a Content-type: header. - * - * @param string $type The content type - */ - function SetContentType( $type ) { - $this->headers['content-type'] = "Content-type: $type"; - } - - /** - * Set the calendar_url we will be using for a while. - * - * @param string $url The calendar_url - */ - function SetCalendar( $url ) { - $this->calendar_url = $url; - } - - /** - * Split response into httpResponse and xmlResponse - * - * @param string Response from server - */ - function ParseResponse( $response ) { - $pos = strpos($response, 'httpResponse = trim($response); - } - else { - $this->httpResponse = trim(substr($response, 0, $pos)); - $this->xmlResponse = trim(substr($response, $pos)); - $this->xmlResponse = preg_replace('{>[^>]*$}s', '>',$this->xmlResponse ); - $parser = xml_parser_create_ns('UTF-8'); - xml_parser_set_option ( $parser, XML_OPTION_SKIP_WHITE, 1 ); - xml_parser_set_option ( $parser, XML_OPTION_CASE_FOLDING, 0 ); - - if ( xml_parse_into_struct( $parser, $this->xmlResponse, $this->xmlnodes, $this->xmltags ) === 0 ) { - //printf( "XML parsing error: %s - %s\n", xml_get_error_code($parser), xml_error_string(xml_get_error_code($parser)) ); - // debug_print_backtrace(); - // echo "\nNodes array............................................................\n"; print_r( $this->xmlnodes ); - // echo "\nTags array............................................................\n"; print_r( $this->xmltags ); - //printf( "\nXML Reponse:\n%s\n", $this->xmlResponse ); - log_message('ERROR', 'XML parsing error: ' - . xml_get_error_code($parser) . ', ' - . xml_error_string(xml_get_error_code($parser))); - } - - xml_parser_free($parser); - } - } - - /** - * Parse response headers - */ - function ParseResponseHeaders($headers) { - $lines = preg_split('/[\r\n]+/', $headers); - $this->httpResultCode = preg_replace('/^[\S]+ (\d+).+$/', '\1', - $lines[0]); - } - - /** - * Output http request headers - * - * @return HTTP headers - */ - function GetHttpRequest() { - return $this->httpRequest; - } - /** - * Output http response headers - * - * @return HTTP headers - */ - function GetResponseHeaders() { - return $this->httpResponseHeaders; - } - /** - * Output http response body - * - * @return HTTP body - */ - function GetResponseBody() { - return $this->httpResponseBody; - } - /** - * Output xml request - * - * @return raw xml - */ - function GetXmlRequest() { - return $this->xmlRequest; - } - /** - * Output xml response - * - * @return raw xml - */ - function GetXmlResponse() { - return $this->xmlResponse; - } - /** - * Output HTTP status code - * - * @return string HTTP status code - */ - function GetHttpResultCode() { - return $this->httpResultCode; - } - - /** - * Send a request to the server - * - * @param string $url The URL to make the request to - * - * @return string The content of the response from the server - */ - function DoRequest( $url = null ) { - if (is_null($url)) { - $url = $this->full_url; - } - - $this->request_url = $url; - - curl_setopt($this->ch, CURLOPT_URL, $url); - - // Request method - curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->requestMethod); - - // Empty body. If not used, cURL will spend ~5s on this request - if ($this->requestMethod == 'HEAD' || empty($this->body)) { - curl_setopt($this->ch, CURLOPT_NOBODY, TRUE); - } else { - curl_setopt($this->ch, CURLOPT_NOBODY, FALSE); - } - - // Headers - if (!isset($this->headers['content-type'])) $this->headers['content-type'] = "Content-type: text/plain"; - - // Remove cURL generated 'Expect: 100-continue' - $this->headers['disable_expect'] = 'Expect:'; - curl_setopt($this->ch, CURLOPT_HTTPHEADER, - array_values($this->headers)); - - curl_setopt($this->ch, CURLOPT_USERPWD, $this->user . ':' . - $this->pass); - - // Request body - curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->body); - - $response = curl_exec($this->ch); - - if (FALSE === $response) { - // TODO better error handling - log_message('ERROR', 'Error requesting ' . $url . ': ' - . curl_error($this->ch)); - return false; - } - - $info = curl_getinfo($this->ch); - - // Get headers (idea from SabreDAV WebDAV client) - $this->httpResponseHeaders = substr($response, 0, $info['header_size']); - $this->httpResponseBody = substr($response, $info['header_size']); - - // Get only last headers (needed when using unspecific HTTP auth - // method or request got redirected) - $this->httpResponseHeaders = preg_replace('/^.+\r\n\r\n(.+)/sU', '$1', - $this->httpResponseHeaders); - - // Parse response - $this->ParseResponseHeaders($this->httpResponseHeaders); - $this->ParseResponse($this->httpResponseBody); - - //TODO debug - - /* - log_message('INTERNALS', 'REQh: ' . var_export($info['request_header'], TRUE)); - log_message('INTERNALS', 'REQb: ' . var_export($this->body, TRUE)); - log_message('INTERNALS', 'RPLh: ' . var_export($this->httpResponseHeaders, TRUE)); - log_message('INTERNALS', 'RPLb: ' . var_export($this->httpResponseBody, TRUE)); - */ - - return $response; - } - - /** - * Send an OPTIONS request to the server - * - * @param string $url The URL to make the request to - * - * @return array The allowed options - */ - function DoOptionsRequest( $url = null ) { - $this->requestMethod = "OPTIONS"; - $this->body = ""; - $headers = $this->DoRequest($url); - $options_header = preg_replace( '/^.*Allow: ([a-z, ]+)\r?\n.*/is', '$1', $headers ); - $options = array_flip( preg_split( '/[, ]+/', $options_header )); - return $options; - } - - - - /** - * Send an XML request to the server (e.g. PROPFIND, REPORT, MKCALENDAR) - * - * @param string $method The method (PROPFIND, REPORT, etc) to use with the request - * @param string $xml The XML to send along with the request - * @param string $url The URL to make the request to - * - * @return array An array of the allowed methods - */ - function DoXMLRequest( $request_method, $xml, $url = null ) { - $this->body = $xml; - $this->requestMethod = $request_method; - $this->SetContentType("text/xml"); - return $this->DoRequest($url); - } - - - - /** - * Get a single item from the server. - * - * @param string $url The URL to GET - */ - function DoGETRequest( $url ) { - $this->body = ""; - $this->requestMethod = "GET"; - return $this->DoRequest( $url ); - } - - - /** - * Get the HEAD of a single item from the server. - * - * @param string $url The URL to HEAD - */ - function DoHEADRequest( $url ) { - $this->body = ""; - $this->requestMethod = "HEAD"; - return $this->DoRequest( $url ); - } - - - /** - * PUT a text/icalendar resource, returning the etag - * - * @param string $url The URL to make the request to - * @param string $icalendar The iCalendar resource to send to the server - * @param string $etag The etag of an existing resource to be overwritten, or '*' for a new resource. - * - * @return string The content of the response from the server - */ - function DoPUTRequest( $url, $icalendar, $etag = null ) { - $this->body = $icalendar; - - $this->requestMethod = "PUT"; - if ( $etag != null ) { - $this->SetMatch( ($etag != '*'), $etag ); - } - $this->SetContentType('text/calendar; encoding="utf-8"'); - $this->DoRequest($url); - - $etag = null; - if ( preg_match( '{^ETag:\s+"([^"]*)"\s*$}im', $this->httpResponseHeaders, $matches ) ) $etag = $matches[1]; - if ( !isset($etag) || $etag == '' ) { - // Try with HEAD - $save_request = $this->httpRequest; - $save_response_headers = $this->httpResponseHeaders; - $save_http_result = $this->httpResultCode; - $this->DoHEADRequest( $url ); - if ( preg_match( '{^Etag:\s+"([^"]*)"\s*$}im', $this->httpResponseHeaders, $matches ) ) $etag = $matches[1]; - /* - if ( !isset($etag) || $etag == '' ) { - printf( "Still No etag in:\n%s\n", $this->httpResponseHeaders ); - } - */ - $this->httpRequest = $save_request; - $this->httpResponseHeaders = $save_response_headers; - $this->httpResultCode = $save_http_result; - } - return $etag; - } - - - /** - * DELETE a text/icalendar resource - * - * @param string $url The URL to make the request to - * @param string $etag The etag of an existing resource to be deleted, or '*' for any resource at that URL. - * - * @return int The HTTP Result Code for the DELETE - */ - function DoDELETERequest( $url, $etag = null ) { - $this->body = ""; - - $this->requestMethod = "DELETE"; - if ( $etag != null ) { - $this->SetMatch( true, $etag ); - } - $this->DoRequest($url); - return $this->httpResultCode; - } - - - /** - * Get a single item from the server. - * - * @param string $url The URL to PROPFIND on - */ - function DoPROPFINDRequest( $url, $props, $depth = 0 ) { - $this->SetDepth($depth); - $xml = new XMLDocument( array( 'DAV:' => '', 'urn:ietf:params:xml:ns:caldav' => 'C' ) ); - $prop = new XMLElement('prop'); - foreach( $props AS $v ) { - $xml->NSElement($prop,$v); - } - - $this->body = $xml->Render('propfind',$prop ); - - $this->requestMethod = "PROPFIND"; - $this->SetContentType("text/xml"); - $this->DoRequest($url); - return $this->GetXmlResponse(); - } - - - /** - * Get/Set the Principal URL - * - * @param $url string The Principal URL to set - */ - function PrincipalURL( $url = null ) { - if ( isset($url) ) { - $this->principal_url = $url; - } - return $this->principal_url; - } - - - /** - * Get/Set the calendar-home-set URL - * - * @param $url array of string The calendar-home-set URLs to set - */ - function CalendarHomeSet( $urls = null ) { - if ( isset($urls) ) { - if ( ! is_array($urls) ) $urls = array($urls); - $this->calendar_home_set = $urls; - } - return $this->calendar_home_set; - } - - - /** - * Get/Set the calendar-home-set URL - * - * @param $urls array of string The calendar URLs to set - */ - function CalendarUrls( $urls = null ) { - if ( isset($urls) ) { - if ( ! is_array($urls) ) $urls = array($urls); - $this->calendar_urls = $urls; - } - return $this->calendar_urls; - } - - - /** - * Return the first occurrence of an href inside the named tag. - * - * @param string $tagname The tag name to find the href inside of - */ - function HrefValueInside( $tagname ) { - foreach( $this->xmltags[$tagname] AS $k => $v ) { - $j = $v + 1; - if ( $this->xmlnodes[$j]['tag'] == 'DAV::href' ) { - return rawurldecode($this->xmlnodes[$j]['value']); - } - } - return null; - } - - - /** - * Return the href containing this property. Except only if it's inside a status != 200 - * - * @param string $tagname The tag name of the property to find the href for - * @param integer $which Which instance of the tag should we use - */ - function HrefForProp( $tagname, $i = 0 ) { - if ( isset($this->xmltags[$tagname]) && isset($this->xmltags[$tagname][$i]) ) { - $j = $this->xmltags[$tagname][$i]; - while( $j-- > 0 && $this->xmlnodes[$j]['tag'] != 'DAV::href' ) { - // printf( "Node[$j]: %s\n", $this->xmlnodes[$j]['tag']); - if ( $this->xmlnodes[$j]['tag'] == 'DAV::status' && $this->xmlnodes[$j]['value'] != 'HTTP/1.1 200 OK' ) return null; - } - // printf( "Node[$j]: %s\n", $this->xmlnodes[$j]['tag']); - if ( $j > 0 && isset($this->xmlnodes[$j]['value']) ) { - // printf( "Value[$j]: %s\n", $this->xmlnodes[$j]['value']); - return rawurldecode($this->xmlnodes[$j]['value']); - } - } - else { - printf( "xmltags[$tagname] or xmltags[$tagname][$i] is not set\n"); - } - return null; - } - - - /** - * Return the href which has a resourcetype of the specified type - * - * @param string $tagname The tag name of the resourcetype to find the href for - * @param integer $which Which instance of the tag should we use - */ - function HrefForResourcetype( $tagname, $i = 0 ) { - if ( isset($this->xmltags[$tagname]) && isset($this->xmltags[$tagname][$i]) ) { - $j = $this->xmltags[$tagname][$i]; - while( $j-- > 0 && $this->xmlnodes[$j]['tag'] != 'DAV::resourcetype' ); - if ( $j > 0 ) { - while( $j-- > 0 && $this->xmlnodes[$j]['tag'] != 'DAV::href' ); - if ( $j > 0 && isset($this->xmlnodes[$j]['value']) ) { - return rawurldecode($this->xmlnodes[$j]['value']); - } - } - } - return null; - } - - - /** - * Return the ... of a propstat where the status is OK - * - * @param string $nodenum The node number in the xmlnodes which is the href - */ - function GetOKProps( $nodenum ) { - $props = null; - $level = $this->xmlnodes[$nodenum]['level']; - $status = ''; - while ( $this->xmlnodes[++$nodenum]['level'] >= $level ) { - if ( $this->xmlnodes[$nodenum]['tag'] == 'DAV::propstat' ) { - if ( $this->xmlnodes[$nodenum]['type'] == 'open' ) { - $props = array(); - $status = ''; - } - else { - if ( $status == 'HTTP/1.1 200 OK' ) break; - } - } - elseif ( !isset($this->xmlnodes[$nodenum]) || !is_array($this->xmlnodes[$nodenum]) ) { - break; - } - elseif ( $this->xmlnodes[$nodenum]['tag'] == 'DAV::status' ) { - $status = $this->xmlnodes[$nodenum]['value']; - } - else { - $props[] = $this->xmlnodes[$nodenum]; - } - } - return $props; - } - - - /** - * Attack the given URL in an attempt to find a principal URL - * - * @param string $url The URL to find the principal-URL from - */ - function FindPrincipal( $url = null ) { - $xml = $this->DoPROPFINDRequest( $url, array('resourcetype', 'current-user-principal', 'owner', 'principal-URL', - 'urn:ietf:params:xml:ns:caldav:calendar-home-set'), 1); - - $principal_url = $this->HrefForProp('DAV::principal'); - - if ( !isset($principal_url) ) { - foreach( array('DAV::current-user-principal', 'DAV::principal-URL', 'DAV::owner') AS $href ) { - if ( !isset($principal_url) ) { - $principal_url = $this->HrefValueInside($href); - } - } - } - - return $this->PrincipalURL($principal_url); - } - - - /** - * Attack the given URL in an attempt to find a principal URL - * - * @param string $url The URL to find the calendar-home-set from - */ - function FindCalendarHome( $recursed=false ) { - if ( !isset($this->principal_url) ) { - $this->FindPrincipal(); - } - if ( $recursed ) { - $this->DoPROPFINDRequest( $this->principal_url, array('urn:ietf:params:xml:ns:caldav:calendar-home-set'), 0); - } - - $calendar_home = array(); - foreach( $this->xmltags['urn:ietf:params:xml:ns:caldav:calendar-home-set'] AS $k => $v ) { - if ( $this->xmlnodes[$v]['type'] != 'open' ) continue; - while( $this->xmlnodes[++$v]['type'] != 'close' && $this->xmlnodes[$v]['tag'] != 'urn:ietf:params:xml:ns:caldav:calendar-home-set' ) { - // printf( "Tag: '%s' = '%s'\n", $this->xmlnodes[$v]['tag'], $this->xmlnodes[$v]['value']); - if ( $this->xmlnodes[$v]['tag'] == 'DAV::href' && isset($this->xmlnodes[$v]['value']) ) - $calendar_home[] = rawurldecode($this->xmlnodes[$v]['value']); - } - } - - if ( !$recursed && count($calendar_home) < 1 ) { - $calendar_home = $this->FindCalendarHome(true); - } - - return $this->CalendarHomeSet($calendar_home); - } - - /* - * Find own calendars - */ - function FindCalendars( $recursed=false ) { - if ( !isset($this->calendar_home_set[0]) ) { - $this->FindCalendarHome(); - } - $properties = - array( - 'resourcetype', - 'displayname', - 'http://calendarserver.org/ns/:getctag', - 'http://apple.com/ns/ical/:calendar-color', - 'http://apple.com/ns/ical/:calendar-order', - ); - $this->DoPROPFINDRequest( $this->calendar_home_set[0], $properties, 1); - - return $this->parse_calendar_info(); - } - - /** - * Do a PROPFIND on a calendar and retrieve its information - */ - function GetCalendarDetailsByURL($url) { - $properties = - array( - 'resourcetype', - 'displayname', - 'http://calendarserver.org/ns/:getctag', - 'http://apple.com/ns/ical/:calendar-color', - 'http://apple.com/ns/ical/:calendar-order', - ); - $this->DoPROPFINDRequest($url, $properties, 0); - - return $this->parse_calendar_info(); - } - - /** - * Find the calendars, from the calendar_home_set - */ - function GetCalendarDetails( $url = null ) { - if ( isset($url) ) $this->SetCalendar($url); - - $calendar_properties = array( 'resourcetype', 'displayname', 'http://calendarserver.org/ns/:getctag', 'urn:ietf:params:xml:ns:caldav:calendar-timezone', 'supported-report-set' ); - $this->DoPROPFINDRequest( $this->calendar_url, $calendar_properties, 0); - - $hnode = $this->xmltags['DAV::href'][0]; - $href = rawurldecode($this->xmlnodes[$hnode]['value']); - - $calendar = new CalendarInfo($href); - $ok_props = $this->GetOKProps($hnode); - foreach( $ok_props AS $k => $v ) { - $name = preg_replace( '{^.*:}', '', $v['tag'] ); - if ( isset($v['value'] ) ) { - $calendar->{$name} = $v['value']; - } - /* else { - printf( "Calendar property '%s' has no text content\n", $v['tag'] ); - }*/ - } - - return $calendar; - } - - - /** - * Get all etags for a calendar - */ - function GetCollectionETags( $url = null ) { - if ( isset($url) ) $this->SetCalendar($url); - - $this->DoPROPFINDRequest( $this->calendar_url, array('getetag'), 1); - - $etags = array(); - if ( isset($this->xmltags['DAV::getetag']) ) { - foreach( $this->xmltags['DAV::getetag'] AS $k => $v ) { - $href = $this->HrefForProp('DAV::getetag', $k); - if ( isset($href) && isset($this->xmlnodes[$v]['value']) ) $etags[$href] = $this->xmlnodes[$v]['value']; - } - } - - return $etags; - } - - - /** - * Get a bunch of events for a calendar with a calendar-multiget report - */ - function CalendarMultiget( $event_hrefs, $url = null ) { - - if ( isset($url) ) $this->SetCalendar($url); - - $hrefs = ''; - foreach( $event_hrefs AS $k => $href ) { - $href = str_replace( rawurlencode('/'),'/',rawurlencode($href)); - $hrefs .= ''.$href.''; - } - $this->body = << - - -$hrefs - -EOXML; - - $this->requestMethod = "REPORT"; - $this->SetContentType("text/xml"); - $this->DoRequest( $this->calendar_url ); - - $events = array(); - if ( isset($this->xmltags['urn:ietf:params:xml:ns:caldav:calendar-data']) ) { - foreach( $this->xmltags['urn:ietf:params:xml:ns:caldav:calendar-data'] AS $k => $v ) { - $href = $this->HrefForProp('urn:ietf:params:xml:ns:caldav:calendar-data', $k); - // echo "Calendar-data:\n"; print_r($this->xmlnodes[$v]); - $events[$href] = $this->xmlnodes[$v]['value']; - } - } - else { - foreach( $event_hrefs AS $k => $href ) { - $this->DoGETRequest($href); - $events[$href] = $this->httpResponseBody; - } - } - - return $events; - } - - - /** - * Given XML for a calendar query, return an array of the events (/todos) in the - * response. Each event in the array will have a 'href', 'etag' and '$response_type' - * part, where the 'href' is relative to the calendar and the '$response_type' contains the - * definition of the calendar data in iCalendar format. - * - * @param string $filter XML fragment which is the element of a calendar-query - * @param string $url The URL of the calendar, or null to use the 'current' calendar_url - * - * @return array An array of the relative URLs, etags, and events from the server. Each element of the array will - * be an array with 'href', 'etag' and 'data' elements, corresponding to the URL, the server-supplied - * etag (which only varies when the data changes) and the calendar data in iCalendar format. - */ - function DoCalendarQuery( $filter, $expand_filter, $url = null ) { - - if ( isset($url) ) $this->SetCalendar($url); - - $this->body = << - - - -$expand_filter - - -$filter - -EOXML; - - $this->requestMethod = "REPORT"; - $this->SetContentType("text/xml"); - $this->DoRequest( $this->calendar_url ); - - $report = array(); - foreach( $this->xmlnodes as $k => $v ) { - switch( $v['tag'] ) { - case 'DAV::response': - if ( $v['type'] == 'open' ) { - $response = array(); - } - elseif ( $v['type'] == 'close' ) { - $report[] = $response; - } - break; - case 'DAV::href': - $response['href'] = basename( rawurldecode($v['value']) ); - break; - case 'DAV::getetag': - $response['etag'] = preg_replace('/^"?([^"]+)"?/', '$1', $v['value']); - break; - case 'urn:ietf:params:xml:ns:caldav:calendar-data': - $response['data'] = $v['value']; - break; - } - } - return $report; - } - - - /** - * Get the events in a range from $start to $finish. The dates should be in the - * format yyyymmddThhmmssZ and should be in GMT. The events are returned as an - * array of event arrays. Each event array will have a 'href', 'etag' and 'event' - * part, where the 'href' is relative to the calendar and the event contains the - * definition of the event in iCalendar format. - * - * @param timestamp $start The start time for the period - * @param timestamp $finish The finish time for the period - * @param string $relative_url The URL relative to the base_url specified when the calendar was opened. Default null. - * - * @return array An array of the relative URLs, etags, and events, returned from DoCalendarQuery() @see DoCalendarQuery() - */ - function GetEvents( $start = null, $finish = null, $relative_url = null ) { - $this->SetDepth('1'); - $filter = ""; - if ( isset($start) && isset($finish) ) - { - $range = ""; - $expand_filter = ""; - } - else - { - $range = ''; - $expand_filter = ""; - } - - $filter = << - - -$range - - - -EOFILTER; - - - return $this->DoCalendarQuery($filter, $expand_filter, $relative_url); - } - - - /** - * Get the todo's in a range from $start to $finish. The dates should be in the - * format yyyymmddThhmmssZ and should be in GMT. The events are returned as an - * array of event arrays. Each event array will have a 'href', 'etag' and 'event' - * part, where the 'href' is relative to the calendar and the event contains the - * definition of the event in iCalendar format. - * - * @param timestamp $start The start time for the period - * @param timestamp $finish The finish time for the period - * @param boolean $completed Whether to include completed tasks - * @param boolean $cancelled Whether to include cancelled tasks - * @param string $relative_url The URL relative to the base_url specified when the calendar was opened. Default ''. - * - * @return array An array of the relative URLs, etags, and events, returned from DoCalendarQuery() @see DoCalendarQuery() - */ - function GetTodos( $start, $finish, $completed = false, $cancelled = false, $relative_url = "" ) { - - if ( $start && $finish ) { - $time_range = << -EOTIME; - $expand_filter = ""; - } - - // Warning! May contain traces of double negatives... - $neg_cancelled = ( $cancelled === true ? "no" : "yes" ); - $neg_completed = ( $cancelled === true ? "no" : "yes" ); - - $filter = << - - - -COMPLETED - - -CANCELLED -$time_range - - - -EOFILTER; - - return $this->DoCalendarQuery($filter, $expand_filter, $relative_url); - } - - - /** - * Get the calendar entry by UID - * - * @param uid - * @param string $relative_url The URL relative to the base_url specified when the calendar was opened. Default ''. - * - * @return array An array of the relative URL, etag, and calendar data returned from DoCalendarQuery() @see DoCalendarQuery() - */ - function GetEntryByUid( $uid, $relative_url = null ) { - $this->SetDepth('1'); - $filter = ""; - if ( $uid ) { - $filter = << - - - -$uid - - - - -EOFILTER; - } - - return $this->DoCalendarQuery($filter, $expand_filter, $relative_url); - } - - - /** - * Get the calendar entry by HREF - * - * @param string $href The href from a call to GetEvents or GetTodos etc. - * - * @return string The iCalendar of the calendar entry - */ - function GetEntryByHref( $href ) { - $href = str_replace( rawurlencode('/'),'/',rawurlencode($href)); - return $this->DoGETRequest( $href ); - } - - /** - * Get calendar info after a PROPFIND - */ - function parse_calendar_info() { - $calendars = array(); - if ( isset($this->xmltags['urn:ietf:params:xml:ns:caldav:calendar']) ) { - $calendar_urls = array(); - foreach( $this->xmltags['urn:ietf:params:xml:ns:caldav:calendar'] AS $k => $v ) { - $calendar_urls[$this->HrefForProp('urn:ietf:params:xml:ns:caldav:calendar', $k)] = 1; - } - - foreach( $this->xmltags['DAV::href'] AS $i => $hnode ) { - $href = rawurldecode($this->xmlnodes[$hnode]['value']); - - if ( !isset($calendar_urls[$href]) ) continue; - - // printf("Seems '%s' is a calendar.\n", $href ); - - - $calendar = new CalendarInfo($href); - - /* - * Transform href into calendar - * /xxxxx/yyyyy/caldav.php/principal/resource/ - * t-3 t-2 - */ - $pieces = preg_split('/\//', $href); - $total = count($pieces); - $calendar_id = $pieces[$total-3] . ':' . $pieces[$total-2]; - $calendar->calendar = $calendar_id; - - $ok_props = $this->GetOKProps($hnode); - foreach( $ok_props AS $v ) { - switch( $v['tag'] ) { - case 'http://calendarserver.org/ns/:getctag': - $calendar->getctag = isset($v['value']) ? - $v['value'] : ''; - break; - case 'DAV::displayname': - $calendar->displayname = isset($v['value']) ? - $v['value'] : 'calendar'; - break; - case 'http://apple.com/ns/ical/:calendar-color': - $rgba_color = isset($v['value']) ? - $v['value'] : '#ffffffff'; - $calendar->rgba_color = $rgba_color; - $calendar->color = - $this->_rgba2rgb($rgba_color); - break; - case 'http://apple.com/ns/ical/:calendar-order': - $calendar->order = isset($v['value']) ? - $v['value'] : '1'; - break; - } - } - $calendars[$calendar_id] = $calendar; - } - } - - return $calendars; - } - /** - * Issues a PROPPATCH on a resource - * - * @param string XML request - * @param string URL - * @return TRUE on success, FALSE otherwise - */ - function DoPROPPATCH($xml_text, $url) { - $this->DoXMLRequest('PROPPATCH', $xml_text, $url); - - $errmsg = ''; - - if ($this->httpResultCode == '207') { - $errmsg = $this->httpResultCode; - // Find propstat tag(s) - if (isset($this->xmltags['DAV::propstat'])) { - foreach ($this->xmltags['DAV::propstat'] as $i => $node) { - if ($this->xmlnodes[$node]['type'] == 'close') { - continue; - } - // propstat @ $i: open - // propstat @ $i + 1: close - // Search for prop and status - $level = $this->xmlnodes[$node]['level']; - $level++; - - while ($this->xmlnodes[++$node]['level'] >= $level) { - if ($this->xmlnodes[$node]['tag'] == 'DAV::status' - && $this->xmlnodes[$node]['value'] != - 'HTTP/1.1 200 OK') { - return $this->xmlnodes[$node]['value']; - } - } - } - } - } else if ($this->httpResultCode != 200) { - return 'Unknown HTTP code'; - } - - return TRUE; - } - - /** - * Queries server using a principal-property search - * - * @param string XML request - * @param string URL - * @return FALSE on error, array with results otherwise - */ - function principal_property_search($xml_text, $url) { - $result = array(); - $this->DoXMLRequest('REPORT', $xml_text, $url); - - if ($this->httpResultCode == '207') { - $errmsg = $this->httpResultCode; - // Find response tag(s) - if (isset($this->xmltags['DAV::response'])) { - foreach ($this->xmltags['DAV::response'] as $i => $node) { - if ($this->xmlnodes[$node]['type'] == 'close') { - continue; - } - - $result[$i]['href'] = - $this->HrefForProp('DAV::response', $i+1); - - $level = $this->xmlnodes[$node]['level']; - $level++; - - $ok_props = $this->GetOKProps($node); - - foreach ($ok_props as $v) { - switch($v['tag']) { - case 'DAV::displayname': - $result[$i]['displayname'] = - isset($v['value']) ? $v['value'] : ''; - break; - case 'DAV::email': - $result[$i]['email'] = - isset($v['value']) ? $v['value'] : ''; - break; - } - } - - } - } - } else if ($this->httpResultCode != 200) { - return 'Unknown HTTP code'; - } - - return $result; - } - - /** - * Converts a RGBA hexadecimal string (#rrggbbXX) to RGB - */ - private function _rgba2rgb($s) { - if (strlen($s) == '9') { - return substr($s, 0, 7); - } else { - // Unknown string - return $s; - } - } - -} diff --git a/sources/libs/font-awesome/.gitignore b/sources/libs/font-awesome/.gitignore deleted file mode 100644 index 51d8053..0000000 --- a/sources/libs/font-awesome/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.pyc -*.egg-info -*.db -*.db.old -*.swp -*.db-journal - -.coverage -.DS_Store -.installed.cfg - -.idea/* -.svn/* -src/website/static/* -src/website/media/* - -bin -build -cfcache -develop-eggs -dist -downloads -eggs -parts -tmp -.sass-cache - -src/website/settingslocal.py -stunnel.log \ No newline at end of file diff --git a/sources/libs/font-awesome/FontAwesome-Vectors.pdf b/sources/libs/font-awesome/FontAwesome-Vectors.pdf deleted file mode 100644 index 0e86cb9..0000000 --- a/sources/libs/font-awesome/FontAwesome-Vectors.pdf +++ /dev/null @@ -1,3169 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R 31 0 R 62 0 R 110 0 R 166 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - 2012-06-03T23:44:11-04:00 - Adobe Illustrator CS5.1 - 2012-06-03T23:52:53-04:00 - 2012-06-03T23:52:53-04:00 - - - - 92 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAABcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8An9hZeTLW3Mt3a+bbCeJm kW6u7KT1lmCtDGUkt4XUuy3BCcTtx3pTFU3fSND1AcnvvN6zmaW/jR7e7SSKYxcDFFLJbUQhHZU4 vTc0bFU20Ty5Z6oLl7fXvNEfKOFGivWurT0+MDwfuzPBFyc15uVLfGAx7Yqj/wDlXURt1jk8wa1L NHI0kV490huEDrGhjSQRghKQjbuSak1xVQuvyz9XTpbVPMutGchGtbqe7MjQyRtIwdSojf4vWKvR gSoCgimKqsn5a2hZ3i1vVraSVGWSS3uER2do1j9ZnMbO8ihfhZ2Yip7UAVU9O/Lq/tLiK5l806vd yrffXJY5bmX0DHyLC3SMOOKUopDMy0r8PSirNMVdirsVdirsVY1qa6UNRuWvRrNWdeJtjqBhr6IB 9IWR2WnXltz6fFiqv5cm0ZZprewTUw7KJHbUU1LjQMR8El8ONatUqpqeuKp9irF9V/RX6Suvrya1 T1bfg1qdQMHPg1PSFkahf9+1HGtK4qlsA8oPMnEeZuYPFTJ/iUKK/DU8/h/a69vvxVmOn2EFhbC3 heZ0BJDTzS3D7/5czO1PauKpBrMGkpfX8t+dbZJTbEizbUWiUqrgfV1sTzX/AItpsTSuKovyza6P WW609tU7xOupyan48qrFqDf8Mq+1cVT3FWNa++mm/mXUF1kxKkJRrAXwhqWf7B0/96W2+Ou1CMVX eT/0GfrR0ttWahAlOqnVKfbfaMajtsahuG/Tl2xVkeKsV1G/iGq38K6lrVvJEyepHa2RuIF5QAhY m+qXAptyJ5fb2r+ziq/Sbky6tCo1fWrinLlb3enC3tn2Y/HKbGClO1JBWg613VZPirGtXuEjvp6a nrFu/qwBo7Oxa5iWqGioTZ3AKP1kYE0PdemKrNHu/UvbQfpfW7nmXpFeab9Xifipr6r/AFC39P7Q K/GtSKCu4KrKMVY5rt1HHPcgalq1pIhg5iwsjdBAQ9PTBtLoMG/bIrTbpiqN8uRym2e4bUr/AFCO cgxjUbeO1kj47ELGttZuK/5an2xVNsVYvrd1FFqF2o1XWLaTjblo7Gz+txxg+oB6Y+qXVedP3nWn w/ZxVvyzNK9yrSavrN/zD8YtR09bSMDkaEsLK1IanSrb+GKsnxViuo31nFqt+Lvze2nIHRY7L/Qo RCfq4ZlDzxSNJyB9Xrt8tsVRuhXVhcX0q2vmY6y8CH1rMSWLhBIQVdhbRRuKcSFqabnr2VT3FWMa rqunx6jdQ3Pmo6SYprdRBS0hCNJGSIvUuopBJ6v2ttx2piqpp1i+pWn1zT/N17e2kx/d3EH6Nkj+ ByGCslrTr8J/riqf28TxW8cUkz3DooVp5AgdyBQswjVEqep4qB7Yqx7XNU02K5u4rrzO+i+kYCSf qkSx+oH4qJLuGRH9TiajcinbFUX5e8weX7uKOxsvMNvrd3GrFpVntZJ3ANSzLbCNPh5AfCgxVOsV SDzBdWdu8j3nmf8AQkZ9EKvOyj4El/2rqOX+96b/AMvw98VUdB80+VeUenp5tttZvp3PoGS5sjO5 I2REtVhVqcT0SuKslxVjusaw9ldzK3mHTbAFvhgvYgWQCINxB+sQVNfj+W3viqaaLereWXrC+ttQ o7IbizHGKqn7NPUn3Xv8WKo7FWO61rK2V1Io8xadp7erChgv0VgnNCRGKT2zcpKclLE+wxVH+Xby S90uO6fUrTVlkZvTvbBPTgZVPEgD1rmpVgQfj+jFUzxVjeu6vJYXF0zeY9N01B6ASLUIgyxcg9eT C4tiTLT4akUp3rirvK+r3mo3U5PmDSNatI4weGmQskiMzEAu/wBbul4/AR03Py3VZJirH9f12Cyl lRfMOnaXPGITJHqCq6oJC/ElRPasDLxPGrfs7Driq/y1e6jfqbs63pmsWFGQPptu0YEooR+9+t3S 0CndaV3Briqe4qxrVdYnsr+6V9d0fTYuQ9KO5jLTbQBm9Um5gHKvxCg+x9+KorSfMukz3h06TXdN vtTkPOC1tHRJfTEYJ/dGad23DNyFPh7bVKqd4qxzWdZeyu5QfMGkaaPWhjWO8i5SAMhPpyN9agq8 h3T4RQdmxVdpXnDQXVLe78x6Td3zuUT6rLHEGPEHisbTTty3r9rFWQ4qxnWtau7G6vRLr2jaVbIb f6ubxGeROatzE9bm3Hxlf3ZFOh64qifK+qS6lHNMNc0zW4UIT1NMj4Kj9SHYXN0OlNtjiqe4qx3X 9TutPnmlfWtJ0i2YQCGS/jLPyJcMJCbm2FGoPTp3B64qgtJ8wXeoahbW9t5u0C/ZvjktLW3JnkjX d/Tpfycdu/Bqe+KsvxVJ7iXVo766OnWunzElfVMlw8E20fwmXhDNXfYf5O/tiq17vzl6pEel6c0P HZ21GdW5U6cRZMKV78voxVMtPfUHtEbUIYbe7NfUit5WnjG548ZHjgZvhpX4BiqXTya3FqF0dPtd On5PCDzuJLebhwPIylIJ6sD9geHfFXQXfm9pR6um6csBJq6ahO7U2p8Js1B7/tf2KpziqU3rapDd 3Eml2lhcXLiEOJp3tpCo5/3jpDcEgfsbfzYqitMl1aSFjqltb2txyPCO1uHuUKUHxF3htiDWu3H6 cVRmKpVe3GtpdT/o63sbpwIgEmuJLeQA8ywkKQ3HTqm2+/TFUZp8moSW4a/higuK7pBK06UoNw7R wn/hcVROKsZ1XQBc6jczr5b0e8aYqTdXbhZpSsPDlJS1m+z/AHY+I/D/AMDiqpoehLZ6o058u6Rp oWNhHeWL87irkVUr9Ut+KtTc+oenTFWRYqxvWdAS6vZpx5e0jUHllgZpr0hJHESEB2YW9wWeOtEr 2ruMVRvlaxlsdKjtX0qy0dY/sWWnymaJa+J9G2+Lx+H6cVTfFWM63okl7dXhby5pGorKbfhLfuFa f01avqf6NcmsVfg69T0xVvy95S0izuVv5fLekaVqUPIW8unKrsFYUb94be1YHt06YqyXFWL65otx fahdM3lzR9ShkWARz378ZJTHzJWT/Rrn+65fB16npiqP8t2EthFNCdK0/SYXKSKmnSl1dyvBi6m3 tgKBFCneo8KYqnOKsVvdMs21m/lufKC36zSRul+DZzGYi3VC5S4kiMfED0tq1+WKq/l3SNFivpLq 38pJoV0qlFvGh09HdSRVVe0lmeh/yqYqyPFWLapptpLql5Ld+UU1WOSS2KXQNnM0rJGw9Ro7p4hH 6P2QQSxrsMVRXlC10+1tZIbDyy/luA8H9Jks4/VYilSLSab4lCivOh/HFU/xVi+s6daTXt+135TX WIJfqxEgNnKZ2UOCxiupIUUwig5VqQfbFVTy5pekQ3jyW3lFdBkjjAjujDp6Fg1SUU2kszilTWtB irJMVY5runWc1zcvd+WTrccgtxQm1lDlOe4iu5Io09Pl1Bqa+2KoEaH5enaKGfyAgikCo7yW+ksk allqGAnY8V+0eIPTbegKrKv0fYfUf0f9Wi+oen6H1Tgvo+lx4+n6dOPHjtxpSmKsdv7BG1e9mGi6 nI8kicruzvvQWbjAAG4fWreir9ilPtCtP2sVQtpo6XF4ltPo/mC0gkZma7l1mRo0IBpyEWoySb9u Kmh8OuKszAoKYqxfVrQSajdMNF1SesluxurG+FsJaIw5BfrdsQsf2WWnxVrRsVXafqN/p9u1vB5Z 1ho1o4ae7srh2LBaj1J7+R9vc022xVkw6eHtirGNasRJeXsn6F1O4Lm3H1jT78WpmCK/2ALu1KCP lRq05V/apiqFsvL9tezy2s+na/p0fpUW9m1iZlY1DBV9HUJ5OYJ6slPfsVWXxRrHGkaklUAUFmLt QCm7MSxPuTirHddsI3vLmUaTqd28i24afT776qX4GWir/pdrx9Pl8XTlyH2qbKo7yzaLbabxFpe2 Rd2ZrbULtr2Veg2kM92ApA2UP9AxVNsVYxqFjE2qXcq6drFy7yKZJLa9a3hqIFUGJDdW440+EgD7 e9P2sVa0+7vdNjcW3lzWpfVclxc31rdMtCNwbnUJOKnkaBT23HTFWUYqxnV7JHv7lxpmsXTtLAWe zvjbRnjGQGjH1u2+Beki0+I70bFV2l3F3p8LrB5f1ch2QkXV7b3TfZAqGnvpSKd6Hc+PXFWSYqxj WrRJbu9YadrN47G35fUr1rRCFV6egTd2oHGv7yhFajriqI0S0EWomT9HaraloaGW+vzcwbFfhEX1 y5o/+UE7H4t91U/xVjWu26zXtyP0Xq943G3JexvfqiMAZKCI/W7WhWp9TpWq9cVVfKySQGaD9E6r YRt8Zl1O9S9BINOMZ+uXrrtvSgH04qyDFWMahMseq3ZGoa1bEuimO3szcW20AP7km1uBx3qxB+3t XtiqZ+X39WzNwL68vkdiga+gW2kUxMUb92ILVhVh3X5bYqmmKsX1a4WLUbs/X9btD6tuD9UszdQH 92TxiH1W6+A/7sYdGpuMVRvle/S6iuFF3qd20ZTk+qWL2LCq0pHW2s1cHjU0DUPhsMVTvFWMa1Os V7ekX+tWbf6Pyays2u4hUPQQKbW7U1/3bQbfDWmKoG91NIvTL675ijDcVHp6QXBLEAciNMehqfbF WZxgiNQWLkAAu1AT7mgAr9GKsa1x0i1C5lGo61ZuVt1P1G0a7hAq5/dIbW7Wpr+8IG3w9MVVfLur wGT6s13q99JM/GOTUdNmtglELfbWztEC0HV++1a7YqyLFWLX92i6zeKur6xEUaNXtrWw9eCI+jyo kn1ObkGBDk8z8W1f2cVRmgaiqhbaW71LUJriR3jnvrCS24KK0QsltbRqBw257kn3GKp7irF9Xu0T ULpBrGrQOstvyt7GxFysQaM0AP1S5qklKs1TRhSq9MVR2hW1y6xXv6X1G7t2Ur9Xv7eG2YkEjk6f VbaZT91fliqdYqxjWneC7vpTrOrQK5t+MFhZC6EFFYH06Wl1yEnV6147fZxVZZa5bW1zymvdcvQS sYin0mcJVhs1YbGI/M8qDv2xVkGnalb6hb/WIEnjTkV43ME1s9RQ/wB3Okb0360xVItbvoo7+6jG sapbyItuWttPshdekGMlGAFpdE+p+3WvGg+zXdVS0HWIUvfTk1HXdRM5WKNL/SZbeKNmNeXqR2Fo B03Z24jFWWYqxnUddjttVuoB5k0+zeNkDWV9EpMdYQ4CsJrckt9uprtttiqlDrt3dNbQWnmrQ5bi diEWO3MhloWqI1W+rUBSO+4PyxVleKsZ1jWxZ39wv+JdO08iSBPquoRKVjDox4gie2YvN1BLEbUC 9cVTDyzq8Gp6eZY9XsNZkjcpNdaZRYQ3UJxE11xYKRWr4qm2Ksb13zFbWk91FH5h07S5rb0BOmox h44/VDla/v7XeQDb4+2KoSz1vUtSu3tNM826DdXSUZreG1aaRVpX4lTUK0PXp0xVlkAmEKCd1eYA eo6KUUt3KqWcge3I4qxzW9eWzvruMeZNM01oltq29/EGWH1fUoWb6xbEmbj8O+3Hoa4qifL3mGyv VWF9e0zVruQsYv0dxQFVrX4PrF0xpTc8sVT3FWNalrv1bVLiAeZdJtBGyqbK6QNNETFz4uRdQ7sK SCqj4fvxVCW/mZryWO1s/N2gzXjMYxHFAZGdySAqIt9Wo2r16H6FWXxiQRqJCGkAHNlHEE9yAS1B 9OKsb1jWZrK7nD+YtJ06ITQxxQ3kfJ05Rlmjc/Wrf45PtJt07HFUX5Xu7q8tpLltW07VrR2/cTaX AYow25k5N9Zu1ckmu1Ke+Kp1irG9c1qeynui3mDSdLhjaBYxfJzMZZWLCX/Sbb+82KdOnfFUz0O5 uLm1aeTULTUo3b9xPYxmOMKFAKkma45HlU1qPCnfFUxxVIfMOtx2JZV17TNKdPS5jUFD8fUL05D6 xbEepxonup69lUkTztbR3Cm588+WTAG/eRrGEegJqOZ1Fwp26lcVZl+kLD6j+kPrMX1D0/X+t819 H0uPL1PUrx48d+VaUxVKmfXY9WvzZW2mXEbNH1nkt7kARD/egrDPyPL7PSi4qrWl15qaRBd2FhFE 0lGeK9mlYR0+0qtaRAt/k8h88VTbFUnuJdcj1C5+oQadcAtCDHJPJbzBOB5PKyRT8jX7C8RsPteC qI02fXpHcanZ2lsgA4G2upLkltqgh7e3p95xVMMVSi7k1eK8un0y30+5mYQgxyzPbS0AavqyJFck /wCQOHjiqnHd+di6iTStNVCyh2XUZ2IQn4yAbFakDoK7+IxVO8VSm+n8wx3sw0+KwuowkXCCeeW3 lBJfmXdIrmq7fAOA774qpQ3nnM3KLPpemx25dRLImozu6oWoSqGxQMadByFTtXviqd4qxrU9Ie71 G4J0HRr9OYZZbqWk7VhCFpF+qzUP7A+I/B/wOKoWLQr23u1vLDyr5fS5jdCl0tw0cgKxekxDJYEh k3Rd/s9x0xVl+Ksc1nSbi9uZQ+h6RqUAmikhN7IVkJEdGkYG1nAdKAJQ7r3GKr/K2jy6YZUXQNL0 SGUVkGmSl+bq3w1H1W1HGjMfY9sVZBirG9c0e5vp7oSaDo+pwu0HoC+kKvIEVuRlra3ABQn93Tlt Xpiqr5Z0RNOaVjoOlaM7qqqdMfmXHJmKv/o1pQDYjruT07qp/irHtf0X67LN/uC0nVOfo7X78Wfh z3c/Vrj7Ffg69+mKoPTfJmkFo4r7ynodnCIySLTjMQ9RRVVrS3BX4m+Kv0b4qyr0IPQ9D019Dj6f pUHDhSnHj0pTamKsa1DQ5LrVr2U+WNKu43dGW9vJh6k59AIXKC2n4Faen13Xf2xVF6Nb61ZXAtU0 XS9O0pmZ3azupC/JgSW9AWcKEs1K/vMVT3FUg1zRFvJC40LS9SZpY3Zr9+JPBSA/+81x8adF9u4x VB6N5M0cSepqHlPQrGSDgbR7JUnYEMXO72ltw4vQrStTvtirK8VY3reivfT3YPlzStSVzAwl1CQD 1uAYfGPq1wVMX7PWte2KoGz0C+066hu9O8n+X7W7RGQT29yYnj5BzxV108Nwb4a0/mO226rL4DMY YzOqpMVBlRGLqGp8QViFJFehoPlirHtc0P67dXLjy7pepGQW9ZdQkC+r6Zk2YfVrmhh5fDsa8j0x VS0fQrmw1CGaDyvoenL8SzXVnOfWVGZj8AFjDy5VqQXG5PzKrKcVYGdQ8v3Usmq/oLzBbXt81b9Y or+2kVoFWFfUEMiI/wAB+H0ywPXriqpGnlafUlhMfmWOSYxmGR5PMCwPzpStH4RhSaOJAtO+2Ks4 xVK7vy1pV1cS3LieKed45JpLe6ubZnMSlE5ehJHUBT06HviqHh8m6TDcwXEdxqXOBg6q2qajIjce zxvOyOK7kEb98VTzFXYq7FXYq7FXYq7FWMajeoNVu4l1bVoXjdA8FpYGeKPlCCFDm0uAwP26hvtb f5OKpzojl9Nib6xc3VS9Jr2EW85HM/biEVvxp0HwCood+uKo7FWNaxdLHe3AGq6tbsJYA0VjZG5V KofhB+qXI4P1c9j3GKoTSrwzarb2y6x5gkYsXK3el+hbsE3MbzmwhVQeNPtgnsakYqzDFWN67d+n cXI/SmqWvD0Pg06xN16fLn9n/Rbrnz/a2PGg6VxVHeWrxLqzkdbi/ueMlDJqVo1lKPhX4VRoLSq+ /E713xVNsVYprV0seqXg/TGsWxVbetvYWBukiry3Rvqd0H5/t9eO32cVTPQ7O7HC9fV7+9t5Y/gt b6C3gKk8fiZUtraZWHE7N4nbpRVOMVY1qWqacmoXMVx5nOltDKF9A/VYQtYFcoHuYn9TY+pVTtWn TbFUw8u3ljc2sptNbGuqkpD3PO2cof8AfdbVIk29xX3xVNcVYxq2q6dHf3MN15qOkmKaACL/AESH gZIyRFzuopA/q05bbjxxVCaJ5h8txTxl/P0Wrl2ZI4JbjSwrl24qKW8MTEgkAUO5+dMVZlirH/MG padC80d15l/QfpeiSwa0j4F+fGr3ccqH1OPSnbFULpfnDybZWpS485WmocnZlubu7sVYAAAovoLA hVaV6E77nFWURSxyxpLE4kikAZHUgqykVBBHUHFWLa1q+nRapeW915sbRhCtu3o8bWERGTlT99dx So/q0+z1FO2Kpr5de3mtnubbW31u3duCzM1s6o0dVcKbaOIVr9qtfoxVNsVYzqOtta6ldxHzLpdm FkVVtLyEc4h6CvwLfWYORP8AeVp9k098VTLQNR+vW87/AKTstU9OUp6tgvBE+FWEb/vrmr0atajY jbFU0xVjGra99V1G6i/xNpVgI5beP6rew1aL1EZuDN9Zgq8v2k8AOh64ql2i+azLe2qP5w8uXlvL M0bQWcXCSV3Y8Ejb69MAzVqfhO/jWuKs4xVjWt6ybG4uyfMmmaaEMCiHUIlZYeQY/ERcWzEy/s1P bviqvo02r6gsdwdZ0zU9OJdLgWdo4D/DQKsn1udVIJHKqt9HZVPsVYvreutZX92n+KNJ04R+hS1v 4gzQ8w27n61bkiWnwbDoftdlUf5a1ZdQinI1mw1honoX09OAjBJAWQevc/F8Pt06YqnOKpPKuuS3 90tjfafCiMo4NbyTzCsQNJeM8NDyNR/k/fiqI0uHX4mf9K3tpdBqCIWtrJa0PevqXFzy/DFUwxVJ rn9NTahdR6bqGnQGNoeaSW73EwqrFllCXEFOQ4lD4V2OKrdPtPNUUqfW9V06aDlykjgsJYWYE70Y 3koBJPXicVTvFUkuJNan1G+g07UdNhlh9DjG8D3M6KysSJ0S4gPxHePptXriqvp0HmVbkvqGoWVz aEGkdtZywPX9n9491cLt3+D7sVTTFUnvLXzQ9/cPY3Wn21syxeg8trLPNUV9QScZ4AR04U6d64qi dMg16J5Dqd7bXSH+6W3tXtyu5+0XnuOW1BsBiqPxVh8+s+U9RW1n1Py7eNcXKLKY7rRriZ4g68f3 rrDLGrAfCRzJHyxVboz+SI9VraeV5dNvIJGNteHRpIeRcFWkjmSH4eS7HkVanUYqzLFUvvvLvl/U GZr/AEy0u2ZlkZp4I5CXQcUY81O6jYHtiqCTyF5Hjkikj8vabHJC/qxMlpApVx+0KIN8VT3FUvv/ AC75f1D1Pr+mWl36xRpvXgjl5mMUQtzU1KjpXpiqrpuj6TpcLQ6ZZW9jC7cmjtokhUsepIQKK4qi 8VdirsVdirHNUnWO8nIv9XtT6tCtrZm5iNIEP7utrcjhvWo/bqPbFUNYzvdXn1WPW9d9WRzxafTV giUIFdh6smnxxgMF41Zt6kKa0oqyzFWMarcLHqN1S+1q0b1bcMbSza6gNYzRYgba6UIf92MOjdxi qCW//dKf055j+0gqdI+LcjYj9GdD+0e3iMVZF5eDnThK17eXyzMzxyahAltOq1pwMSwWrKBTbmnL 3xVB+YbgQ+p/p2qWZrETJp9mbvryFFX6tdj9n4/h226YqlukzvdanFFHrvmCRhIXKXelpbW7KlSY 3lk06BQp8Q4Y9jirMMVY1r1wkV7cH6/rNm5S3Baws2u4gAZKCNfqt0nJuX7wgV+z0xVB2Fw9zcQQ x675hLyEgNcaWsCGjhj6jSadEibLx3psfHcKsxxVjuqXQS8nA1PVYOMnEx2dj9YjQ+grcQ31S4qN +da/a+Gv7OKqGlvLdagqpretyBJOTQ3enpbQsFCsU9R7CD4T4h67kA+CrKcVYvqt5GmpXSLrGrQu ktuHt7Gx+spFyjJChvqlxVJOrtU8T3XFUGt/+5X/AHO+Yx8SDkdI+LemxH6M6H9o028RirJdEilS wUyXtzfGQlxNeRJBMAdgpjSK34gU7pXFUB5guREsn+5LUrQho9tNsxdulQf2fqt2SG77be2KoDRX lutSUJruuzCN+Tw3umpawuFqeHqPp9t8PuHqfHFWW4qxrXbxI7y5j/TGp20iLbsbfTrIXTRK5kCt T6rdEiQo3LrSnbFVDSJZLq8tlTW9dloWdkvNNW1jkCNUpI72FuE8NmUkdDirLMVY/NrMdxH9d0zz DposZJUiDyqlxHzkAWONJI54fjdzsCTWtAMVc0XnH1mtxrelLcsnqRxHTpywUMAWK/X6ld+Pbf7s VT23WdYI1uHSScKBLJGpjRnp8RVC0hUE9AWPzxVB31vrjvy0++ggBZCUuLZpwFAPILwmtzVttyTT wxVCi0841FdU0/jTemnz1rTqD9dP6sVTnFUvv7bXXLtp19BblinBbm2a4RQK8to5rdiWqP2tqYqh GtPOvpELqmm+rX4WOnz8aeBH13+OKpzCJREglYPKFAkdV4qWpuQpLUBPapxVBahBrknI6de29uTx 4i4tnuFAFef2J7c1ao77UxVDC184VjrqenkAfvaafOOR51+H/Tfh+Dbvvv7YqnGKsQu/JunG7u/R 8qeX7m3n4pymVYpJI0RGAmAtJgeMq7CpFAD12xVuz8rI97bC+8paDDa25YRTwyetLCKGnpI1jCNy FqOY+nFWWqqooVQFVRRVGwAHYYql17c68kzLY21ncIHQATXUkLcCpLkhYJ/iB+yO47jFUAL7z+a0 0fSTTbbVLnr3/wClfiqeWj3T2sTXSRx3LIDNHC5ljVqbhHZYyw8CVHyxVL7y58zJcXC2VnYzwr6X 1b1ruWF2qG9X1AtvMEoQOFK8t60xVRW886E/HpemqnIAsNRnJCb8jT6kKkUG1fp23VTvFUrvbnzI lxMtjaWNxEPS+ria6lgc8uXq8wtvOFpQcKV5b1pTFVltdebWu40uNN0+O0JAmljv5pJFFK/DGbON WNexcYqm+Ksa1LSJrzULot5b0u7iEgaO6vZRzmrAql+ItpypBHpUJ+yK+2Ko/wAuafJYWs0B0qw0 iMyl0g05y8b8gKyOPQtaOab7H54qm2KsZ1fQRdX9zKvlvS79pJYJGub6QKZPTQrzp9WuCHi+yviD 1GKoK08oxPcRQ3vk3y7FYNvcSROJXDGjnjC1hErfvFU7uPHrirMY444o1jjUJGgCoigBQoFAAB0A xVj+u6Ob+a5H+HdN1Ll6H7zUZFVJQnPwt7pgYi3w1XviqG0vyN5eltnTVvKWhWx58o4bWKK5jO1O TGS2tqNuf2cVZUqqqhVACgUAGwAGKsf17Rfr0s9PL+m6nz9Cr6jIFEnDn2FvdU9Ll8NRvU9OpVQc Hl64t2ilt/KegxTwyerC0c5QxsEADowsKh+1RTb7sVZZ8XHoOVOldq/OmKsFGq+XL26+uro3mC3u b8pJfPHb6laFHEaQ0lCNEG4JT+75LtUVOKsr0KKxj09fqRujbuxdfrrXTS1bf/j8JlA8F6DtiqYY qll15b0q5nluHE8U08iSzSW91c25dok4Jy9GSOoC7ceh74q3YeXrCxujdQy3jylStLi+vLiOh41p HPLIlfgG/Hx8TiqZYq7FXYq7FXYq7FXYqxvU7+MX9xEuparbtFIBJHZ2DTopaBWChzaXAZafFVT9 qq1/ZxVT0zX7O2vhbT3us30l26RwC70qeOKNqE7SxWVuoB/aLsQKdt8VZRirGtYvUW9uEGq6vbvH LArRWNh9YROUZIVT9TuOSP1dqnidqr0xVR0TzBZ21wbae71u+lu7gxQG/wBLuI1jbfZZIrK3QR/5 TsdhWvXFWV4qxjWrwR3l6n6W1a2KfVyYrCw+siLmH/u2+p3XMScfj+1xoPs13VQthrttZ3sktxqP mC+jEdPq9zpEywqSR8StBp8Ls3+zPfbFWYg1FcVY1rd7Gl1dxjU9WtZI/q/NbCxa6CBw9OFbS6Vw 9PjpXjtXjiqSQ6ryhRv8S+ZpKivNND61UGtP0UaA9R/HFWS/4v0j9F/pH07/AOr+r9Xp+jr71vU/ 4weh6tK7cuPGu1a4qhtT1jSRf3FtN5lOlTW0gWSKtrEAXgWQJyuopA9FPqfCdq77bYql9p5m8q2d xDcXP5gxXcIU1t7i50lYpeVQHJhhhfb/ACGA2+eKsyiljljSWJxJFIAyOpBVlIqCCOoOKsZ1XU7G LUbuK681tpIjltwkBFpCEZ4yREJLqKQSer9rbcdiMVUfL3mfytDMts/neDW7q69OOCKe408NzNR+ 6S2jhYmQnoeXanuqy7FWL61qunRX19Ddeajowg+rEpS0hEJkD0/e3cUqP63Hp2p2xVC6f5k8rWhW 5n8+x39ujEMtxc6YsZLAgVaCGE7HpRu2Ksut7i3uYI7i3lSa3mUPFNGwZHRhVWVhUEEdCMVQF7pW p3M8zR6zc2UL+n6MdtHbVjKcufxTxT8hJUVqNqbYqoWWgatBJG83mPULoJJzaOSOwVZFrUI3p2qN SmxKkH3xVOsVf//Z - - - - - - Mac OS X 10.7.4 Quartz PDFContext - - - application/pdf - - - Dave Gandy - - - - - Font Awesome, the iconic font designed for use with Twitter Bootstrap - - - - - 1 - False - False - - 612.000000 - 1600.000000 - Pixels - - - - - MuseoSlab-500 - Museo Slab - 500 - Open Type - Version 1.000 - False - Museo_Slab_500.otf - - - ProximaNova-Regular - Proxima Nova - Regular - Open Type - Version 1.101;PS 001.001;hotconv 1.0.38 - False - ProximaNova-Regular.otf - - - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - - - xmp.did:F77F1174072068118C14B0E4C7F9F15B - uuid:7ea95d81-b16b-ec41-8602-038d82e980f5 - xmp.did:F77F1174072068118C14B0E4C7F9F15B - proof:pdf - - - - - saved - xmp.iid:F77F1174072068118C14B0E4C7F9F15B - 2012-06-03T23:44:11-04:00 - Adobe Illustrator CS5.1 - / - - - - - - - - - - - - - - - - - - - - - - - - - - - - endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 171 0 R/TrimBox[0.0 0.0 612.0 1600.0]/Type/Page>> endobj 168 0 obj <>stream -HWɎWq|bQ`#R)4{YU=cdȌ-#^__?\N_ޞӋ-o>^/ߞ|[cÿsuk*-/p=$Uttse[n?{qi+~6q2~b)WZ/y7zr^.rݦ{I~u7s7RZk/6Kv+rͿ~僡wa*sn,iz5]-M_tnO?8ߟ^ޞ~ZydCqCYc*a{8q'ɕ5(O5XAGqZfw}z?|5g\I_H7ng$de.{ӮLzXǍݼ iҬXdfꡚWT2rD;ģ-f{45g-|Ke˟3lES#۠#0;h>Q$h0"'NXA|͢Lf&O#T3Į.41F(t8bkb%I~雁fc -OeU*Ė]rq#(1FjH>hqQsǜ͉0J `)Ƞ- ՆMw@h3dbd1b wy Oi kAw>~>5FiƘLc0l)8G1%1?)q|` rsr0gmLdn̈́{gu;yxx_>O$3@5Ex5'GP Q N uLDBU @#x{6X8KA{APŏ< B&gL!C1AQrMg^ʙt?VLKfipкyt;fh7 -Q7^0@:fV$*mQy9L$R],H*(/5;Gc@^;;BW4JPS[qaKbs6K~Q .ck9ޅ?$[V--Ag5x~ Y"e>dXgqnH9h˽ hD{nGXEdpR@E{ -QUs ֨>|Mo -w8dF14|zm_eIAtvmmT;?ÕvY >KS334 {F7la_NTqF" uo9):{}2g^$<]vH`u}?|+cq.0N A^S^~✦xچa2^/+:W(0 hxmʷv[]@M]j:c%w?.2G,>JJPرba>g 96>>޴4/s+[5?f1QB/zJl=K> -})jFa(ڇjJ(Ӳl_ x.7I-|#fz-m^Ųpb㚚+ء4D<;:a0]E3{0mު!ԞY:#birԖ,+Odfr-ea,,.+APҹD=32'<c`$8ȏr ' -XDf7fEYu98@#QhNӤ>HEƪ:j5&i4F ?ذ1F(#!7^r3XooY\{[k&2A:*w$N=OMݗzTh|^hJT "Art dG!όb$nO /Thjy?kV!N'1$Wd0-<ިUhεʮ D.s_Lyz^Wy/fڼ_l/''EC5@A5Hxn-y/{I'Cȧ3_:۳sg+%-pUAgZ!oL! ǵ#] qu g!ƹӪWݤRsrvC`QK<[\97^w6]iNbl9E8);%u{s"tns++&ɟ}P֦t! #z7&A9i$G&n=8QFJ&*J.عNuk!↳鰃 `Q%H vG_ N4Ν/q -XL$OXJБN,.wT9BCH!% \m.q|#}-UPC!$Da$T G35^X]?H~zVET@mr)$U6 mOyk{ mMKzY Waܪ[ݓZ0fX 9 ʭ:hH6tC}䄡1'=?!Kr2ѝKEqpɫ* 4RhPGjq͡28Fkw-򹥆pˢb c(T -Eputt:sk}#%?C*ly{@w*ēA*8 -Dj`+nSW~mJ{`9Pl0YOZACw+~s\уd^Y%>r4.-0iUjnK>7GιTV꘢陕,½Un(,ByMʘԽ2+]#4{X6'=5 0BiiS -'$wj /1>@X3K^YOeN3G^;z/ ]im;RԒC]?mb4l[Whw<ۦY?e;B"/.bzq.Wky*b$Qq1:Zc8Iå%^ڗϼwő|][ar.k#;j[,]8p qi81Lpi)9lHdtX^,o3J.)_kWjg7V ?QĈ-p۪A+mm[:@xE#,K/K#FX@iUB;͟8i;lxLEV6h(HwٹaS cN1k[e\p˶I0,2AWi 4A `roΛ?#xufO"lm7.czFIc kg΍\#b+Efcf̴.ޡjAc\Zv+Oz揢 -ԵT%K05_{eʙa#޲HY8AejTI F]X}#[ )a4/.Ә0 HoBTP|E -X&UJ] OhhyۗK#ߑCaAEkyd,VT7%gTV4jw3AV^MNh%5%M0i[IE.5. VnVzoڝfn%Vp -Z.*RnAI\o`,X{*I :gӿh[(x>zl& -iX͑|UI)T}\PuS Rd~>F - :@t(#)Y%c:53]^12lBɍ￳C?7l@GgI/_S Ep;k~="vc' #,?0.ݲ{y: jԔ4^Y8뚵 m"{rC5j0Q5Y4-L?Nfւϑ&z["yJfG |u4ue΋l@[kyd2kmT4<)g%6C}tjޥs+f7*U>$E+(M[^SPF3Rӱ - ?7Gd$kQ(owOzP“( b5UW6=iؓm;XRmȧd&ޝX';53c|h,ߑS*"mpUR&;X1V߁ǃ9Ğ-ذBkߊۋK&߶{E^lEѵϋ*uc&GI1~MSPYX(|MJ-AR} .o:6~2SY~9߹|@WRS'%`a(gl/@RE$4>7m&K {@R6^o\:IA|g0;U6/-Jմ_*.\Q(= ezWV$U@}Ϩ X>l|+@4RBw=Bxx)1RLȂ~A%2yIM+iXʄ+ǚ^lޙcY4V-[9aq>x꧵o2!6j.iÜ*a4lOu&IL`A -#fu_fQGGjv+Q]!~7c勳ƦjJB~–HLz.tbyNy=O]UsrtcQE+CzOъLJG2َ~\tJ"u^v*8Iݓ0-0Gu: &Q=ى3ӵ1o$]Bhi)WL0[E:zwW'ePTQNէD-r$)GMVl)˨Ra -/eH!ϙ IeN8"2?HBR$ObiUNE}JҮ*{EFCUTKYϑZcf/;=JzD!t߅(ԻzN,>5A(rX*ĴwڅHkW)߮ȶ Kul5RX8X!_p j2.a.ʶs7t_:-mc|ڹ T&=@t. gF&?@is70ivMyͥ<dB\R=ռ/˾F7c& Տ@,i>avoO=FP`XH7d&<'rf-Oեdωdz*!9 ^Ӽ٩.\~Iz -nKN -jIɣ=`]rxnBgXX6[UKIńl -)*Sx\[BӘک@|˨6_931(麦5=ZX/9j:NP4v4)x3ZAe1DJ1h>z)5QNS A'LF NsiQDM%v18>HvGJuGʱh`Q nUegEϗE5Jܿ3JH -mNKXBMZ8_?l{LR3L?P?O TM2RUjOƻI^Ц%lMonDΥM~A] rHR5M w2iQg(Pv҄`N0]ӣiin0!X%%L)q&4)a!bqܓ"߯sM$՘iLruNj').X #&ԺaBG6}YYavϟs,/tZcf!MU6) -H /"1ۯڨyAC$j^P6& ?]K"_qf1z?H|ҕ 0 1YY=^a4OuVU>"#}Qۑ>? x\CH68ƕoUiWR[վ"]HVʼnyO5M+m3_3>e2qʳ.^̦UQH*ċN|@E^%c(_%'=`MXrNMRyBP< -.A(et $^,H -P(GA-_s8^), ۆKgc ?‘5eG.MwrM|?_|?~|[7c -Xjezw0L||^|moOgoh_:KSzWm ^˞duTAy5I}F xj,pEZ -Po lME*8qq.cYeɬw(\8Q(fsÙ[OZe -L)[Y "*] t'=g`Cy ->>56H"nV2<`fgRh=8oiz ?B0*3gyWLpYT`V, 74~ֲEiCu&Z*hIy}H -F6 -B>lCyK)hJECYHoqB`G7+=#X)Lv+T܁"aI!ˮJndQBEPLpa6.*@۫YiAR~7¶9 we&Y CTKJCϙ}b;F.\H\xVVطH킝/C/M*=3 fq-4yqXTPz5{Vj 9K4ZC!1F[<3˻T^#zr79W"%'Bh0Ǫ6$z 6~y~%2)]Wyyt/WdZ%!Rߖcf)A"Rr8U]g"(J/Gzt -T "`2`HܮTYCr:)&yhi[k"j_Ը-*F֧2n-[/A^yLһTH?6zA|G%߬H|] ̮*U|eC hGRTڙ<'w؅k# -'6n}K{Ht觨nh9$JJTCG G _h;rizh=խ`y?1̅b:N8xIIGel?Ĉ.Ă?>ayT|>|g˄ko\[TBmk#QrQ"q~}>-$ZC,cIj]yW+cYT:Pɧ]Sm)`++j,!Ŋس(,uؼf,(zIjvNAkҬc0v%-*J.:BB3!L2_z`g+]rь1j$VAlc6s'$K^240 k у;h4ԀYjǿnPcȟ8J!`#xbAƏw6[]xWp6YZ>@y)!zȶq8[-#&}c_Exoμ^? Q=c>kgy>0b6'aZ7dUpGw2˫tn*_,u^uOubԃcۍX"1BVFvR9^{ (GGO`l9fKub ].^]dFO$Xz`WR9±AQrSZPd꺬)D[sqHEyꖭBWt`w`2r.y (O.Hvώ<  ڱ2(s]%mHk9v -Lv3@!+JcQ#TVAH` -_Sd5Qܸ!5b˚_żFIxוF jZLvǙ]cC@njpZpˡTKO^;)KȮH1Az ! muBGdX8u#-P=2u+u%S_(gEw['!0SZa-ZnOv;0L^Ml663J8jqmWl4|BE'El6@#vv#}c\3C Fe.ů -VcV{GO׃Rp"Khې(CSBeA  - %Czjk3O! ʱô;^+~{ҷ^(aѯ{=S.Ja-#vbR3KoY&f۝ -m Դ[P9-Qef_N]-}Rg"*^w{Urn[m( N6zUzڲLT1Wcbn '`չwh]'uzl7ɞ-4}9>Ir<)~ʤ/9Q `Y:;TqaJtB̹qZcKc̫"9P kQ9UrXM@Ry]l.c -D 1u|&S)F{] ͙vyCɁfY\2 "O 3ƳUTx&ѲJd$ߤNܗY_mLδn l22ۂ-߱rD>Z*s`]oՎmkyQʼ$ʸodʤnqYnM B=][,*9ϝ8E_dVX[%y۔iz#iiS`ż;Q`(}dD9ޠhJ=MUS/]XK' X7|g" Pe(CU3J{@cZHPU4\69KG,D}kn}O$U|ܣR3(jcKHnPZGhMsGm)y5~;mRys) -B!FF 6/BŐ7  Qp= bfuƅx -VɅmT.YT`! dSU ( \Y sW%yt݄E BY b/5^&![X}os><(-,8fjWy70}$@LUlwFY >5<1dhe4B;/+Ѝ0~{w 8,ie,cdTŦƜƥnm6Ў,wxpiyj Fv22b,\,#,!̴ 08[w.! -6]`(# Kp.6g { -ARFbL"pHE>!V& - (+_ B #dZiz cK3ViGN8Rc)(AF>s+=pSO -7a텹@{|kyp]X3li]s46M}:ZtdW96Ϧ|㽀sƠ>wB+q] *ә}qd,aVfIvΣ -_P5"KZ%?G-q tDŒo©I`ߕ( 2e -S#zwdz :6Z'{f<)Cئ: dߴz4 ^0`~*Vo='4":ȩva`f> 聃~#8 -kHdt7Eܧ\pv%vkI cEN ] BX|# QRuۄNFˈ'mTBkspGS^S8`zN <=UPM[u lS ۂSE2iSg όj& c3t6|Lyd7h \ Oq-?'}2@x?i93MS5^CBJ x. -)`X 8K=,^ f|ؐNL -ɽ`ǰ^s-I85q!@w'ɡ2p C9,͛ C36XHAG4xۘsh _eL;~QIÉJEPu=7\}+HF1ȷ!`Zv# V:bCsL4p%A6=%wo,VQD%h]/wLv4y`_b r|U289 em@Pa >rھqQ^T+K՝UTA?O -cuF[\^"4X_TJHjECB #;2Gy6Ec8+g^;;,BAw"h$u!|{~'Uh ܙh2@a4em*vܐ2[,Ƹu;95)U $שhx[DAgtl1@%eֳUm8!4~e:ݥ+!NjCs7 G4bz w@c=$\T騎h_TZFPږ>+d-UoȰ67UwiU6S/Q^Eoe`gt7 4 pYjv=64=i}f{ ƀgJ1/<_-2O܊Sؕo)8^ZІ }jG}(䇞k;  ?0,6Kh!`S{r4ۢYt4Döq6ZgKd}}>0>aTo hǤ0*8|ψ菋sJZw͇wvN&0@O5cL;Xp.ZXEghV MJ8\̔- $Rw"w]X|#ͥ/*m*cQW:i#N )T J 2:g߇'\\}|Ma,PIpAϐ%Y '.2{'8HLif' O -1KZ('=n@% ;'|O'+m/?'O`T,XCŕ98XȘsJϯG"DGEebp 6q]-;Dp__QˢL[$>%H43 dDϩ;jqlo69Ř4~¥6x/y%+yyky`=I6ruʋd͞,(~NSޞҼ;Qe ac0؍_ Wkx PxlWI聛pkx^t܄+ v]7oZԄꉥQj܅00b: W\dJqB*S EH[wFbUly1g.zzGo0XhBTksJMFY9D5LlwT[ -Y2%mP ">W*M]BV) &#wC2"{=ơavFV&46~sL*EB:{Ct%VKa?. ca0+ΉDCh.U8v*k䦚PLK)5+Z8kVLjL;SQm&Mbwе:lW -G/R/PEnk28Lf B.}%E(300zsP߫ȴs,%x;7Ϋ"JyiA1233uR@\i͌^@澁%\ԨH}e%Hܞ-MORܲΰfhp03)K||Bh xr&G>jI)<$k|Az 33*"&tj ##^I-©|m<gnW0 -*93 *M>&o]ǭ&F K%~XZ#$yN]{@H-Ɛԋ SHFi U8(` -5YNKIFWv̓Vm;SJmo$Rud }!@a ߲wMrRh&C7T`nBG Юh6 X ( @{q [¦xX*̎yxr kpC<n*Mzj^A9p(PqE=rk捫4lX"( -d\xYN%pمkJ3]kk0ѕ^uy.Ç`=z}txLqlt~w,%6;'$֨o8In>Rj-d zJŹqxt[R,aɡNET]NU׭,-UȆfv_* B4'3"_gq5{vn`5"j^FXй -e:U -Fڤʂ|کLE}Yk:x!Q0:ԮZoezerg*sU79wSbTqM[4s -v=:Is4^onTU˨p|>~a E(Z.QC#<2ԓnٗScI;ڗBaButG١ Oo|_jDXx5SڋS^ "mc$8T k$ݲ*Γڽ ?xZWH5EP;*N^!n~I ^v`JJq;ȧddBKe0%gH>B*~O!NJeppF$Ȏߞя>;?SFŇoiס_`QgE?_>=ʳz)OO=}RBSOeLpo??]#:&7"#Os6}E.*W@c3ydCE,=ʘQMQs*RAc&;OVZ[ہ_ow86s挪 <:~|v~o^ΞK|3pVm[_8VHUM:T0/Ti|a%2cm‘ LT8ј 7ȇ%CM㗹 D7{RTu%LX|nzO44lxɎ1g 5c(g*0mAS[um Ϋ&5(^7;>,|#f#Z=Skg-} -IyE&Hr: lȢ1v - ?H )wŝ%e+jƐDƸ̿xZm>Truj4ibmu*ɕ,:E^ QxW蕳V fDPz6@ٛ/&" %4& knW2p0ا(e/ +tV`:&(|E\ -p" zXjnq}O,Cp>;WZI{܉Zu}< tz>ʛxrWr'm =t`)aBڭK!Z^qW bs2ja@~ uWB -E0#.]С3~ l.kqr_8BR9rʲiThD B5`40#70y@6z>.ٜPwz_rCp<4KNM?Zې $̜?Ym}?,2)nUArWl]/FZĩ g4D,oy -6cٶcH31! .Q@$Gz,U[%2N -ҋ[YEAOgE1Le_ږcbt[ၚe>XRUXqsQ?qPc3N]lڶ.͝b>\xY{'ę[MU{~[=Q1*3#׉Q 7h'n>{!"BE4K H ` ݊Ų -jz| &l@PZ12 >x+9V/+vjD)N>ft@쥿_df/{cjٚq(`[^LI7V |= ~#x=+|*لT\哫e0(DϰKtmZX.CdRW<&f=+Sr!cvS>mg׸ݍQA 04eZgjcB$վ!֐>ιI,wb%QvpҤQ<|-=۽X*&Yۚr@v~].]hKYvkMۮoޓgض96H5#[*]u9o IB|׵|8shJqbD͡(K g*]PF3.xpNZJ!;<57鷱ESԹkֶ2!V@Ǝw|ϕf]ҬM5$pSڲ+Sd١Ps!;vw[tSˆ -{ITƘW=nTt~!#q9Q<7Vr렐L}?a]ʍKaŠ8VT@0P:Bݠ[0)#{6^)ΤF䴄bՙ@t-i,Nx%C^NdVenhb@҂rŕ( 8䧀B@e*6=90B"S~͂̄R~z?{u mjɛi,T 9}Ppz8g;_廮|l^]/*yH gXl.Q4OKalF@Q(z{Xkpͨa?(CGi,eGv:بgBdLNVYIzvl\g~$(?tB)z]!UE+EΘ]cHeģ)9DEղIԣ$?*m,5L C˘wRiē'%Hʩ+%1&+S[.ǥ~`zM 4,CL=dVqtY~zm&6sJ!U4.}rV?F7+:/r|ߴʋg~iEzmh'gq{(SͭS>,,4*e3tO|IR+$9X?jL2%@Uq6g)7);`{4Z"X^x*ia%u$A_~He Kx1.&Y*ɭ,7{BKoT  BwFDIr32DUJ%k#`Wo m+mMx&-x*J5we!Mx3D==aHlKVہ.,v6F)yA'5N9:cQnkr,–x52\F%Zf0 l`AC`/suv#ăG,@rwk7ucgxS/Q.}PQqv)a! h|)0,(k~.X'鈸v(ޔB5d. -PA"w]Xa{4>m04oy{ſ_7mMw6%?-A°6x6ܬQq'Hd`X3'RO&AV:sns ]BF1ˢ)K"Ta(z;hM롬c+EA?X;Hښ7R~H{+{u%xiAgTE)YMK0}l -'[d*aSiæ#"k3R&{XD|RjjSzǢGKQw ?Tݻk F5 dΉM,!za\aE} ^iJ@%PeX2َ95vYu8}Kh8hŃ/rQq4B鵭0:GY@OPW!G_=JUyuMj=#O^n6hvYٶjnMuJЅErȭ!xhX"H p/+ѪӪ~g~}Z3(k -9L%k@e n,KgN v1er *͗r}uSǍJVJ>U=V/QjQ $˵|p$hXjv۵6ՂRrFN UI|!5ԃk8_rcc6Y@[y/Y21J:4;JCw[ejM= ޿sO1O",ջlĆ_Jhݞ/KBT~ -o(]G=ՙ;ncdz ǨFق[oE~fBB'<7DQ*bn)v FӻɆ('MTnsZ&"@m4qbܯ@C슿}u7#oO]K04W@W ڒD1z;yƺEUX{;\p#RcP0BAk~v$Cg1*u(%%+>P0zthY?j]eDhfW0⾇E&W.).\ -*[kFF<8pbBɜǯ|}̀O'`x@Q1៺_Sfe$nͳљ!z捭epDqT۸ F۲^ߤjW1y$rqH >8&f[IGC]Yp K㼂om ɤe8&?ĝEȭ!x(`% Y&KFeW<U|ӎOB/-w:;TyZB>Ze{MpD -G ~l5"{c?4v9Lױ!rB%`1jI܆a9EK_R:N%|lOO*J6e}(I2}&>ey)||)CGtyrnT)ݶ-K\d5[CVFt [snyzĜWeo=k$&3)h k[Eu|Օ# yb\6[sK@PT>\l=Q9kdLT!yh ~EvG/n4T6Mxkf -/3|bz>G=b` _& żF]7V=0v3ysTlmESi]Gb& wg}n!Pߞ>M!ϻZτwPZw˶3K.b@/*(& /$f)z!;V=[{i:a6{)4*8 lXE=k[V|N5ӛwru .3_hZP Y5Z-[9v2kIlB/cQSkΔyXj:sgWII9aSY ŝ4Y{):iۜc3= rv X"ꜰl-W;䭹4Gd'5o2e<9kyt)YHYG -C D׉M |7,VPȏq􎳓Ѳb1gK=Ly8\.c38ZY. -!h*Pj.i<; rKŦ%. &kDMD0QxkGSĎ7ṃ0-ҋ -ha  X:j 1ZIS<ʬ31Չ}4 E 5nGvoTYeWbÆ`En{$+*Og>u$JtE -U0>VrF8i y<'P%m]&; XMf,.+-+T.V8p81B9a)\U==~35 l\ O8)s`f^rFH H+[yRm͚KGר1qpqgR SsjLN(8 ~9RSV'(Ks_rP׋T _y>;|}1NoUqWOQbCgN֧"[ B*װl,q@EhS_MSdG+K~_rZZ#>_Ngiթ:r>x {?R=ϟ!GZ ?cݹ@O0C1{uUi|k~G$c2 nJΡŐCR$ ?X8ȉu zOOF`eO|WPwd5yepپ&ۨ 4gAqB%hu3:skX<(Mh4i͑DΡ0]+›l\dMcG}=5 随{0.WykYuQm\{4k*9놵qNۙ?dsX6>pey^#H!P\ZM \̛ \c<(C1T\w" nJ^7% }h_5@; mj;l+!4Zw/nCqq&z/ Y9#v~.Ώ98 F m &ޛA!+Yw0b-cp2&<0i5Auq,fS} >LsQ]CmA -(lsׅcOPr?$M% "ccc\!Vuz?@Q@BuN<Ԡ]VF.)x(=܇U⑾ Flo*lK3Sfl鷭l@-coZ5Z]f!mK}E\Hz֔A*͝"]RsCɜ2V6Wu0o۩ywKMV3w38mZ&tҜZ"7-ue+CBɒ*ci_Fȣ R(qĺPnü4]\U&̇ n?L\5'Ֆ#mu.8Z>z C`ΈH[2kgE&$Qk g}`LASJVUXڻx޵=.9 g!Ǽپ֧MQI/Hs7l7VAA(Peˁ3y2,6|lJR3'ìI! e$ -#Eqqm U>"U|m '>oxz|$[_^ue*: ouaFk(/}<1}0PF>@Xa@$hH}x3ߒ]%c |. Qk9%+6B2>bxMbȺR2lQ97N?/1ؽ|'& G io@ F!-/3棐W,d#m< )(L;Ǔթ@DzlEߞuяghkJ9 |<{0rdv-NWqJW]:N6w{@5;^IsKTZY96 aD - -cP!7uRǽwzS%LzΧJ\v)vPx7|tȑ=cP!LI[蜢U%r @99:*=|ā'#[G z49PJ1@vSv%qX@ʑuH8'!ICLJ#QYBe/N Z[U.BKɑ"w=d -@Sx (HWTU - -|< xܥr}9h,LFDŽQ9_ jBcv~~=+o=c+Ws{XONMgU [UJ5m;AFTL0@`+MVyie0l2Hkog,<ڵ5>^o1X e.N&Mբ$沼1~zcп1Ɯ{B/ =#Eey>{>۹tF{Jit{:s:=gs~IzOәZYYP?fdO.}W rYFVM$;d?)f -`=@$Bko;`a'xD%lo;V=T/uRQEg JXJMEqTX2*MxC!'oO>wR'Se&c hiuz39$}SC1jgF#4儘 T)Ng5TxFKR=ݺ#' -z 'ax=VFk\]hqaɹ `~ '+@͝BPyszqd@}x<\#e%$:H,ȊFUǶQz2sW)2|hv\ !{xW} {i&T/W@.Sj2/NYu-^ AjȁP6;]cP%gXϥIkaE :a=j32Bқ :3McM־Q -# &.vш[TR7Umد0qy`mJ+iq<,,-ۄh(V1.艺(Z:NQ7Ɯ-*=5XI控F DzX$GYٮ0s~̔$s (|ƸLtlBZ3:jWL%95̔ݘhy 4B%yXtoc!ѧ6n7/tV|.J_j9R v:i,ًeoVPPiY\k: b`x\I{+܈nOik -14K4p&YUX{Z`C&2:j#+4 .4"0衼OS~@fN优9FFl_uj0(FOJd7Y'}wd1-ia1X -i[ e#fdUitjtj&: |?̳ 0峢39 R|*9 lC] 6MWP4^"wSfpA -! pd}ᴰPn2tjr \ڨי7CRQS7ھ'ղb[RD+:23=mZV}ce# Rpؑ\͈}bΐ NqM3-9VMӲU(imZHGJm23̬FURTՙurC9pqyխe 2 -r İcc 3{r&SflLEAQ @EYLs99+70'̿ԽuO_|٤sRZW 0:D3T֜M?+'2~4~9wWh^Uާg1rr5r0 - 7 䘕xx3wS"iAϐ[㺎Q c,0Pd4od !e:URƝaeCb\1bJGrqvr1](:O "NVu*A~|`)ʶx?=~IpyӰiz|(=b]6[5KwZH9qOk5/W,Β<%_c--bbNgh#vk'{{+oNVh#$@16o\sݢӝ`rqiFt %~g9^gQg*}u4p§ :j*O;~Um;(;l 0{,Yw?njc忎U-V[yqGI -R/ĿE2d]du}9[,Kqжk6|=I} )S.8P>.SdFEzuBX³ԑI4Rw&k{N8s-j,+`l9dT[5%5rmV>_,̃\ur_5.`1.X@[y* I/ǡG f/Y6v -&DVneT饱9ZTmdT*q4IaB>)=_ʣKo>+dg.BўVnLcuИZjv9!b2a&N@CR,da̋(V1G u|n& ^?_xR91?{oNϷo__Ũ _ǿۮ/[S>3(Fn!bﷄ˵|>"{!{^Gzҳ#xgX|>:2_?AWѯ@͉@삘v>V2bN[i*HI[3.k{k$Z$r L8m/=ao}hZUiO]Y`ն!J#T_B(ʧ:}6^Hm>҆^Tl#t[ciYΪJC@Ws&L jaWA̽g [M~"c.UWEYPDPivZ`3l)ʓ0]I}խX}~o]r %DU%;Mؙ@@ϧc[S*yhHW>L~RE6#*\i(S"║ႛ:i}_?c:`a`IkMT:/xD΃N%9Ʉ;C@Ⱦ^?d9=fr'K H&%?j4#tQ/irEk CȢMq;qP,b 괢0 pqU#^cbX=a'$ A ]kaNs^-^Tg|Q3Цڵ71t !GO ~d"u%`ܗ`fXl A{p$MU/s -qG/pN=߉˔ve≽uؓn9gkYZ)hq@N\mFޯͶNQ#]TUd|+%㼬֗s1{cICnflC,CTC5H{7$?D%q1ޢ?kfQ -Jg SxSmJ>#IK(3M@J妽[-(Vk'=gɝ -/&]:>[4=l,PɳJm膕ier[>O ,K-dJfSVNe\ Y͆5'4`Ϩr@بP} T%h(M6[4;iY6?24ylf5V>cD>;noc2{V탷$m7;AO-$ \7*ao`|Lu$EE˰ oj )#`B(6Àj!+H|iQfsGŷ{A=Q[vV~p}zvc5ͧ 7{"gݤ.0kC4y7Lae_ƽ `0$ LZ2 #B~yR.zUiZH.xĸ zU$ܛ&O -vdS~htTOg8yzt|txIW:Fbj츅-@,l̥ŝ%Fۢѧp  2Et͂5qw!b875xƬ)GsשI;[ȶ -rhgNnOmVz) \|YT65Qr=ȣt> -\erm-).Fзӎ«lv6_g!̔M!\9WS.7Bceն Ҥ}XG0ڕ޽ܢ!~uc{!y0 {yY=|CV.z0rIL=kS fzQ ts׍/̇5q2SJRͱ(oifɹH/Ir%HG\ȕfVa%B{jwy a-0'G9{))T5|v}> vNԑ b4WC(=Q:Hb A x|{oZ^)oUa'ދ}F ^țLE~l7[/'pSil&v:Z،{ :qeJA*p,JF YJ243:4xdF;+DjYtu-T>2K}bۀĪN̍(s+gCgIr#E`/)`+RV 6Hg3"y8j-rI1N~s@5Wn ,>Pі& Zl%WTJ?/C簻J7}k_`B 3NU.$&h5n!A#li5l:T 7Za2M CyS 2E^"SH#B$U&&NJ5+v,Br:`@Bd>;R/p$|vS X'}%~^/Fi:K *o^\DS_=idJߡIo?7̃TKGg&ew ):/b|={$ -D?NVA)$Sgyd#^=^K ^^y#8H{G yy֥[4kqMձf(JRjzvOz|^h֎C*Z(9Jq^QAoFQjTWE2BN w1fՍ+y?χh8qN{xz>a褭Vbtj N:;F;9 ?xHEI}!,oX_Ħ`/ϽM7Z|O-C|Y/~p ^:޿$r/e^w3 Hs.-/lCunī<1 _{ˤiHH%!~PP'i@T"*3 )姻GN7E?OG3 - 8r6<ap\O4*SAj53IHG֋rƮ%"ɠQTb-Mh$Ӱ?HIދmynK n9zxr%FIxD5T >}WˁlUj4-Hd9A Htʿˎ#_qE뙕 ^zѲM^ Yx1czNS*+AFD$(5yJc}ݠUpj )G8bGqnTnTFL؃7R8ɩوGML%t;+Jd{8>ï]]>?xoF{sE{?Z'8aYceU7REoJ>%wRuUDS_(^P%y!c#v?R4gvχ_{.+><2`+ ')ZIHiIQR,NM4`7~Ex&z"gkFˆ'&8LXt ;{Ѓ3`aRxRꓲH(I$|jUfԾՅo$RıhEQ%)Ȓv ²h7Tެw۩Œh26IӮu[ -(~3v(sqJc /\jwt3ːX*Xm9!pI43p*ܨ-n;YqfhF0qDD02ǜnƉ1xF"'|fMcUX6a 0 =ePK.;f3?'ϾRtv Xb%/Z`GIMQ ^?] [AFfoVMLyM+0[g2R.N6byn5KQ1!8Xp2JC[cT=Fsfg*Tx]6:*y%^ZL5 #9x骢YSeV=ZT*D un( Bh!zܳ F4ytH9&N1x2vf$`ё -qh9ɘnQLw.3I?6$(itc;rNDg gnA"Agmo}s2)pSޟLW-E[톊uc@] +ŔLQ̸ 7ĔpGBftEύZ F}۞u& ЧpDڎMXo10߳MNAOǍvX8} ;gqIc6a7nn^!&}fnd0E"Ig6(v'7,ʶT}[ 0 ; 8W>SjDJecҀ䌧 vzr5jM Q+5Y/epqmUܰT'Jz-2OЁ" EENvѮanLS5JW^Y+{w.WEVTeSFzXMj覹0z&P:'{SGMٓӳEASOKt6Nbʀ.]XL_V7f䧔 fU^/v/7Ju|QZ뿣r_C=?`~~_?~O[W+n3O_{_Qrl0qxn8urwQ&}9h0g]`Gz[Jhl"sBy2f )L.Z>cU_viU9 q抰=pI) 7 -QE]lJxcv㝁 R`/7>8 `O2Ɯx eiB1N֘׻2xZʹ'_rLu1$VU42hРq6S14"RsGo57/3 I -C|:UfUFur*eɅJb罋`'cL-LYӋJU$O*#eLdCAѫI`]BpyXM -%Kř=KQT5n02nur3p:ҫZcgn:AnL1mXoQ"،&z`K鯮nt[iGJb[ԇFK:']}Wd%8WlJ9* Ƶn)Y[Zk:=|n? Fۋ[W`/c&boXQӨkֲur2MqD!g1<j"Ŭlꈤ 4qq=GsmlHQT/z= xXN BrxhU)2Ez>Ծ̪ -wx*ťR$(,UlsTztC0pۿT.L<ƒnH:$xd&CO(;U} Fra!A5|FL?^H4Imdo(Zu#Fkb ]E|ۛ'[9ʰeAj))t'B ->|kbT2b=ך@( 0ՔISiBDaR.7vY&LxǩS X s M=-I[,\{o4Lh46ڏ9d8zs`bɦ!\]<LC#z^tXo l#Wa-c%oWP /l,GcKu,ΖU.{ɀluƍ:3e("!yB Qe_ʫ=YP\/:Ck(Z/>u¼7TjRmud> vT Sei׊,蛼'rp ,RJH('' dhB:D2) mk@Bq~%8z+4:p -ͦeYD*'Qkz*v6P,TqLW$@`-ulGδ i_AШLyFD+ |HE9lӋYnN^{+Z_Z@=ʡ+rWDzHWu5עsXZCo'zB)Fѝ&9K8pT!8h}E -$! "(>߳q6^1VZy6K&<&"dJ-O-㘱 7ihx)_)2͙2%0O4.7\c2 :$+ yY7d^7d]swyU2Wk*7NԔrZwM%nd; -3Bcn^Ƹ۔9~9ze=X?fxrP[`Pz_ڇghq_쵐+JCveex}삀;/c:4}Q#*gy\sX>+r2~3I(J'A!gHB7'SF<8o@Zgx$%Ro%A>q~ trg[-&Rq}4mlC!?6vOFV}a&w/V4yQV|*]vMV|[+.=2~eRmg(޹~0%9U^Y`vQ{/paks'%pLOᵘ䤾Җ`^)T'`k`1Ht٥ӈWTJ2%nJn'hSIјzje?|cU^x 4 .q5|I0śtH8TLjN[2g}#fuu)4[CZ&~w+ǝ2Tvm(V?!mӛ4.os]LK(Ȕ(BFcDx5L\|T"*Bە̀Ϭ{8nCcY';6~hn.z--wPӮew4c;40!E:BvrW38P9]6rzi"8%ӍN|sv.`;Աt/+,Ä{~N $00(e쥱D sADlL`;я5o[ߘ|Nvsֹo -yQih]ce j rYl)𼞢h^"oS -rTX_BAHC{ΌZ+F!nۤꊷ#<:j"ܦ1yjzH4f+ /OmvѐR6-{Mǒޜ.fӷ|z:(=; -]5UjhRupfn3" qc?q4ƂLJe(l@#fgV%MBm?x­aUqX;'bB繵q\-6Q&S=ǭ\ƈÄۧ.>Ҳ, KS - -&p!3 -d_p~wY؈Q.:T±qh:iS!v/ Oˠɘ:1U>wG3gN_v+w.7-d/PEDW^a0*>[nœxp͸TC -cAp7QzX jr`ЧuրQpcXxp$=P (~Ȝ` -rB<^*ќU <]eru7kwKޚY_^r)j -Hy7pxݻc{K\ pnP7]AP!*_)]hr.[2&ZUBєMR˲"S Q]Ͳ+P -[ԭ*Ъ;*+JWIJ3lv-271,ek}p!~ؠ\ Rc]R@^q!l{Ih6v2fZv-MQk_~z˯ヲ^~z1&z_4 W //}^f<4Z>{ȭAZ rG $u&"~kdwA2E2ɻD7,@̭rNV_f$mȎ V[+5mz aB:%RM 9UKU;^N>Rs8*D7s6jIc"G*M$)L^HH$|OiwZΨ+T`hdWJ%S`zW[ DYauMdi80hT2tB[ 0t?5hu{: +=Әy/z63PBYf 78i>ݷG2xM1u.'4$ 2:N[5B=꾔 gяDcV]yHfs&1|uUG.~8$.1{ -=S:BB䢯⦮-#zjΦӺ5:&!]U8[\ݞb6:ȷMחos4,I-mjrlɟ:&<^$I%BF.,7,K3_{XZǷ!kI%'ڄδ!8vQ t^J[UwKQaIkPvP -yfY57BV2 IrmAt'rG}|ur1ӨD8DĠN{(ӒP{D,TN<`HyOpRPB;.:4@r,{]>z}"؞JNxrPGGnx$/~Е 9${y&T# -j-%͜,heͺ=59:d+"nޠY[ H3gLI˵(ضYhʟ6ƽ+P"Et5HmƷq"5G}0!&ĕcJR0R$?Gێξf4N nlHT?҆@nP.km^&NZ(f[jnl/4G‘;̉Y#aH#,Ev/ - U:@i^kP"ڡ^eư*6 -cOXLM=ckbv. 8gKhK/GGirw ?1 -MSPàղbWr+Ϊ`hf3"dF <ʌ/U̐U#B?R!pς вD"]J1od3`mS\ɤ/t!7A2Xazyd9="|ZI_MԍI܊'[̙K= _*`/ĭ"7klyl 4rڇ8adLl?#PЦF} eq&p+]t^-ke^r#7nđM.gm$<_Qۼsx/:bFam];MSy\tNՙ=B`3w :R9c԰hq!>牢N #=@o<1恏*` -'zG hB% MQ?+.eH焞Bi4Cc"E<G2p[;j1M >m1)OǒH2mwPGErʉH[w2ZGWUQvT"AԕxjBuL*v* FV"gLJݸX`9Eh1!ǒ5cո0%@S-9k+u%bb[ΐc !5M1 .jwz̬Uw/f5ҖpݞX`m*!z}"wCV6=PԈ@>Wvkr˚tj4jB -O_BWZu AX|rQPD+˰kqp,_<܅۸~ -&8;bl㋑, VAkK]fcNO?<~d#/Xl x=~"r̿LJ;a%G3~?\뾽q*?g%%g}~}W5E_?'yh'ǟ?=ùssEv>z"8#?רg`p*F~Gb=q〿⽲.ݪ0: Uٶ$>@ҁSgk:>t_zִssrsַ7n >"t5n&N ҐxkO}> !Rmr8,@|B$O84yaǡuiCW|U}컒ʋ~$~f2#z7+#w>+w!Ԣ`vضL+kY8>u2n?=Ʉ+}.;[;aX䴄|o[Q -@8GSv4J*,ک5I!Zqm((wߎۀ(sDeA{dNa.77ᆢe&/A\Kۋt㳡8э{ ɭx 4rH:Gea^ d]?MdxXSwX0|^H%/1XkE9 =fgAk/naMI۝ -pbtO1 ˑ7ͅ. 6?Pq!ں!0**aC]ÍDdU'_%BzeL"#_g^yPfD릎ujH r׺P\䥎Þxl;% ga.jfq΢lz=#^\Főmu2Ӳ2 AK0h&Dܶ%mQU?421$$Ek,ęa-ak߇ -=sC}UkRpR6,Fn 39ꉯ]mObsv3aWmSsxFU6Вo@rO9Qi\st#H#Ln -*L6o:@m)*0T;|i#PY>n5fbخ.ǏmۤZ7ӎ:D~X]qY! !~ )Hѕf>}}iq]"Mg(pn!)1} vqkyBO%G}*O8a_ߌ,xQ6f$(2*ljoLζ#`n }7]+HTj?$Qu( -bЉdbgsq)+/>2&g\b/*~a9>Bhib'1< -A:!8$_ pQ%'=n6pEjBazSRH1jrv ً56s; @,Kۼ-g܆;n!&g8eBM.D;x'~<fnڑkLET zwD ][W9ss^^P`n?/}_7M򺃎.[G^ţ#, ƒ$!T((yZۊ7PC86&N,q+EW'ϫv$y&uk R3PW0@W s~Aq;فA(0/zpIZEfCBǀzs1Nb0tNCa|Ea,l+Tm+kjhKA-[`s+Ѧ<36@64B -vج'g%[xZv1rzհ><.[ߡ"d [d I?]3c^R5CI QFvdq|9h1&c"*QT*3bfRsS5k$O`aհ- =z[7gFʶ.^_ѳkmWfǡ {'}ũBN̞ߏ/r?,#dKi|e\lnx@G@=awt|+=P6P2Z#,Z3툶MgME:a$_ZXUwT$> zQ7#m1ubjڼxԽi@1wƕh }/*e&NӱT.ZB| 8seY]E<'DhiTװxzQJB6 -ONWOSyh@1j4kDWck=bgQ֧egۀG`*&ElPŹTj ]=5?$~볃F)627>crv%SlJ.\nyi ݚ +L [M s -}ǵH݇E/ ^|[&rg_]Dr / (v~SYlE#‘0-,ws8pv G#?nv4U,G5buR;VEv"y=8_S\0y -1ȹFx@@@}a/x/sq.+" )\euW__離/UͶ[s>؄ʁ?# mQ*D -> \!wS`d(NQl!)o?xb;sX;'.s^88ƷAU5٘yxߞaMh|pł*/͓)K?Vhn`}h~:̸6nT'D%9~p%ʮ!dghpTu0)zwOߣ\[tc0:)ޛKEݼY hG`펫pu|nGF<ql8P,twvb2 vwkQzwyc?{ 9=J?xK,,+cN[fBoGnUltN6՝y*8_{fmώ{g+cDZ|$c|ߓz{^Ŕ÷B>ܚAQʼnݧDA׌¸PFFnĴ[\( %ƻH(d⏲Hp')`1@>;= -u|i\qa ;%ȲÊ!:ޣ@bVTkGBA] vھp!TNZv'.{ q@:(Nd|*5/ -s4g?0?_S׿^NJ'zxGf -i;%kɊ2$nRkyԐD˸WFICJ1f֭& W`.I9]"&ՉF-c]zȁ'4TrlrYhXz:IPٔoP-uQ+6kH/!pa"Z^5n˨7@i<آoK;[\{%5oe׎Wxf.zl$0 5?g ,`,tܮGd7}&f:ٹ О|pAmˡA[7_)oC?a8n3{&l[l{:HDop0Ooy^yϥEz.}sULk?HniU5HnnRwTQxY W)Z /o7(bi)rQo/aESF4^Govץf(O-f"t"ho*B҇ހi}!N Qr ҇#2s-R/J]P۳Epqk)֞FJIU $HFB>d@{C .eZF\tB7HOp"}<>܊ߠ3#В{G`n7x4gE\Tf>|n.TT\ -ׂLd s#qh='+cLR6Y''ʇ/ߩ&|8̓SM?uo1o;DqV~(d~&!!RH -W9=YfT3zGRɽe{TVl]{c˜ϱƨѻSGO@|;F>~4sy:~ai4F>t#6ҁҷ@0G -nM` {qR7?:f3G[i!-ָ4:.s_.jİX?P64>Jܫm,W5D+l:ݥI5lM#{k\@k?_Uػc]ad5Ͽ#,G䕐m`z8BDJ~E/SŌHP%r2fEa,q#nP2M]}pAu[}S7{E!q7fuB鼉0[̱ZZk0qhk7 ײ:x{-=sy4r+1ߢoR;Mr\KZ#µ nCdJ9KGvTEK4r2\Ye[ܵHma !P8zYu-]zWjn>Wl䎭oanYU"e5\Rm=g1DF<.f2\EƂ*̏9L\ 06\65hTJS-RZwm xb6˜Ҳ -Owi@f'U/4I|-?/6J:w]#\W0Г+MoRHhmKI/wh+nuv"Krh#!kfUev=B~ -9>_Sm ܲ!{MyHudTfu뫒R]jgCRɲRkvw|iCv5L}b ޘI"S?WL&\vYDBǨzɫS'T#)\S̑]Fn{~is7\m]^BHb^Q;0્$j?t@8QyBw% -wލ Tp/?'p{ CiKs!6̫nSsz{ԝLDuvS©Z NKH[̗k?_rü՘Y{>z֝M55%Ψt>\%c%X<~D ٳŊ{o\|̓!㱞50 -8_~)/Y [I>qs ?tpin?:zse -^{b1m=XųZ[\c*NuVRVZ?{q@quzpAJ1^veqpDRrh^Rx05 -V-0 M1/jKՇuJvKӸ ̉ }n.'<#\$u4&k<F#W*R~lSĄ2;Yՙ֌>G f[h^B:{5^zB~#.#X c8 -D|¡RokN]K"ʊS\4#T LZ/"HN ڂ,դrRP$ fo!8 Ed?K;\tZLmEqn [tע5*R,gu.xQF!%iV! $^gO DS8nTwvͯYaῄg ;vRV';0l(jn亲 GwJݖEXq<.Ox]ZUPn*p,i18Ft F_$9P(c;e `ge٣hK?ѥ=6ruG 3{wWڛ`1Z iIʹ׳}gӡa3#.l m 6AޞDq6#D>ih~(\p\==6վ;f s=]3vXک -fƝ(TϐEhJ+ ;5r帤4H?33MBeDIٔ8\DÎjiFlwH_U@Z;;/2ӖaɎ͂-=S L~Û_>2tۏ?%# ;OI`OCke 1qrU|v$ K"?)6h( (ytd zrIEfl8WѸ0a5d^;Z ҋ%c[)dά4N%sW{pwsu5\5E?5ᑋࡋP!ïٖSIY 2YRIݤQXަYsȉK6j\b.ɪH~"t%SoZ[5HNf4@b 6}%z ]'p6[Rs[Y'Kϫ) y;ꐱo$d>ťWWk$M$Y84kv-M4ZvXUs2߭-ٓ6̷;8vj1u3hO*cl&8$sn FnjX/uY!E:7󯨣pkMkQb_t -H:E8#kM\A]E{en>uTZᥪ.Jl)ZV/AhE̾+kdJf$.v;B_]By پp}6JXك_mOX$c]u >J2v]G?`mXˀ 3|:P!qy.-h7>`kŽ~9ېJx*XqT/vI77\y]6Lsb+ǻ9(@gC@9VuU_/Zl]uЀU*dkPD5cSV9~^0?(6SU/U IL{b@wO-OhV^;4|MPIER =}GtgU&!lXQv^ Cq`cci=HKްN=]:Y|a%JfZhm,| *{l_asG%2ݷ,i|BWm_!I%j+4mΘt -V3б3AꄡטA$P).d 2(靿У';#>^pʬD ,WnjV_?[Pzn?mM?k6w˜!"Bn'jm?eęSSGUnP2=e%c8{V;uqh_#++}y.Kƻh>ֹCZJSѣF$+rw ,@wvJj~-J{݋ >FY) -ǡšk/I*]!@V>cxl<to2-=yl@éo3nP/:9Pn6?P6Cͬt Bu:tqW\a3Fhh΀@!0QIZ3-uwSUR97u]۱N6 ,~pĉO88 B1.s|goPnUVa?jr9ZF]\8WxC6/o/#97&JXgE3(tXWduDA:8[\%cTodkqO8vF`ǀк\F5~vFt0DS**`FA'e]xuY'emqXAJkcILkDLkI&>9cٍJ'1wz=0.  -"݄S` |ιby ?I(;ƀ&~ Z)PB/(vu5}U:UΌlǖAbʊ,B_fvۏC=[C0h4Be]!٥`)욦3 -Nj H뭽4lMZ%P= uxf0y=n,BQ< ]W59.8B16vj,a=]T9c91, džR3snEWM*]4 -oW.]@~iV=8|wPש?ga`%R1X9 5rO;^b)hhkyMZBZgOf'}yrdS 2#b "xՒcInRKoz Q"E4ff7^WUxXTJ5E. z>}}C8rJr()l45AW /f}P(6%hJ(T钸^Ar:4ߪdz wop@76Q*Phbuo̳/ tTy~u*P3RAz \zDs92J3ˊd5tDj쉞j~(nYv|^|Tf+j>?]uʦ܋߿ʰ7k߫Nq-+K-LSWe -Yng..a&=ح9.*"q(@>oSDw5V{RϘ9] Xe;W+jeҝu]9#YEG/^_B]GϚN>\h ֤Bs͓|JCgh2IkѤAqI`SX E$M_ʹׂ@6_%I&ijBc -rs3SOCk4_sq=#q,,/ zT\852΢\-^h-pzs$BӋպtW0hL_wV9L=X{9AiXN -g-JeiN*{ k$s mspDdE5@oY1ּ~ؚx{975@)oM$R&g6[܍ |[=H@Oa`\pC,pi@ğǿ~|gMr஌Iw9Vxmbo4kI|p֥H8E\Yũl3/E%f.6-RgxJH7y91)j}Z- -RG8qli*Zd&SV>cG pW_' -0`\ `b@S[$SC#";W>1^ud+ZЮ#|9K8D[H)y5T -M -f1[n5v[-JzNH!6d&#t &44p(%L>;/Tc!_;Nlmoˇ|"IzXgzx p[sMĒٜ(ă- qf[DjdueƏx~P.F -HIQ*b!D)S)l!#ԪHrq0V*+J.5M^9|RERVDΥ][=-:fS-zEDsy[TEGv]'b#.[\tjcQ*\V5ԒK: -4B\r;^,TA+Upa}jB}UH݇ euz0cr] h k-䫂Fc>y3GL\TԚ1K͋!n_DECG?ނ{knйp-{eo<[G Z[Q}/k|@dsBG.LUa \e1p?:_su&#!S -x V:I'. vHu@\x?AN|7Ia=CjJ]3\Pđf _Bm &ܿ2 <\~E3p?p@EBmdp4.PGBIUE$ ohV -[v Eu=O&fNB'$&]jej(.|PJxy?k߿qw$F#x^?Zךy5pc .j7dJں#~=?8s?D6a!.J}6L:R`2;ZTuҋ >l73t I{/{SdW#&!r]ſ\#&WTYiэ%V4]0oV#T6І|]^݌Y>c| 瓾@Fj%ASa(,D䑦UDG(KEJMDq(ɕT`_`{tP e{cb>v% _.0EBi3{ÄqMZF^EmBQpyQZُ2J)Q{i:Q5kb@8,cFn-Jh2h0 =e\r`YX};t1U,NfBq[r'oFQȩථvBMCLk!O+[ -[ҹk~,;j7c{UEW2 'oK+u6[8"71aE>F6)a/ѓ^]QOfڊS gg_93 - C!҅|)z<FD ;P8x]WFQw+g[[0ZG2;ꊖi>-'2m)CX1oL0 +d]V?x[Fq3e40z2>Kg6]0 -ڼӇ"&81K. -YErgAqu!؛Nb0JN[Zr<0zYxektM\/Z$@(UWeLZL]馶yBi.qmdӤPSUؼ*}tٝZeQqϝgFo[>&ʜ<`ڄMRۢѹ˼,ʞV2ɾ6տm_Ôكq5俿|Ѱtz`H^ j1|'jE&{Sy&+8}-f7 -8\Syd Ōɏz*"l5(bPk /}]ٞGy?K!wly\̸vC?5[s-cLfDbgAJLVoGday51TircýO>v $]3@$P=x >yvYy٦ኖw͌16vޱ|ǁN1~+Di9nh4Cz9 AWƎasA!a$@ -8XfWа( %B k:c٦"podc1HJqP 0WE,O\|Y:Z⩥7RE~ fܒR׍Ca']sːkQ`ޖ -׳{x4Iqʧ@jWLoNLwʷ6zoQkxGBo^c ITy*tKjmw/zr($^5jvkhvNNjf׻fWͮMb׿Y -ekÛW+] Z pRr;hToЏ_* -u'R1J\_T:ؓu־⬯Wh5~?X ~zxU&,O{']2x}k ^-Rk>rA=DZO f -N%`(a5*ai [эQj=OПTաֈcՊ?REӂ4!DglF鉸 ^g@Ń餒ng7=\j_A |&뎶ed$% 楒a{S$|W2zf{W#.f@QE2ŃUze\zy!CBeVr hbXW!mEPRWD=}QFf-80SR&|?T1:ir2R=˰@*y"< -v0'Sa%zR"8 }??ü~wrŸK_)no0|EI ;*RL_6ז%KMwU:]Mgk7uiGA|I ;G[S a'4DQjvTXgڹGF=:آTט[ *׭h 4BP$c'g41_8@yII6(uo20("Eԟc -1ohhC <)aj:di3$fklp\ RK$ ! м:+IeCڛz[hŕJsp=ec#՛dIQq9_ -Puik_G13ϗHP@^l>9 -zg X@2>*{VM‰cU K~00'::EhhIDw6\y6ҢԲŘMlפ]v;g_Sc?}DCfŠe3eU1_eFv+}t㒏)L0.zhu0*Ncꓧ -LYehyVжp -9+t;ხ-7Tʂ8NR'哇hRGL:ƇF.V:'N (7V9 `RcɛCT{J 1DֵaS&VB"X7RaS{AuGՒ/!l#Qs4M+VqY}?I56%=nݳg42o~ɔY/tHAU2 W㭫Peȷ+5v<[s8r^})=|/DCf\Dk/?t?8KVa^%JcWƀbQj(ڔHP[*&PC*Ƴ\}*KZ[j_8G Y\ϑc nZi䚣K$$ gy8Mvt -Cf1j~4Bcɟo_CiaGUGJç_bc~"+r%j=ƞQh8R|'oUrbc/ -y&73g&rQI4mnS6,`2M*uOcΣM= g6'CƂJ[D1\#]`v|ɚJ'^J29[Fֳ^g5=i j1aM|N -n?Z 0M5̖] `}6TLgrhLN̘Nl|ƅ95Vz{[fr`՞e{SٍO)\hf. +]^%)!+ԱLw6Ć9 7eq6eGdYEs-川 Oq.|{K4VY! ܳǕ;¸uWhP0?W;ke -g1⥦(xWzr,oxռjB>˅sog&|}x' XqzB Q#9w(P),W(7+Qcܯ_)'yV.?_>OU吶|׋7~imy;2h.C.1 &ddѫesQ_"-Jo"viշ J1m}1DQd)F V^5 qsgĭAw$1 >9o3%ڱ jI܈hاF0F Cy{e2 Nf4(4ߍu@XlJѰʲIL\ F&u!`@ʑ.H-VWr"4MP"IbVEeHY o+r0m,:jii*:@Eko)a:jvc -Ds;g4v6.#,s{?ɵm %q*YҽɏeRFa%(P ؠ6MuD^~k;XE2(v{Jh|:Z QE} Mvs&Af_{p(__%Ӣc MEpy-O%)㳑O\`<QG_Pw?E4+HΫҮ8:gzv-dYK:k7; -^,RhGdQB^\*a,Q[#lSCx@!f&M8=,C<1E,H 72@ZM]5bgEW^et 83c ReW+ -d -qbྒྷM˸8>Φ|(/=;ި B-|z{]W5rpA]WzO'hR-bF=@ݶx슧ξT'♓=K1JAF¸r2CB03SpM#y.y<ז1/@¶/g, TF-KѰF1YmBDEg|Ҹl-Be).}鬟:mc7rIz0=zƵ#VX *P2Ѡm[4JS-1z!a1 HW]'w*4RC-pO\1P.^2 (AEȌ+q2ߎ 5QbJ -sLKhc>~?ķ Zm5bKV $sJdLFQ0ƹ .1f2@vKXu2=oM_f5 d<['}Rdz/;BԢtdC;!9.?Hl'`tuSM2kvI;h5 -.jwX[+}2)xΙk/[YFHvKrWk"Qv"x,?95=ࢽJ]Yus4HM]ͅI.^Esi<k+*Y&^"@E 1JG0ZY7!g&\X]H{?''^5A('2 &+?]R&kمqm˜(b޵ rts8r>Xx K+Yrյ6Dfxعh[7s rYrN ΐJ n4\-$J1x0lUÔ(1-jWEDG@XUt4 yq{=;ljFkibi +ldcݛC4MsWMDh䴸t} U}41qhkm cؽo-洛&MNaUOkŃ X]鲛uӾEzaf]C`nZe,툁/!Ǹ0>bT@]t{.j+K" q*'(*bq A߬Krz/EwUki;=%n|tk%kJ-"8q: m9TϾ'3yh-ͻ^NGǬ ]CΩ0T/y|bX&R4*B՘9'X\HXT WѬ(PE8 #b 'i7*hsp.v}j4O6<Ʊtd'#Ԍ,T_6ZkWQ \I7 k 3 t2>Nn+k5mTrۓ=v`YLapN f{i }9 O> ~ SXxK>L$+[WpzTV8݇iG|-\)  U8tmBvW v6]~,1L8}sx)unGiS\q)ُ[Z)A1ҘZnػv,8 :noGQX$煱'{M0}[;ż?'o3[+﫻̳b^RGam hɒIsFqN}9/:֙:iQ@8r7L%_pUy ti JR(l#Y68 nد-2*E'P߸?ޟS)E&MҬ ^)$.A6A2mfDkMKZQsO}rrс!ybS6K-C], -M}B YlG2)H$r$쫡C)sub˂&^6900Q~jͮ f汛hC{DePJlF v]ύ$`A|-T{eQ}}nۂ>K( 2:JkVɛ:/4  H @o5QU$gDL±tD+m97/cL{`Ľ5# ꚘhjRI/-F},9j:* ia>A1冇QV1ih48܊;!Rr'q'耝`mlL{񎰨7/Sͤ뱅y31{+ͬ; |Z7SgZhvt6- #fKu_y}g6>{#6Ps ?0Չm{m0!vry8hԋӜ1#oC~Qf Ym`0)x [("? 6pHCbeopst$x} }I:Vd 3W5Ӗn%9Y(92ੳdfZ(ʮ99ys0?a L8w4)|94ٽE/.iR)@r-_?cޚ^oĴ'-D?#N;%L@b$mNNLd:A]L4Y``P1~}*n GSS0{3B2E0vu[TKyK~^_"Hp[<.ֆ{+Hڼ">:_d+zCrWiU YГ 8$>D$.D鏉)+ju+Y߅o8W gʷuxV窱D4h -Sx[T~,!̔ɺD*+R6µҀckCҙS*l"Hܺ@[M'YmC$c q)ӱJr-9n^h tCh@;dV^|{Ū8 v$!ePW§I>=1IV%C8mg}!%@!fZR8_騻K(TBO'Rϲ)$EOM|,'P4g=ty2*Fb\8,2"lϠ;(׭J3 Ȝ+S,ƘA###thc Mm=m}7UΙS^n\Ie "m jH#v!K 8|9 '"h>" ,w);zp2.1%BodLUrgj?Y !C g=+%d~ᵍ~s BIKq;Ci\U@Vi痨s-E%775 -Il{(J4v:ъN N -Vx7ЭML8#+接*o%KY$oal*k -oq݆zFV(RG*1F\tl]2R̦:c1G!ۓ.Y=:f&Y_Ewv̈́ޯ!LgmH7mՉʍ5{a@#brAH(Y$"h g3wI G:{;9) |&LbBMyYxTn -L3+ Xpѐ?r#p{AĪjXbAr$]0EYg1ކ';rjʐɈ])nR7u;Դ&k"̯i>cxN]qNn,IŮKkKOMoq⧀7Ӝ_ֿs\WYGuzkw!F@BrmF55*nu)qGN<94RS@lUkZ՗^(͏ouZ1Rvi.D-){ˆ{eT\G̤ 8@Mn˖v{C&xB)Okngĵk}t{ -܃07WeVr;RFEsɘ!2^+r!aG7a5`ؓu>LHGb 1EoVCo yl+C8UzϋJf9鱐LXɟVHbn+E eҗ)OS?JAq ^VrC0dK|~4"8`UHb]~[yR\]Z`QB7JWP:o3G-+0i74 ka'E2Rj"8%Q)l\U,<0+#XmȗktM7Q~ql[H hrgo% Ct6rqޓ#rm"W:^]DYxϓ wli&p!VܧKO.!ȆĠ`mʭܚ[cHV *Fs T7r_N~ lj4 6Fplmr5bФ`JIX̔M.Qh+g-8S.z^'͛^hRS2{rG}Z*D=|ʠ3LAk#}tzK lS-T< -,/)!Ěh$a̸'|*{u\|l`s%9ڄ7htEp>92XCEӸ2X!W5`a.(+EWpb"?}L]?H׮ç/%z~tWf7KhJ5XܟloNoiFV<1{ƿ{QqE#*= 撠}#3` ܸ.g"8$1k;?!uujC)fZ^#"ZR\1mg`ؖ`<*_JJH' -"YHV'vtFf lEQ"'Ns6\%`8b\kG@b|vx) -V^V|{ڻx=ۢc! oDN}M!plY\ q99RYHCi\k~B'WtQJ(@^i+DfSj~'ie(%˜3۠mTi8hÁp'Kh NIdyxPoMJq]!XVkݖ=5+n) ZvU̘ҥICJj6zaՑeP̑O~$H.Qr<~NMbDD(- -W$=XKF$k%錢8͍Q1Ulj7r:Xѩe3m@U)xmFV+lvH-/ƍ)f)DI̜W{mz5>qvYhgg\Kq,{*so܊g"ey%hM%U× 3i&&%D&L&5~aF[-kuA'3ap.2E0pz-J2 zwUR -QoMy u;[zI{vaKm56Tn9Px˜,eLکO:QN4_뼄cHQAe hƢ:L`k3zP%R6[`(SŝZJC>i= `/ X - MdkCwΦ tEef$wo8E % 6]r'7U41G7p$zMU&y0B;#\.9WlZMqR 5<xT/Bo-~z:iD8BX6}x|C/|X(`olk`zxˏqG,_~A? b'i`4|~G0->?Kk:+_??F)O̗۷?>?=~~]3gbF+!}$S -_T.*hMб"TҢ %_oDRv0N Tqs#11qB/giUc+R愰zp:Ngkǰ͑g]rC8p°vzG$EK[8'4fJ(c^{6=r;SGV(.<(S4TY]lJ5u`F5Q@UHGx_E8 -e"<=UASN!(8^0ؕ1:lc#T%Tc_ 5DW .B1IC;3JD#liB0vp6R`k\ H=KsKz;]O;/C( ry+f-'.b=qߑDf4psFlJ1*0*,yO0$_zal`F;K}ޜ+:'G 1r|KKEo`,HZg|z]3vS_@?]NW k+3/ X~ u =}qyh 1\TDEb\ùEOuI,VZgL/ e?7ӽOSK鯌+GQb_T/Eܠ3;HX jo>[7ңbBU-In9E_p96%=텈9chʨd0 )Cع*Y?zUw*=:ck4X(@#I^Z"l߈/9AAL_iIJŇo}Ѹ`x|!0m{{.0+=ise}\yg -K|AϬ-*=;!EWc:ʀc>GdPm6"s?-) x yR3_wWMӨZ̓Pc&ژ2*sjz$PܘIug8#N>9e).HE*| @זJΉ|}=F -VV\FjTQC|^К6=#/:ZF  5 76h?O6ҠL=#8s_sR>8DO% CNqHS:s:lOmȜ6dsnr2S) [KiruƎ4 8hlXJc%g[q{A_hdA]|梲1vГ!b@g~pfI6+PǟNk̓gQ`[i,4h|.;O&Pqk2cž=వz3k-bmB+ybF -7miDT e .Fޭhp&!.kn_F2 -uև|p G`/098Ao) \`Yƒ ѸqF)WH WAc=L3@Ǥg/\eO1#; gSo n~@9Ue\Vc-i|X̔W6 NLN ^>\lgB9 7*A~&2?SvZ_D -dR!emS}-f91gϳA"В5ǰ D3>־Cje)jex$ _Sŝ\~r/p޵S8l5l>D hU{߆ltD5VFr:'E$_ ~nP=h)\i?gqtJ"Z[?/H+"'uZ8NX0 -rS&y4laڟyC߿qaFm, օt!*Q -mD.t}P_-9Flߧ7ݐB 0/l!)k>6JTJAVI7u wX\8-cbhH;@p_ (Q$gqXj@qX$1rf1&16YEMjyF(g"76z&Tb1M\1:yw|Λ8$rĒΝx)D}Mr缩hL۬oh tZdoGX ]*$p-&R\ҋ1ng&AyG⻗ d,w 5Zq*&ˁjQH3'Ԑdi3o%%(x]`x2-8|iPDD-K;h>?¨gbvn9W3pEԙȘG ]ѢI4v( 4@6w0i\?vh.XNt[]56ݽ)L&*+/*EVQ!>N cu?W -S:}XJ1o2=VldF(9f+I_ ױHO~ ɧ..*^}rld WQ! -0qW:Y;C:ހ]EZ drW1bM%"‰ذzV0vBڅ3dM4Y9b\xs(``Nw*ٝ0J 3AbF+ Bw yLL-dha6IO5 -ly2YDD\aUS!p75k ıvrפ':Rr5vⵟm3 FUS䗠ԝU \ -#ӢNMjxj8H&띡%&DZdNlyQ9ؿ)lU91!olKgR,ꗸAn`]଺! v͕ؕ]TD܊C"}h/=?5vq:.r5xc$#y.`5o-=:*Eoo~C;A;xO;~P-U.sn+ѦMk>MkD "v; vqI95 fᩒъ -n]:N2KYxe:3a*=KAI[la$}9oSZ5)j!,@yQ(e`dn>-we^b ~a'6A#xHRX#h ;D$bf-(0Ǝxj+(lm1xWSȚ|aciNMP`*846h<݌ ~8Q`JS \0H:+1WDp2)ŕdXV LNle_j4dQ v*ƌ(,Z)t:& Paޔ0R#?X/7Ս|9G m/Qԏv;Bm}%*WBGԲs%8OL+jV1a6uډh=̊.C?\o__xIh\vfrBA~xPY |6α}ĤH׆Փ4Xr -mgH"HG]W pNRPgp 6}W+$K3S"4qg󄀥DIOt -!CuZh2[eQ]s#H s߻伦6mh軔6ÎE7IO~lA Ν8wPE~pŠE}&m6Jb֎Y~U6 t\Y{בS;Е*dKQd[gR ;PC>!}}H6ChcC9E/6u?ٵ.݁Ur>wNƚXΌDi~Гo- ]fc 7VO"&:J$n\2~O4=QD@h3.dr ܋5'wh$Qp$^&σ("=-+(oFfPyfIՂ,n6Ax4r4w) a0n/ccu/etW -ڱ@mۜOH)􁞭QEs]xحcFƷ]o X=厬\c^飌ALNRm6?GV2gwUYZw,V4IL7h ˞6McK -J"WAEyFf5z RY yj2[aҹU,f:A:LP^a2q] |vFϷP{XĹյ "չ[ӚJF'>S _3c,Ƹ+--Cc+$HH3;6ȩԷ(e1EoXȄgڨVP"22#*'z|*s7=rsRPe{OƼN÷2>ᜨU3w\S;2 -h'3{Wg9!= \*mo`̬0FHө&+1;2Imh%é0&}C8{0q^g8 f–.kqeq4JPJcGᆕSG詇 x7YҁFU| GhOCJC|K$ex* < zFĘ=3L(`lDc!xC:LRJ1T-mQPG#v7lI4Ta=wFk[ޜH@mݕcv(֒w?.k\t0jT5i3/т,ru2 -wԱL$F:$V-ʾ,zQ,צC4SLhc *f\28(5@wQ2p-v+ -->\:V~ϛx24b3Iˏ>HBQafD zɝ+iG=j⫺"itΤK_TS慔w cn,rckP2}!ܥgnKCuM -=dRp6dTS=g㦪uM~4z5)@b*2 ej,ߴ^ޝf(5@eo^ϲʇ0metq@(,T5P76K6Y{zؘ"-f Ӫr $X쁍έk}. 奭ciTCʆRv}QFZʕz.|AO>nWQ0Q ^5Mt AkZ7 R <ߣNUAKSWK&A%L2՛3  'w:~ j>|! =mB[yd]_۟k{/4ޯQ ,|_%ѕCa'T:n1q(_B&߽M@="ֆDw -ig3uJBTISl奐ȳd$O׀c]Ϭ%)_X >,!K.ևiٛzۓnWTMfė?f]XMp}?˞s]pGOs?*\3s˟%s]|{[nğ#+~ykISwd紕"(HqL-hĹރ2I䎿9QTe"w꛱Cs1F#bb֎2C\?3cdOJ!ii ,se[ȮK&C}.4y,;O@0:dCss4m60PBlqedN[М;/pm'jWSHRFWȓX/VS,Ts!.8.2%9y} "8iHKMUjU;['LSň”YS*cPa9pV2 UO )}t"tQ~AihNU⨆)zH_{⨵ɍ[FiKvǔMxn[=_dcg㴓jBE{2wx W㶭_C}/3[F5[mVxK;'?|N>||NhOY,Rb~8Xb,QD{@%hOP$1O;I$ICh'Iԍ$F DH"$Q$Ne'rDI"/Iԝ$I}'D>I"$Qgd$O;I$I}'D?IbehqX&&R&nP= 1?Y&k=]PYrzax3hz0`],d ?/ToOo{gGDx]E?0'r`J`XIR&/p1qɗkb섧H]^ mBnAX@Qe礱ֵ eԫ)N8AHsi>5{5]n 2;Yss=wȁ+>6,+EKTT΃= i42D46ve/N[ YXC+*=e3‹7;z]p<":A@P24;q8ȌA`CqAʰCCi&M %4a:H}'@R50! -'VE6Kf9pq38sR" AVe@oꛪ yMr -K?>nL5) 9l 0 e(;M Z?Q.kiX H_2Xf I49klJ^#%tqkF W6mA} :S1|g a ]/'Yʝ=;KV,GE4E3ۋqBj9nGBjC/> V^ńH`vRtš>M ^=逞b;1 .c0oW_p`Nz͸C79 k|}}":~˵wD#5,G g-P^A GY2~ -68V4Xl>d>Ltɉp*MY -Ȓuv+ٵpDci$ƖI({n4[NeBXX{ U~z'U#C[5kJ]n;PE?֑i#ŝOWiZƑ >*HNWk,P,m걔qܜ[o,m3LԝqV{3YPšŖd@Dٻ(q+.VXSaBl~dwabgb ar1Vi٪ч wU3ֻD4gE8Bݘ-c]L:Toin* - >6{=n!20srs0oM zvcOk+L%AWqHXB:M1ؚrm8p/zc }tܨp̪xA@MF΁$c3 ܠ;-& f;%)OѨTy!r.''Pd,|y7fjIz$Рq%#Xd$KΖ;j{r[}ml/R+o9%/DݰUW'@Q+Y5:ZX~Ktl \CÑ)7)1Uo!H+Ux<8!u 7_`)"0(np(`@2^0f.9-a .:_=L5h5HrQ@?"qAz,&R1}!6ARs&'IӯuzAFx xI#n,x\0 fmey][(IQ` ]6PRL5"5DJ!:QzCx9Tw( ;h*;T uTߧuu;'H=0Wua=ᾗLIB^~@hJQwؠx,,lX_d -cJe -(y2|bx#hL ag--!B:&`jSeU4W0r\¥><&CLgPJ&QP[|P)5[Z3u#|I ݮN*߮%ci:2ZhimE 7 -vpSG; %,-;>I%!P'ghqծz@?S=/A1^m;r8_CD E_Vݘ;_fBU0\If Djc|mfI;>Cq2ztzhcLNUą"1 ?F7e I0IQM;.m9Fļx!x W2Ӱz;Sv7P~cQF(4f)HٱvCfj+ 39qbdqEo܌"4:qN'lv.WFj-ʍOBaONy3Hv{M(_q,ݾOv_rG!:F֞n`^P~%iB?%AYN1hsf͐T`$RK.OsWCt,'|X#ەUMZ)) -JE'X6 !|z_}p/&̕Rn>KB|m. *DihzT 2Z -NQ!zĽ>عlYZke9kܦ9Yv ap#X,n#?-'#U2,S7)S3R&-67h.D! ZࠕldRh{Jkt2OHBNź±b6goood! X; gMN@ xuoqÙ˜ۈ(T>2)3yh -PdOl(QXHHcy [&|;î;]&ä jO&YiowN눭$ #X)R"Q$f'Dq=i!-L1i^FZp -(wM6k8`,%:r^-cF2oڃeEtͅhY L p,9><Me7q:J. kvng4.L6Lั1ukFr9Ϊn7=-!CN5Hcp$i5ͬd'^9Q)Ǟo!p}ᯈ>TPYuZqބ* em9 %xT*fb{NH` YB^&yRUȧ8zٵy T%eDѣ vN4;fz|0W69;.`>@9R[>MihEwF1``WҬ BZwցg -vT@ -?1k7:68΄N*P%StP<\wBٝv]f1c++s}7&PfAѡY@s}NgJ X9>h igU hNpϝ RݛMc-6(8\'C2xjWAA I BGJuͫ 9g5Apb_#MXzS~b 醥&0{$.Vu*RAUM77Lw(q=^S<#$ܟ‹}Ͽs_?#M3Ys ֨qS=_ ]2.Tdq%4mIw-XFo"X.t@y<̡g\ O"_,qAoXqn4Tù|-MZ=\׺TeLvt5&L"eATYڕTQ)ϸIF;(Qh 4vjW̝.b_ل[=#4"Vn WnN黠]\i섀آ95]bnVj+y \XaSخ=i10&ʄdYkB(r~s1^e0|4@xh˜v Ǟ wvU U IHkqUdc0ٶ⾃\AA_b V j<@.t<.D׏]yا.uDjVVK7gGK rSo$i۩@8#J$+Nj1YSWOwdZ1^Dpg;73UbbJ -ĩJMS;2؏TrKLl{vs;F;b% Ui,jB7ѨתzgͤehsV zQ)W&igL3?ߛGۃk --f0X>AH;;~+iH~pF/drJr/0J=7FWQ^r1ŏ8xO;'(C"A{V2,ڨ\VkB)ek pc+:*" 0_ "h*%o\s݉=ZEcVzQXRs-Z=Jٚ9+v6bS|Vm#x[ﰤqY y+D+qB+ xgT- `OjRB|iSUWm4aGIr"M@B?3?>?:- #Ĥ7PE?ج~4OFhO~?~!C?ۯXFtAEYԸ PL5rb5Dq>vc Q1=~{%]4IVH?bN]o'E4>hl#sv64ңF. v{vKvAu5)2PˎIGF f ' 6@Y$Ns&wiՇM=]2JO'$O*Lc_.QDdLcV[7xۭþ~TuG  r[4?8}r]jm`[M,"VU:xvn(GX -'7 CF67'qJk#7:=8p -_68j;_0>_G1NIQ&9cIo;49Ƈ!F%xG+Zri4GdPla 8/?0W.3p.ChFlVW Q8uӓ )1좺;)+((a*`nrCٱZ%u+~6ր>SH~*渓Z` `y>aζ٢ g6sPDFŒ:[j}9%FӠ3WF۱r'\ᇐ&[OXLԶsÌv2`@Ң]^UKBFì?c?g9CJ"EăXp,hq kŸ\OvVۅV5ɅE'~ Yi5!^h -]&{$G&/CqofKi>t+m( }*]Gx|-8>$I=؉o# 7=D8b ŵ,ZrȍOKo mF1 R?<0m$Fbf2;mVOhTH "g\Jevkc^e̴OhUP+jxbHWTӴ#H&A J=3G԰A/ttB?(d%goUvFU)m|d/%Ɖb.d.ṪZ-\ g5xU)6,HU`U+l1aő&/"yi`lBCkGF!DW q ٙH'K%Ts1UAP D0: }?a`)ٯ^B38Qbq4ߨe3#k_{+S~*/Y!S -g{q~I/_EɖC4y&dQh|q 6GJl#; ~]WqLbu>9Ɨ.* @;OĠJ6Oz(9ߜEumva,"@³MQ8ҫםxt77\7Yl\%WuT褦,yk ػ@Mh7& -o"댚6@Nh1d2${XfV_sAE™UiϨ;1(8Eo^!v[`A2ԙXud@P_:!o=U( -u1_bSiTAjF#,m➤)v&Ukwvե3mk_؀w..k.NcKuw^n$ P؅J{JhSS:J7K*Cp&"MExK]%սHZRZ-IҫYSR]M}xrk8 -GpinJ^^i=dFxH踶yd /WKX) -xf"zЦΨC죅+:ҿ1y>]6 s|iVH[P@_C_IP'(;yH줪 P -w\C6PMC/ LԀ.o҇ /;45TA/ {HP@bnTH,˒!qZȩ zͼ z1:?=)\ ||K| -DLOUu[Ǒ#/C9bD/Si5kf]lD:W{M[*GY}:-LǛ"҃ t =ȼkI^"|~r%ripsF>n<7 -Yyn16q}͠m8wl_R>"֋iϹT]*_[opJL+ry5f -05=#58LLҎZ4.dbmV+p5¥yDwVW٬D-W,EksWrłt)V|ߗ/ ( <ǩO[L 6fᄷWuXx!ZM{1/a : `ҟW^i y7`KQ ^BA>hߖ|ES ;8 y -.vJWvq2\8K:=U |ZcVzpmRI"=OSSsڧOotx}1pn(<^:UlJ-x`M7kS^aCui4v_z)]k,9Jz>ύ -+$ѳ?S/Mhqb}]VQy wŢBlT_8kfC棫¦lժں$3b)x}֙(Nbl0_P܊ ? I7siAsNK]7SB\v^a0 -̹(=Sm@*+zjٵ䶁{z;#A xxͽ#DQdX߰&Ц_kAS&a*p3Vs!eL7r]>\W"cp|?nUs =t;IMj6xݶOl<<[~O愖=vk\^_x#\j1ָelɕ}2^RdW7@wl0žS8I-@>>oi?.v6j^uLZwsDm=*4/+$y"Z)~q_BH.Lwle]Yu,~Dz!M :/,sT\=qya?N&ɮ&X8sWPY't{ nY*x&}{Ur ѷ2??_?=/ -92²6ɸ!_ -4DH&!7vw. 6a(%vlE;'c#}? FG1q^O 4RhPݨ 8mJ?G&vlfE_HTT}lHYo b[RyݤѬKȩɝb0W)ߝ|I8{=~}kmۜuiKO(}m%cү Ը( G} ^I;/|)^Σb@ ׭MA2D4B!!`z^Ŝ1bFìT搟GS>9K' -6xdglqr ig(ct2&sjoúw S׈až`CY6%28g; L\X7/2QBK$J9/YQsafU$Y\*pÏWzՇ J/mldosRᇱ|._WwF2m e˾yX]9lqWv -$> rgtIiOahhjv&el -Nz@w\MucZn<ުuag}X&^u2ʍՕ"/>~_|iu>_@- ^ˊ!+Ɔq -,!S w)~aL0Wd|T2.b1ptKTfچk֡xPVuI GVRpI C-7Rf"zO nʒh{-Zg0}_vNAJD ; eAxM\-N! Cg8W꟢Q)}5A6kd=sOq`JO& Z-Woq$+q׾}SnMk'mZqI^alJ @6Q QU2HXkk+zUYSfr;r d4 -8 -*u vvu#:Ko_eIk<5nkmosVf HJgkõ KyۄUARBdAN(-H@b!5?5FAmY350w s;_]cz-C(BMp :W5#5VQk!Cc?pu-tf;ġۆxbb=ӗN;(V=S5?T?-~]~e~Dp})E3PBᯙdlF*(SrM?PYC)Z6uM(ESXS"`gq-teI~OH4(!m\e6QKnCFyI^x3j$;V{@q>JtnOʖFQ))!PcD6+]6rQĢ:E^ZehG!0I*EMYm5&32-)1#$)ql>de $gh3rd Mq(zJe@ruԷk380P"QҖ N)QhcqJ:hPB(<}KHuKN@L/ˑIAqyMA弣Xa{A !mK7}u@$.iDщn -#/ - #,z]X@ -Q~f$N9 {Ⱥ \s_4R;L򎷨o7iӔ,%!B+uvK>J4tS ,f)U+^ZJe1WZK`l -R4CWW2DTx&nQl+(SBx[n}nG_= yT۳k7Xc)@x%LgPDc y$k}P[ڥdc6/6zTD= -_y])i$"UA%zN~ +R S33,LNkTJ,K9>!62}';d0[<sRm1K` x|^5pz?! n^BLwu]x 8O15k[SkUX1*zsҨ%'1VƄPX\P82usr^rp m3K9q9{4u#C1f}uAt.GI8ԑ,O[&7mKPm$M胫hʠKvw\n4Ђok¿\{^ݍɯm!3|fHId 26 O (,$B`cg,JIƀH+Dܙawv,f$Vgә YNځ Jߐ+I ю i<13B`4}7p%-@WVΪ[wK&a_ʅ&C8ɜt{ ij0=W :4XAQʼnǕ=(ב+:,]Ю||($b]| 챯P2s -3FI ׭ǟ '_Ji -muoR>-ѣ2pxa2(ӻĊ+q>mQ 6cPb]- /=2_Czc(-zrbpZ;fO w!ܳwDMF-*5 ڬ }V FTyZThrE׎!xᶯp%Q'Ws+%T8PM@Vާq|TOk ~T;%Ql(ox wg:R1stQ㼅eکXIa8 -|}Q쪘 ĨZWʾ5^ "xOFȳzIY„J_;OÝ -%1aԕ݄۹S윺vr":Rg;+ ۸rLvܳMڷl?X QeY> =UK^Fg%[{R y5Q!抩r9lZeZ)B,hWQNjٱ6g͕~l  L\mU9Ű"yf?pq -%&Eu^Jhb3DPo>hUU2u3.,#קddpB~wOxM7eP3ʽ &q{sEngkY^L`7SOߗk'&O{&fo)e-BW{}]p }zw񈴔h^Ϩ q{?nXzjmlO8d31ɏX"$zh†u"mmpZ⩀<6mlw3iɕ%v>oﵯL+mXSƍh ЀuЏPn.Iل u`.mZ?[Dqlh$ǿ leGgX3$^l -XQt%>a9b(ĵN5"I{W^(njZXȽ0jaY{ -ˣ*?\C'.u]{̂k8)ҠE4*.X! `, )6T۹2%^!Cx1Δo -#4aL( =ыm)W)w3y.ɞ5s%HEɴxAU0[XqaD+#"B*P v2)`*A[pHzU"eTPd CNeFSW\5Zb b0AW(t T h+LGDM\$LE%[!@oZ[[NR#OOמ;BBp -qC@eY8P\[ w/>`1V%47>V1lZFEAZ ţ=j`A -X3Gev4o}(Mu$ъ@̤'f3,'E";6whDKFV< Qጎ16BQ>W+{6곬5W-b(ɖᡢ3M7e:w-\QOKN`Nz@\i=o̬ wqȴ9Q`#x2/+`dW6 ?,m JI%pJ(uo{Ob}52Rn:zɩgb E): -E0nJ7#49.+/ohu$r ? -c!r4)CWu#q.)jS`bbVj_U9e`V4+Us%yS`b'.A<݋c>ޏ.r:XU?{QHQsJJE{=)4j tXNj"eۤlŽ=^VOĥY5Q6lYz30uF^XC0?XXtQNM-j)CSL\\ހ~D}vh3֓!@:x+-DӤZLAnri,d$%6,͍X|u%_cُ#wyF1eHR:H(+NފX $(C?ME/X -b;^OZuOۛc'xL_0z̈tLN_٧OTBvviǤr꟰|1 ^͠ɾ]d3Ţa;r'F=n ^gl#ڐ]LD{b eoK4 4[+)SRk`}/ϴޚy xcNej3 ZɺJ@/x3g4KtӭO.u֭?~hZawMԾ"v,I^cK^ -iR6(q" ,O'}~{i)z[M',yK, z=#ֺC_W U|Z ]ĭ[-Z$! m3]̀auJ|dfbgiVz]fP!%%լoVX/+S=1,VXj_sFlY"zmߥzzu/=['^OsV!~}?);FKD;8TKۏVfU"jA3'25/+h;dPrfeȆ3a ɳG YY1YY8I%@']J-1NKMw`8g 1IJ O0,d&eoe^2oxXVg.ۘDbmq+Y\܍>:M']Hmf9!Bxm GVmr ;h6`u>b^~5~ /O_=1] Բ|^,O,ѧϏqdžOAV:k3Xꩠo˻$ŏFs%ܤ/w_Xo&ScNeDα~r(Ou;gŁ_eŁnːaxO9]'; M%D&m햣NQu]fV nj{-ߜiQ~zM^~u}/ˎèkG.O2Ojɓ+Ro*[w^ ŝ፥2)m.yMh]k~(a]0xzGP M v(B=5 KOD5*<u ,We^e^!_Hv$7*4p}`o,d&TTΫ'H'5!5fRǨɱ%JRlY| 5ۍhzWҋ@?~ 7$n<;zp+y@Σ2Xdu3*MɂL,6ILM-`Jwm& 8 ,q `./q18AUH{x'p ЊML*^h.`͠d\13{;h,K؋&XKF(BFdY߽.ej^)R1;X~g)D(l ]XbRzɊh,!jnHPIHP uFTG PHEIPIeymG H -HƈG2\y,@ɐA -+08B~# r%G*Yre(\U/J8f۾X䈕LPˤ̀Uͤ0)UPD#H]1BI($d0B`? oH+"^|3Äw> G> K)6f iooH? -hX!G6^=oOCixhmLD=!H6H$M^ "CM`:SE;zGHS<!^E$(HH$@ALA A - M!H*SP -R?3@AE)Hb)H)H -.BjaEܳ10hS҄tyDHJ A-HL uHjc8%c,$ 4:yNk0$β>J߳u印[-ݙ|a,9Vv.s 9}B~Z6ȥeN]hG㤿Y:spϹOh.b 5oo.pp/.|)Kqj'N({.@J6g'p͹ZHX(Z!8@.In]ex&ԓ mmp r\\O2_ໜ= PzRt>ɗ0Q^4vopʨr8$t>p sÂ40dıg -xu /zcuY4|ұBG^'~/xszIF¸$wRI.ۋ39=ɍgOr6c^32Ԣ8=ڶɞSGgƍ6?faZ'D1Q(O3VO.3so=/z9968>9Х@5]v\%9_O5sk$nы@σ!/Ü7xf]{_.!g9G{YN ,&~s14pj+[eWq?UiG)H!E92_059aQay裲s8 1ZFf4EO|6F̯8y& N9#p .~$>%!00H-t9-ʡFqc Z.|}S1.[hi寺-^ 1A%91my5"zF+bPd5d8)'DN$)7rmyCUI#@Gjtf57m@ú~ -zU3a.&̓Wt2(4?s# Z*уC!K -*h '9: I?}kCz@ tMSQa&7 J'ه}nL3a -=dA_)I.qP4v:yc -ENY&6',7 -% fDeF+f.x I`A)C@d^\2nbG/hcaר#GokBYVA, 'ƀcl#FC)rPG?j5Ktwlང_S [& 0oP\; -T: c  crs%@MT{CIz"ͦϝlƋ5d=: [ ˵+t@jd@fI<:D+9FD e' -c`D*W,!q;Ȱs4/wR;B,pXFPzeW~uߴ LJ!WCx:TrzHxK(Ҿ0mR ^Pfj qc!`QjbG"#*pB -Fvv4FUUז#팔=QHjw0Y uFuk#BNJ]7QteN:MTd}ٽ8'ZI)NV)^9)`,w)Ap2! -! =;q5+P`Ɠ'v-R(Lz7H<pqRsLj -OIZQ˸+_x3`!', /G74řM\>ih1j:E{h–븀Cs8&hqXxjR_TnCJِ<誡)g5D(_[]M=Ca(2Ӡ-վ/ q3_ -SE -Hgܰ_ E[̎CDz-97GL!+m>P7;/VF*e\Ol;p=rx@_wo)Fvx=%z4sGT 6&UTt8)ršA=(}c˃;'`Ӕɣ\ϿOb)) -ps~V3^)2xu0eadCp m{ -;LOald.r8\2q瓦;Gybc <ZBZj2C#0 km;ޓ,Oa3r,kYm([,O.l}܄Ro9GՓNJRmU.?]u4f:b-8őh O1q2 - 3+Mgbۀ)\JepPRX̱bJTT]cq(,6j 710 l~N@A7!;]}GR3:CgϦήj?$!K@^gEɬ?돯0uT{ YqO_ИԑВy*11$d;ZQ{YulZdO.٨;REmV$8U[1\5Q}GXVx@1BVr,]tJweL 632'WB"fa!hti:jZ.M ?lAr(eG&4%b0Rq4{Yyqi{GesfJ_1k Obf1g?3Ύ~|DI`Bb@Mo뛒ŭ;N|_'laYZNė|hsRO]⟱uL~\lcЄNY2;{Y( -2_vy|i6jJc1!O\`ƚ.Y5 !&IP{ƞ\OX<~c@QJQm5Ax&m^f"=(J x;r.κ#-1mC仏]wQj+ٵ{ `zM =ǎOxQ#p MwJG׷Gr%{dl3,=_Fb-4g&آ~wcU[c4Yg}8:~ٺE[J@{|ߔ@5fg^5}xݚ>$lWWSA FPd{Hc{=?}3 >!A^"L9dolIFN:RQl -v -ūS~ -Ն>~꿽 [C>T2L' b_HߨD6"yԀ\M$lT$XuOm UǒR?6϶|/L{W^88B&ZEEAD( w :ʁ -B ehk1ݮ8$8A!Gp -&$hR>j;qo7 zCraR~(b!v◷Ϗ$~ؕv+{^9Aň(i0BqHU$Kܮ$ĥ[g"#EƆaRց5W }Vol A3EK'[s9gej SiY[/$ɍ)xNod&PtBr8lehP>7E@͝PICSrȧzfȔ{4 dOCpHIW )6^!)IoV)@6c w.kt;<(U1|۫A{ҍ?r!s(̲Դ/D ZftSBNPCjgz.5U NJL;YiT[>!l%(rBJY/&B$)6,$mɞBJy9PN`@ rQ(5/mV]; -Q7Bh 3i@?Ӌ!"m328'jXk7c;- '*Norw;y,\s; j쨿ogS 8 >%xZr~bM5t7ZoMZW}(: -_C(n ʧ%% 4'n}fW]v7e[4PNȶ(} uQg1M5Bش:|ejd!8{ZԪmW]`;hY1fXQ4fL>UMQ>wn4J΅b%U=k@}<0p$T|j .B? }nF"ޢCs:ΉtF`w4U[ۚ+ CV},j >]ڍ@*8Pl^f6@6pvaYgX@1WLg+&wP]7mK9̎ -;(sa1ACgBE0qR.2a,}8Ld9cAiP"yn3[:4od "${m/yt_')":t8sR!we8EF٭/ѝ\M[nH%Ѷ͛CJa!_猪QNK1oPc$7!-3 \(8 -޵szO }DDC0lB"iMP.(E)` Ҙi%U7a|W4Įo@ιԠ>)$.ϣi8[HzR]617@i{8pq7Γ.tyȗ&uQZ}s"*Wur0%3 ֥ġK BÁ]EnJ{})A$#43_] t,Sޘ-ESRlI*Y-BB\Ei%0 -҅$Lbo 4 Gu]&BlKpb1",9^Ct'1{%=j؜.VL8 #9AEuu3oȾ>G~_!P-mN?0c.#s˶ q:bQU*3!Psqc;>*p2b j1?ȶ]yE3{XBt<,QžUEo.^#[|rV뚔e&!s`$ݘF am_, ҕ[y&Jg->cmTd߸HI^*8/g"Y?G_ -2Ydu1\7x( O:~ҍm,"`%MSF;s 3 :x- |lxD\)b3٘״ K^ZQsm8}"+qLjrJ0V°g$1b ILk^WbܵiHD^#f@|Ez"=?^A<-:,,|B!(Ƣϵx)դ4SZNVl(B5y˫ -z3ƌQ֛9YݔAmx_֠S1sa$22"l1`aLU;姜02dؚp8e4bz}ķg<,bLp^3kF#` w1 -΋7UUKCox1yX>;qS~?>V޷4{2YӄzaFG)O3&{kپg_ÁUsT$Ѽۜ5l`Е!Ӓ!-Ǫ8{9|G0z3_OqJĖLR[|TxCPãP =}1rfBOVT -yu Tտ'EW eܑi3{5 B;`Ąf̦`n Ez«5`mh2:vw+SGQ~Ζ1'kq/q)ujHC'"|Ӏ* :kz}==6_5rA)|_n&QoW}hm6=`$DCoa`nq׶l w+4Wo\:1̩@t5C?.LZ+_# -WP~QMLm:i٪vD]xJdn.D^D Exa"5 duQVX+OLN{K!O)n2"QϯzHel0Ho`TF37sFsU]˻IsWνh<&= `4u.:n*SړIn֋RoqԝZ9_8v977z|\&TΣr"k,VᇎʒSx{5B@y0厇C/PVK92RGZ|{aw.0&}k'ʇ-?Yfsrħ˴ vO)!ˢ3T첣]2==7_J^zjUZJx)lBUÅќR!ALP_H*<r4Wef.t6AyytV0ĦIM.=SH\"a1ouӊtjkzIFS*LCUDm[U)|fqo5;2<#Ӥq43aTSWL*%(JFݭC1NgEIAyS&viPKZ]b0fl)pXN+CՓgtq3#߅Z[f$W5X$It2%e4ձL}mMD; ƛTn2I]Ԯƨ%ѹV$85bVKݷPTH։D -u< w~Z]ۼ$pdVV#YXB0&"%(;=u4O'"_(R u#C Qlb;/vmhڭ͈2}f+2'v|Lnp%#胸<3 !+[wT<};X#-z#GF ukzn%,(~/K;;pZ( JrPHKQ[(k[ qD@a! `+>(.K1[]{.9kE9Gז rh-UeT -nDcE0KɏOd Zɶܳgo̻{c8la4rr2 g$wwpUù1 "(?!44yE]J:ALUtrq+jLyq,ٹjDJ.tŵ])54<7xQ:8k)pl#Lwyyf!B(HX:;y--Z }3oGlY{ TmZ1>1jFLΒ^0 䜉QuhSs*iHO^#ҫ -]מƦfLd/Gfa0Muى9XNb2ExD!>H44[E7Ǖ1(p8qN2R`FrG -hq!I,xx5=HiK}je-*[y"KcN?gXtuDHkCt}s`¤s"[)O٢@/BB3(E6|- ,5,a p_q -ȟH̆lpAqhd#BR;ќ<J22V^/Wgx>:Xŧ;*#_}&ǿtp@1Rx+nCʆ(tgE &0 {Sw9>Ͽhv|=ҙ{JgG,ۧzf`~=yZm+nT;7/5`9wfY "q93=3zJn,%ߍYf[#M,w&X|1 -ι4=7}e5!:Ԝq~҄5ftlj{q$n5w)-c+6VD"I-M -R$0-N6b=OTIbr=QGmG@]]YKb1n1Yc$[̪#k}kl dHZqx rXC%|mI5+Jy5#sD3TG.#{{uaCOژEMuJxeAd/ l -Kut Fwc'qBL!:67|7z]JQqqT%t+iI"%&&%#{:_O{.V*KBe|х@m{jUdb깴b@\ ̗CdD6\Bى|kSGDoc39ݘ2X Pm+eHsvCjYѣg2]Uzyom2['D]rιCz3=0\H2Qѻ2%aaDrŃs+EZk.57C0q*yNaq<#2 ufy0994kx߉H5ܖAJ"]+LZCepsRj 0Ly!BdT(G1HB:zV7S3P@} 7u~_ [t0h kE"YGO4I<遊 d J *U.Tڀ95kp9yw6Hѷ Q,>s1B~xV^R(ܞ/(;P{5; Wd& fzU"Ya ; yq3PZ3FUL71GzOW:Yߨ@Q)U4 ߝ;8 -j_`?~U{ \>ܐ2NASf2ppMP *27衃đ2d=&OY*i{&iYÊWMo_Հ%$lqtUu>>F2i@N־ٞj^1ZCJϡsP4a M*Q]9sX`Tj] -7qJU!aۤLcvPM$'@HD撩?Ww[*\} V*ww0uo9Jn}Ufa-g:/^Lǎi ׮ATo9}aaf*z[[124Cjk}!8.˿lha0zQܖ`.LV`Mv"b'^h \uHDP53ID$qШK}%ҼF,Ji<*-G)!P }*2"]86do #vwT`KU -a7mJqʇP* T!bt!TR"r/(V\(>|V9/y@D_.)hS5*ȟ- LXKb?H_{pr#Xe'cq0u'OJ9 -n(غM$&B6($sD$&x}}ƘZ["f.ۡ_G_}]Ixߧ~!U$M\JLV%6IuUCYWZ{.k#ԉcHQu"iڊ9&k[VȪ9K -zd4tS3r&hۤϯ~@vuV,kR8*/`Y[bw!y#E Dž)gm@A,20{eʢZaB[!sV5Sa$?eO " [6; ߤ_sɣDj)fG]$]$i!1Gs[T]C J}XG] :8S%O y2W9@0WhSDuGc>@[B] јuc,si0ra LA8RX -1%Bq"ٰ-*xߴ x+LH'(ٛ R)v "_b܍ok9y( l?x$GœJlĻ+hd3k7z=}%6癋ϔͳO?M&1teў IbC?I}2gKaؐLu6g,fzuB -rmiX ԗ-GCRͻYeZ)(@T_0n?`B3{h(pP;ڟqXbi0I/͔H4*.yKW (DYB#VFޝ !-5P%l)~7#:|1H8WW5BD &i$/>[7۱pgG̣ʐwElqݴNn-﫻[7+_lcpAnw;p_Ďyr7Q.{ -?-hcS`JԹA^#7xe/! &Oǹ_1Ϯe?W|+r-0Y%={Y.YtK\Ԏ^4 YTkZ?K)v2 -h\`d.g䈽u@*@S9 lkz`Vb\lM55 -V%ϛ4?ȱZC -ձN( 8-rfv&S] g.rg3W1K:HTUfi`qfXZ.ΧK\PKyB-q,Yr0Ķ2?A,Vbw9h:Y%َءbˌу -cߎ@7j 6'O]H DǗ#n8"qPGӞEN<{ mQyd،Orfi ݋ϓT;C=NizDHKRyo~l`k8VgkwL2 JqШoArkk:V+aI:Q$}Vn ^B =h7`>*J\3{I#?,(X\ 7VNC禟twd:M#颇.Rj%头$dJvtm=p8G&m%@ 1u& -ֻ\,LF*'e`2qf3q:^r 2{ҶȣKaJ9sHp!}Hpb<pFΚc\4[ġWzo;OeH4w v`EQ>^D5 *^q(LQ?ZFVFDlqm~#(BcI]3"rA.b(zgϛ(z۫?3(z>Pto5*I+I[۩$y[h*y*>F-?Aa b7cзM][#XV1'{6v>3TÉm"oC09 <,q7w8m[b>z0{dʲNVѺu"ZmNN ƅ%"Y~Zg|"QH_-w _S`̝1g:0kq('G4b0QFlPnj7tI]jƴ^_~1^|G>=K%?k&iJjJ$\,lRWLߢ=8-@U~*)ie^ۆz F8Gy- ߁ MXYf]keh4KJI mT|gCa䛪cl k=YuGάkg]Uy Y*r~sM/|?18G,]6(mY]/z?!^F, e -,b -.SR:keymC^a]DcuWC1k)9g"jnbQ$W,rt)`+t-qE5_UWuOKkvXyO"NuE5"J8tFWlRJM+ -ʉQ Ol9gq%+3t[r8K(&3?SP;^QcT,h -rw$b@$@vh8A{s(]7/Yz˧~]5ؒ;MXvU??3{@|m>(c]%j\p9I3oTXF\cD"ZjsФ>͍8!Qˬn%kb. mN^ bnQIM5Ӯ\y'Q]r oCͨG*ދ/ 3Luon&Xv8NI'}=gi rV.7@_P/tqhV߰;f=^aԃtV>,u(ΊOZ\Dy85mj·xQK={k)B\hHAݼya`M.i}5mBa/.M= R1:V͇B"% -TB -|aY#<0QG񸤑9.ʺ]ƟDG?qP~xa@wYA'u T=H '[@Шct'Sg%J# -r]^/2KAj"R";rQMX f_4m5I=v\@-Xp2AmZV؇ A0,؞:-~(Z3R/F<Ai s] S+a])Ƒ.llHHI#êc@w=EV9ϣv2SBKoShB ؐą{vt_2W<2S(C݄[*o{22HQp/"{=?L轞9/mk(+ -v/̓t}@<6 Y~ǶR $!6Sjy&CNk/%-:9"4E뽔P3$X˲qWS&CᜣVt75Kct;=;J79NYk3=+drK9#O ͂h.?xȌ~Tٹ_EpHR5* qN} ew` -u΀PLjO  &%y\izśꝍK5;^4A퇺ѦdH6Hŋ=Iɒ,Ukx١qjS3F:ŸACQݔ6-_#W\6*RAY4E3R$- ߚ椬h+~oOyxg m~s'aG4*^3R4h$o<^0`\d#tᇜ^ %jg}~~I \ca2tA#rSENW* ڣ2Q>%X}mD,[ -eϡ5a#-6Y`o3 еXU[56tji1ה>hӎԊ1Nd`Fx2\{XVYeh4h-.@ 61L~U:  M8*8,1%}9B\@mtT=/b =.ҏ%uAU|^[cwn2Q㝣wV] -Ϝr%$y8yF!(pP!i-`l*28+_+.9BNC+J!ꀉ&P5!XNPG Kw\D$krFp,{7XXЙ-EtKmqDÂG=Z\ lqOGu5͒_iZX"2/Yܽ#NSH&A̦ iDAdul]0r0]ZΑ :vF$^+_M@gAl7Ԃ6B LmJU^䷏`Fœ\ -`eus^lȂM6QhV+5 \^.@AjI2o Y<2 ZU7_dq$M ]*d3.tT\5>J^]q7' f]&JWtFw$9!lQpK߁"ݷo (It/C#7ybiW0&U͋M;w.mEt5.343.mc#::O`oD)凐;{In{B/Ћ`֖M Ek]AL˽ kL\ W$~wVn~ֿ޿ożţ8DժaYBz`MUUhJmE3K`&i+_}!\|44*5,oR9a?/+BB1`IQ`$cloH"?iU!raxwPbR{QbB-Uwc<@+2J_J`x -ưM{P~bٻ.}<}g GCɸ5ݬ{ᑊ`4|blu1E|r0)A6(Dl>]Ktklv:@`=XUUô tUtNk[3r3\Lö:!υlUFKZx+.+Dt2)iL9SA4Uq:Ea+ż\t̋l)]/R4rȳq-g;FUjhL}!HD#Tȉ;iz& ݹv*mY@ C޽..o7.s7թN+:@q'jd0?$?=2V%2wq͹J D] WGxҊ*5`!vm ɘ2*ȽUe3Kvq^ך$[f1f9Lܮ(ʴ1>]EDr, ?:,Gfj!$Yޑ5=0<AvPiz7L !xҔ&OvdP5Nnԍ^/S5ܫX:N r G4_+52O/+#0}GrU+>&":m8FaAea< c -8U{]t\!F2f [WL&g4iKB4$*xƜiۍYһE V~SqGk j)8y#hyJ'x LIgԑY<|B>Ye˵x_{l7`nunKt Tn'рr̄)pk"> 9đfNJxfi $Q{5[&F"3%&)jQa -'! -cے*)hF#Ɓ:jaUJM$ӆos'j>.J o;3 LQlޜm'ʏP/܀)CE9)<6u(xMdTFkDGP%$ع2*DS 4s@y7nC·AfM͡!hP&A'SY^& -#PڜrdFECx*e'h0\5j&0J`n+W6j1}sWrtrE߄ W年Cḭu5_['n&%X]`!=>ʵT_S#J+)?O D)(+zRf] -)aHhRۉX);#KtMP}HVC-G~˅]N -UUH8d]@ -M0mCvhVu:9aid~ʛmSEAӨ6F&J;7ug]Un#Y=9q}Ū=a!D=V62oYvQ"RWWlq:>/| C<= g%/FbEHDN_o~Y<}_A۝|H@2 CJ=4)i-9%~zM68lxA#' @#&a/c&T^h1ўD BB~pxv[GЋ"W},2~2[4Դ5-k/uM=D=:-,l>g+ 9I3(OZ%4Y=Z8]N!kwԖ,snWbΨJ; -6[j:熕A` ac=kFY-hpth]9bR;Vyf^3 N3|8τx}ဧ) :Fp *ΟFZ}=BjH#' 1%wh5:ƣqtgw{VJץ[$T>oF!sBКƧ:1,_Up(5/ ڶBumVVG?cƧ9!#}Ƃ <dC%ڮA<43ѩ}XǦ sJ\5er.>%lLySUy[V7oQ>][D#,O ZDdmE__MN˥쥋 hWɣ9,QM:GղkR+0 )t$H{/N.ܽV$ȀkmT8O%tUJfCd8F#w|Lmk0cPIb&}-f -Cl G`!Js$Xmgռ><`{џ4r⹉8NgTMYJnKD{R9e$eHͩݳ Hg|V"sm_Rs?QW蟮F%c - n _P#t y-<ް2͊&"EzeP0kB"w EgtSݹX[TaS*IP`PojC]$0l׬^]Vª]q 6VW_*ߦ.CTyEh0g HT ;oU"1G*OK7 vMqVNUYU'쪙yUy4q, ]*JU82u6٭Em=kTvv`mE%m10^IJk@jkgK-f;5o-aT) -T#`rWAvp߀&[?Dw:%+dN nc+')\jlJdv-]z25).zf9:*9'xƚL(L,{ -DlU/'9rX = -ѽ>~z|1ea>m^Ow_ i|W}|x~#{Ň|ϏSbϏ[&.OD#Zd g{$e![O=Vق0l`jn+A7jYb`V6~\&fV6 ċxhY(莎C=FONИh1lޣ=w,5`3Brf),rk.>xsA8DUDd%bD9TT} #!B>wA"}y[Gm]cHI"MtxAѺPL6W`phR)&?i*0EЪNd%s^G'(sg.>%N-3)eG $lHWՒT( 9gXW*וl"gGtC7Pwu˦\@}ܴOinKAei!YhD赡*?~ϝ#8m;NeȆCI#wqrl3WatT$6S.L mCvAm^Q$3#y=b}"",xుJl+ Q@ء*Ȏ(;gEMNFR}>^RlP, t40(,d23vKn0!/[yn4̓3j n  -HrziתQ6NS yYm6}wz U;ԵAĐ(hEEdFR&0|curpW# ,APקy'Poڛ{hƟ@kd~˸pb=QRC)ڽe撊jȳfqC=A@}Nc3PMRe -[cY< xծ5MHs!h_mβJ2A4knClv6Ui @j& QMm@ҍژ<6?6}$ّR >yᘙL^4^hW_Hd~ X P-N85F| v qGEMQ|w/[uHzf$I[@8 ^Ǣg3L~Ɏq4+8y^? -uR{B uFtأ 'urg=}{r7kt5 -+inCx4778`\#~ o `^geM^een?hϔ;s47+wVIժƑV|U"dz},}uL#u?c'X)gu =} i)-zq>4'T? QI#np7*;|#*2ϣ}} qHxp&v`6j5pؽqN!Jom% (nD<f ZJ+~(-zt^ߝI,oWY*f.\yEEw4m .LjIOo YtlQρ -:]QQyG1ܡ/e[;ExlAC-o%w^P`lVM7|m&jR3o#wI. c%WQ"Rdt\Ri1P/]o%c* >WUK:vUS p c::Z_5G k”!}1 ҷ>}4a >PI$m!\4[ƖV yZirC҆Pbu=$ɯ(Y'Z[Dovju3HV)8c}O6&4\G 'aNK/'{/ށZӈ<$ޢKmyF-~,Y/ȵZ hY@Pbˑ.Lt$+>YUOr ve[ǬA2*T$9E^&kŀR@ąyVqBp ZH7e aqpDaVtO6lڨSFڻml±htlAW~pIad_#_yӫk -=e9o^*<}~~%md/欂nmq~믟'b?!X~ǀ-r)=/2`R6ț$:ҔܤG!K? fU%7~} XoST;'Et?bUƼht(2%`e(A 'gY)*ȥ>2{+iF|78mpu$nbt`pm&{v}ʃUI@ !ѥ˞. B@#y鉂Y)CÔA(Ɩ=}Ƿ NMdQޥdaqt0=v7ݜ5^mxfO/'0AjWEEK&=kމl%#d<;:I$O9Ƨ(qT'Z)b A*pZi{]Wv?u !\1V׍Wص -};pJVþP֒DԮ[qJ8X*+9,;*,S'Mӎ=;]cOp:5sҷ彽Ws =5]k'ehӉr,| -5pwI=-v]_xtXJ1tr X e[Tt3a*"hZ lfcRSJh,VbW!Gthb6v'OBM t^({%Yv?k'E}; \s_r .!˨qϗ ᓧu6$U9DŽmϠtW`Q¿" -_ W )jn6P(U#IfdhPLhxJGB[}xA`ޯՐ -Y䔦 JG`m1<ԚdBiDq5?\N(k8GEQyzlИw+WIU?mJ挛iZᾷja`1)ơ)t2gyRzH}3}YjmGE"pg ˗;u~e@CQ l1w=jr+mob -8sE"zMbKe9V\`7UL 7qm3U L-FѻK/CEadax3 hR'╔⒬d:iim~ xnCxRZ?ڌؠ^I=O-4WωaU6P0u7&^[x'ceb5))Z*쐜2 xkw <}+sOÚoTc;*7' -p:? -u| -8TXCJQdwE9DY4;(C$u(X{^lߐ -g{:N,s6ʼ}"GANZC}e.;"pHSt4kQܜzTH{sf GmRݓ^E^h؅y=[Csģ>wmPc߆7LvwZQMx0L#OR++Fp7]s,ߌ?yg |} 2z$sx_;@ǹټo3Snnf=s?gpʵE TuU*2^ԫqF2ͪ6ūd/i6rK NwT 9ix V5 \V.3d b`7v4(8j5 -upDj[B3"~ݲuyd2;mbڔ\aw'lwZ;.wN)a뒅6=(KAU}wXsHkT&DA)ɘG|Jb W6Jϵ`\GqUq+uYi^C=F\X˄_ nYQog'~!J) À.12%벎jiR+cl]4RFbfrjf ֦8!Z@cώK or" iX6#<%׻ l/`6*: JY)dUi,jD-sX9`-tک@)CKa UXW)g:#ZU26Jv%W?gTZ& 5',5ȗˋU9:c*tlxa*꺔dMMaaRBJc5UwZkwӞY i}ԯ;]N51n6(ԬP3(X]a!f^W ܭW+طGV42fqUrrհE߰OD -S+Fw֔tՙJR%ƪmO#31RVxWcBfO)K'Icǻʯq\⮈&?Pf,M̏Pu ŕN -hRXhRY--hKQ\<;,N(&vP$i#5JPId=f0$:UZ2UV"нt]3].\2a.^֖*Qn}z}pOP-wRX)Q_0yŝ>~mVbRcoV.|~4k<=6ۈx?Ǒ]egD%In݋]:wN `eq뿇7`Gd14ޏ+S>Qr=U90C5ArJJKODa _wh6c{pL_<\C_xO}bWw7,]a/3v _:}AC3yZ;Xn-WĽ?oyW:_coM([0O endstream endobj 171 0 obj <>stream -8;Z\75n:[Q#^[-_Igb/egqf@K9Etnuf96T5[#m5+)$EqrbPOR5q#*f.BsitV,"ga, -5).U`qE0.uaQ.PX+3Wf2-h"P'q=_dGIW$!MIh%1WW endstream endobj 172 0 obj [/Indexed/DeviceRGB 255 173 0 R] endobj 173 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 166 0 obj <> endobj 174 0 obj [/View/Design] endobj 175 0 obj <>>> endobj 164 0 obj <> endobj 165 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <>stream -HT}Pwvm/릜fs'W5 R?BᣊxVohmOUnT)=B!TĒTE# iWmE˻o͜쾿}<!qućXg'F -hS eBts_ u`o/O{Q&kઔM)ԴJd/edb~26=[Ero|,d2_E_W+*}mDBGH$!d.DAJH<%K07Cc.ץtDzHWo,2$RJO5SLpzbZr?n 4 su -Z)YT Z Q;PZ΂v&B<0 3݄6v//iSeyoS4#;vjNY-,4qaXX֢`Ѭ Hhdjf>לTtrN~3X `fa%t>@2z_ lzuf}i s@=bՙk5lc4+1,VwllJnLүߚxSNv3hohmc)U0*5px"#;> dTEryELNKMPNS~ [p: @mIH5ɚX~vo$*(DJ3 -SJ] \:W`Pke`~M -Ar1`L~qU4tu5kqўBJ`-{C0*JMG`:]0OsChvҬR!;7B='Hbd-2⻣|b~MMP W:H`=qmR1Oҏ֚憄%%e(`c ~[.{y-F3^灬}hN+n -^ĉ`fbwK8޽ bm{;;XrK}3ٰYO0r t:JI1 YArMbS*g1x;4P$8$cg pspSzAimP >~-zf<5\B@* P9(1=1m-*`G'#Xp#8}Į\&NJ鵧{2-|Sؐԇ ;>ن6\༣{{G~6U*}Z@6Lf;q̔i!^bt-8вW wtˉ˧:#?0Djkyȩ#]":A?(bًyţYg[?\6祝T4mtbѫ#̃hڬ Iiâ37Yo j0X7`֖ -zȒE wktc[rF7jLT0L;Ȥ\9V;:]lz4Ko ^>uJY1O,,\J- -6$=)+ -r˖QhC2#)u -6 -dn$쬘,ur{! dxfAPd@h/N7H(dx(>gBܮGjO^/mߖB&SP(=xh!r d]4@?jp~}:RaAy|׎2EEyD _,(8?#DNij ޮwP{?0|,,v>u97/eP|>xЍCdD1rW1ҟ p`M endstream endobj 176 0 obj <> endobj 180 0 obj <>stream -HdUmTWI23f&t+!?QRzEZ%PUq-ڥrlh -MxDzoܳ73}<{/I(dIqS`Ș?,0JRQHã(խWj - '|/Ur IXɸzU1oؠ\eX*%@٠36Ys2:?yz.P° H< WN% %$ L ˈ2BD"ד}BVf+s-ſOTE_&U{AA):Qr6%oD%% i0+<]tHxKJ*e 3b0!S\dwwL1EL_DA~2F>/ -QڋFClNLEƯ D; ʆԮI]\Oh9&p]!ϴL -@4 H9~HX9-CA8+U`a:]i*aIKoRE}Z~c5CEKIt澍>pTK5@0ߛrkWTj'[#2|ayh `#e6r \0#3d\l w$.M5jkn,(lGk"ΥE(_lYI@+ZsVT1vx\ETԶ;ץ~W)O[f^Ao *`SU36p<-Y-|iܹVî)D+j4> CLnp] URnQ\Zq  =su -mZG3@CFr4^``xկ jܖ. -#|@ugJrJ 4CoCLysv Q(L\*`ZZ @)'&b}3h)}"? X|1޾. -7(1q^HPORh\#ej| =Oxޟ\iYF+Amx'qϯ90BVR3eK˄KD)7rmyE;JƆ{%mpN r]}S,Q<]6g&g1/hAI 3s>Є%5jMتl(S2fzZt/aob:3ġ4g۶Cs-_[~μAn[-ZȻDž}]ʣ(6ؿ~\策Gw7 =[ٕ@91BCy}с&O -\}胆xsEXg1Sspot+nכ,7Q}-twOVz#akߥ؄/;rٻ{lK@vm5_j509 {`e%SM<~w`V_^4ZcToAR[ l.ˑzprcdu{ŢRq%Aɭ10?aWw fT7~oy`)01N^C{΢ؾqf3։@-`8M,HgS~9\`3\zw.m]  1o?,h2wjcg+ ?:7}`{ݜuڜIVMZ#wk֔ fnzo)6ꬍURyn,9ꬿ}gm=_;?\cXF0Vrbޞ}}13lY~dm.m/8taB9`qܵپ)dMMN[-W?G~Me$GS{yx+ -`b endstream endobj 170 0 obj <> endobj 169 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <>stream -%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 15.0 %%AI8_CreatorVersion: 15.1.0 %%For: (Dave Gandy) () %%Title: (Font-Awesome-Vectors.pdf) %%CreationDate: 6/3/12 11:52 PM %%Canvassize: 16383 %%BoundingBox: 18 -784 570 775 %%HiResBoundingBox: 18 -783.0645 569.957 774.6206 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 11.0 %AI12_BuildNumber: 39 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -811.4707 612 788.5293 %AI3_TemplateBox: 305.5 396.5 305.5 396.5 %AI3_TileBox: 0 -407.4707 612 384.5293 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -527.3682 836.3882 0.6667 1288 696 26 0 0 110 194 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:181 371 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 183 0 obj <>stream -%%BoundingBox: 18 -784 570 775 %%HiResBoundingBox: 18 -783.0645 569.957 774.6206 %AI7_Thumbnail: 48 128 8 %%BeginData: 8182 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C457D527D7DA87DA852A87DA8A8A87DA87DA87DA8FD057DA87D7D7DA8 %FD13FF7DA8A8A87DA8A87D7DA87DA87D7DA8A87D7D7DA852A8A8A87D5252 %7D7DFD13FF7D7DFFA8A8A8FFFFA8A8FD26FFFD057DA87DA87D7DA8FD26FF %A8FFA8A8A8FD07FFFD04A87DA87DA87DFD04FFA8A8A87DA8A8FD07FFA8A8 %7DA8A8FD05FFA8A8FFA8FD09FFA8FFA8FFA8FFA8FFA8FFFFFFA8FFA8FFA8 %FD07FFA8FFA8FFA8FD06FFA8FFA8FFA8FD07FFA8A8A8FFA8FFA8FD07FFA8 %FFA8FD09FFA8FFA8FFA8FD04FFFD04A87DA8A8FD07FFA8A87DA87D7DA8FD %05FFA8A87DA87DFD07FFA8A87DA87DA8FD05FFA8FD25FFA8FFFFFFA8FD04 %FFFD04A87DA87DFD07FFA8A87DA87DA8FD06FFA8A87DA87DFD07FFFD04A8 %7D7DA8FD04FFA8FD1BFFA8FD0BFFA8FD06FFA87D7DA87DA87DFD06FFA87D %A87DA87DA8FD06FF7DA87DA8A8FD07FFA8A8A87D7DA8A8FD33FFA87D7DA8 %7DA87DFD06FFA87DA87DA87DA87DA8FD04FFA8A87D7DA8FD07FFA8A8A87D %7DFD35FFA8A87DA87DA8A8FD06FFA87DA87DA8FD08FF7DA87D7D7DA8A8FD %06FFA8FD057DFD33FFFD04A87DFD09FFA8A87DA8A8FD07FF7DA87DA87DA8 %FD07FFA87DA87D7DA8FD14FFA8FD0DFFA8FD09FFA8FFA8FD05FFA87DA87D %A8FD08FF7DA87DA8FD08FFA8A87D7D7DFD07FFA8A8A87D7DFD36FFA87DA8 %A8A8FD07FFA8A8A87DA8A8FD07FF7DA87D7D7DFD07FFA8A8A87D7DA87DA8 %FFFFFFA8FD18FFA8A8FD0BFFA8FD08FFFD06A87DFD07FFA8A87DA87D7DA8 %FD05FFA8A87D7D7DFD09FF7DA87D7DA8FD04FFA8FD11FFA8FD07FFA8FFA8 %FD0BFFA8FFA8FD06FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8FFA8FD05FFA8 %FFA8FFA8FD07FFA8A8A8FFA8FD06FFFD04A87DA8A87DA8FFFFFFFD04A87D %A87DFD07FFA8A87DA8FD08FFA8A87DA8FD06FFA8A8FFA8FFA8FD07FFA8FF %A8FD09FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8FD06FF7DFD05A8FD06FFFD %04A87DFD08FFA8A8A87DA87DFD07FFA8A87DA8A8FD06FFA8FFFFFFA8FD07 %FFA8FFA8FFA8FD07FFA8FFA8FFA8FD07FFA8FFA8FFA8FD06FFFD04A87DA8 %FD06FFFD04A87DFD08FFA8A8A87DA8FD08FF7DA87DA8A8FD04FFA8FFA8FF %A8FFA8FD07FFA8FFA8FFA8FD09FFA8FFA8FFA8FD07FFA8FFA8FFA8A8A8FF %FF7DA8A8A87DA8FD06FFFD04A87DFD08FFA8A8A87DA87DFD07FFA8A87DA8 %A8A87DFD33FF7DA8A8A87DFD07FFFD04A87DA8FD07FFA8A8A87DA8A8FD07 %FFA8A87DFD04A8FD04FFA8FFA8FD09FFA8FFA8A8A8FD07FFA8FFA8FFA8FD %07FFA8FFA8FFA8FFA8FD04FF7DA8A8A87DA87DFD05FFFD05A8FD08FFA8A8 %A87DA87DA8A8FD05FFA8A87DA8A8FD06FFA8FFA8FFA8FFA8FD05FFA8FFA8 %FD09FFA8FFA8FFA8FFA8A8FD08FFA8FD06FF7DA8A8A87D7DA8FD05FFFD06 %A87DA8FD05FFFD05A87DFD07FFA8A87DA8FD05FFA8FFA8FFA8FFA8FD07FF %A8FFA8FFA8FFA8FD07FFA8FFA8FD09FFA8FFA8FD06FF7DFD04A8FD07FFFD %05A8FD08FFFD06A8FD07FFA8A87DA8A8FD06FFA8FFA8FD09FFA8FFA8FD09 %FFA8FFA8FFA8FD09FFA8FFA8FD06FFFD04A87DA87DFD05FFFD04A87DA8A8 %A8FD06FFFD05A8FD07FFA8A87DA87DFD05FFA8A8FFA8FFA8FFA8FD05FFA8 %FFA8FFA8FFA8FD05FFA8FFA8FFA8FD07FFA8FFA8FFA8FD06FFA8FD0BFFA8 %FFFFFFA8FD09FFA8FFA8FD09FFA8FFA8FD07FFA87DA87DA8A8FD07FFA8A8 %7DA8A8FD07FFA8A87DA8A8A87DA8FD04FFFD04A87DA8FD05FFA8FD0FFFA8 %FD09FFA8FFFFFFA8FD07FFA8FFFFFFA8FD04FFFD04A87DFD09FFA8A87D7D %7DFD07FFA8A87DA8A8A852A8FD04FFA8A87DA87DA87DFD04FFA8FD29FFA8 %FD04FFA8A87DA87DA8FD07FFA87DA87DA87DA8FD06FF7DA87DA8A8A8FD06 %FFFD04A87DA8A8FD24FFA8FD07FFA8FD06FFA87D7DA87DA87DFD06FFA87D %A87DA8FD08FFA8A87DA87DA87DA87DFFFFFFA8A87D7D7DA87DFD34FFA87D %A87DA87D7DA8FD04FFA87DA87DA8FD08FFA8A87DA87DA87DA8FD04FFA8A8 %A87D7DFD0CFFA8FD17FFA8FFA8FD0EFFA8A87DA87DA87DA8FD05FFA87DA8 %7D7DA8FD07FF7DA87DA87DA8A8FD05FFA8A87DA87DA8A8FD14FFA8FD0DFF %A8FD10FFA8A87DA87DFD04A8FD04FFA87DA87DA87DFD07FFA8A87DA8A8FD %09FF7DA87D7D7DFD14FFA8FD17FFA8FD06FFA8A87DA87D7D7DA8FD05FFA8 %A8A87DA8A8FD07FFA8A87DA8A8FD07FFA8A87DA87DA87D7DA8FFFFA8FFFF %FFA8FD07FFA8FFFFFFA8FD0BFFA8FD0BFFA8FFA8FFA8FFFFFFA8A8FFA8FF %A8FD07FFA8FFA8FFA8FD07FFA8FFA8FFA8FFA8FD05FFA8A8A8FFA8FFA8FD %04FFFD04A87DA8A8FD05FFA8A87DA8A8A8FD08FFA8A87DA87DA8FD06FFA8 %A87DA87DA8A8FFFFA8A8A8FFA8FFA8FD07FFA8FFA8FD09FFA8FFA8FFA8FD %07FFA8FFA8FFA8FFA8FD04FFFD07A8FD07FFA8A87DA8FD08FFA8A87DA8A8 %FD07FFA8A87DA8A8A87DFD04FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8FD07 %FFA8FFA8FFA8FD09FFA8FD08FFFD04A87DA87DFD05FFFD04A87DA8FD07FF %A8A8A87DA8A8FD07FFA8A87DA8A8FD06FFA8FFA8FD09FFA8FFA8FFA8FFA8 %FD05FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8FFA8FD04FF7DFD04A8FD07FF %A8FFA8A87DA87DFD07FFA8A87DA87DFD07FFA8A87DA8A8FD06FFA8FFFFFF %A8FD07FFA8FFA8FFA8FD07FFA8FFA8FFA8FFA8FD07FFA8FFA8FFA8FD04FF %7DA8A8A87DA8A8FD07FF7DA87DA8FD07FFA8A8A87DA87DA8A8FD05FF7DA8 %7DA87DA8FFFFFFA8FD30FF7DA8A8A87DA87DFD05FFFD04A87DA87DFD20FF %A8FFA8FFA8FD07FFA8FFA8A8A8FD1BFF7DA8A8A8FFA8FD2AFF7DA87DA87D %A87DA8FD37FFA8FFA8FFA8FD09FFA8FD09FFA8FFA8FFA8FD05FFA87DA87D %FD08FFA87DA87DA87DA8A8FD05FFA8A87DA8A8FD07FFFD04A87D7DA8FD12 %FFA8FFFFFFA8FD09FFA8FD09FFA8FD08FFA8A87DA87DFD09FFA8A87DA87D %A8FD06FFA8A87D7D7DFD07FFA87D7DA8A8FD30FFA8FD04FFFD04A87DA8FD %07FFA8A8A87D7D7DA8FD06FFA8A87D7D7DFD07FFA87D7DA87DA8FD34FFA8 %A87DA87DA8A8FD06FFA87DA8FD047DA8FD05FFA8A87D7D7DA87DA8FD04FF %A8FD047DFD16FFA8FD0FFFA8FD0EFFA87D7DA87DA8FD07FFA87DA87D7D7D %A8FD06FF7DA87DA87DA8A8FD05FFFD04A87DA8FD15FFA8FFA8FD0BFFA8FD %10FFFD04A87DA8FD07FFA87DA8FD047DA8FD05FFA8A87DA8A8FD07FFA8A8 %7DA87DA8FD15FFA8FD15FFA8FD09FFA8A8A87DA8A8FD07FFA8A87DA87DA8 %A8FD05FFA8A87DA87DA8A8FD05FFA8A87DA87DA8A8FD04FFA8FFFFFFA8FD %0BFFA8FD0BFFA8FFA8FD07FFA8FFA8FFA8FD05FFA8A8FFA8FFA8FD06FFA8 %A8FFA8A8A8FFA8FD05FF7DFFA8A8A8FD12FFFD04A87DA8A8FD05FFFD04A8 %7DA87DA8FD05FFA8A8A87DA8FD41FFA8FFA8A8FF7DFD2AFF7DA87DA87D7D %7DA8A8FD28FFA8FD0BFFA8A8A8FFA8FFA8FFA8FD05FFA8FFA8FFA8FD07FF %A8FFA8FFA8FD05FFA8A8A87DFD04A8FD05FFA8A87DA8A8A87DA8A8FFFFFF %A8A87DA87DA87DFD05FFFD04A87DA87DA8FFFFFFA8FD0BFFA8FFFFFFA8FD %15FFA8FFA8FD06FFFD04A87DA87DFD06FFA87DA87DA87DA87DA8FD04FFA8 %A87DA87DA8A8FD05FFA8A87D7D7DA87DFD18FFA8FD1BFFFD05A87DA8FD05 %FFA87DA87DA87DA87D7DA8FFFFFFA8A87DA87DA8A8FD05FFA8A8A87D7DA8 %7DFD12FFA8FD1BFFA8FD04FFFD04A87DA8A8FD06FFA87DA87DA87DA87DA8 %FD04FFA8A87DA87DA8A8FD05FFA8A87D7D7DA8A8FD34FFA8A8A87DA87D7D %7DFD05FFA8A87DA87DA8A8FD05FFA8A87DA87DA87DA8FD05FFA87DA87DA8 %7DA8FD07FFA8FFA8FD07FFA8FFA8FFA8FD09FFA8FFFFFFA8FD07FFA8FFFF %FFA8FFFF7DFD04A8FF7DFD29FFA87DA87DA8A8A87DFD2AFFA8FFFFFFA8FD %07FFA8FFA8A8A8FFA8FD05FFA8FFA8FFA8FFA8FD05FFA8FFA8FFA8FFA8FD %04FFFD04A87DA8A8FD07FF7DA87DA87DA8A8FD04FFFD05A87DA8FD06FFA8 %A87DA87DA8FD05FFA8FFA8FD09FFA8FFA8FFA8FFA8FD07FFA8FFA8FFA8FD %07FFA8FFA8FFA8FD04FFFD05A8FD07FFFD08A8FD06FFA8A87DFD04A8FD05 %FFA8A87DA8A8A8FD05FFA8FFA8FD0BFFA8FFA8FD09FFA8FFA8FD09FFA8FF %A8FFA8FD04FF7DA8A8A87DFD07FFFD04A87DA87DFD06FFA8A8A87DA8FD08 %FFA8A87DFD04A8FD1CFFA8FD0BFFA8FD0AFF7DFD04A8FD07FFFD04A87DA8 %A8FD1EFFA8FFA8FD09FFA8FFA8FFA8FD1DFFFD04A8FD2CFF7DA87DA87DFD %30FFA8FD09FFA8FFA8FD09FFA8FFA8FFA8FD07FFA8FFA8FFA8FFA8FFFFFD %04A87DA8A8FD07FFA8A87DA8A8FD07FF7DA87DA87DA8FD06FFA8A8A87D7D %A87DA8FFFFFFA8FD05FFA8FD09FFA8FFA8FD09FFA8FD0BFFA8FFFFFFA8FF %FFA8A87DA8A8A87DA8FD05FFA87DA8FD047DA8FD05FF7DA87DA87DA87DA8 %FD04FFA8A8A87D7DA87D7D52A8FD11FFA8FD0BFFA8FD0BFFA8FD07FFA8A8 %A87DA87DFD06FFA87DA87D7D7DFD07FF7DA87D7D7DA8A8FD05FFA8A8A87D %7DA87DFD33FFA87D7DA87DA87D7D7DFD04FFA87DA8FD047DA8FD05FF7DA8 %7D7D7DA87DA8FD0DFFFF %%EndData endstream endobj 184 0 obj <>stream -HWvJ}Q"hFMC4h&P3ݻwZjl쮮kZ2xo4ۨ5NN>$IDz|8E Umd%廜iN /5.N|DA>@ NӄXN,>*1: 2IM=<-{R YV+Qā}-?DFݐ044 -Zi^RmT_Smxn&uVq$jwJw|$HxH6_+k<5KML¸FbF^[qGcnRE6hyE[4۰nTֶj[ лh.BTﵲ^dsőzmA4̳(W0ךe4XV 8/"Zn5?pz+(l5̫I=-H% /O"f:\Z6HW.qԹwIju]!go丰_Kfaax3Z^Jobw@}gTő93NomT.#SOݓ)ND3 -b#?T90Y\Zɝ9@1t(ѺJNg\'8E$Y;\&I =AKFPIls)'8iޏ=WihyQP4-VZvlܕc̤'g -<]iz9ꅖb'{w4jA~1˓,בl UU"Xh v;YЈT7CWHy_Cޙ7OP)cLVaaNԋ|Ő'HQ|Wݒ-"E$7cݕWH@Y4b`9;&c9;]<O_%3ّG3Y`=GMbb&NG/ hW<&@=ESFs`o{â֢OS\C Zq%ڲ,m[+BgO6S*2z\jKM N!kwK#՟0^3]Q=M| ڵaRoRh&d(X3'#gc%3j\sƉ^HT)k`V.YᴓWdZS|[G;N%C_@Ii !'y7&+b_Z@C&çRL$80f H GAwnpGqaW[(LF.}߃2oSe쓽_V_0dU|y(` £qp,ر*4,vozI/<^.fp:ΥF]Ns `C,%@C*`|XLF{b>ZK :c>C(Ƈ1'¿²>؏ho!>{f#؏ؾJ խň{l]N޼3s ~c&Z+6Eq`s#e4hЛ *JzdDu\A}א3>?csQYΟhO=usQ8#k@zNr4ѣDTC@p˲-]OuҩZWJs{)?W -ዞR..r:fp&2 8'z(?!b@)o+={ F֑ A? -D=R<:B5$Ak1,[^^Ǐ5DK k&v 'vT:$R>xo -$N"UV.׬Q/=hc0b=2j2YR523U2>z\%wk%=UGp/-PR QNt[5r~ ; Yu//]иM4@۲cy%U\|M9lJI[~bWRKݨʓ]*HqhgA4}J9C Wʴq+ǒN3> qIooe&҈ ǸfN,΁:TU-u+Q^#s1NP,wkV8b!~痾ث()ZPNNH S?ou-JC`*tN諆Hߍ~hbv4 -;IGFJw)v,PFa\Fn'.7ړrOz\a+5F]g^;!j%hG4!jR R@-Rꤽ9.W]&3e2LJe2w`Dg.t2yLfh˸Gf\&3\&3,NXɌrԏ&kei2fj3~464{M5 }C4:IӴ߶3ꍡqE@%; + -C14(PNCKf02C5040иBfꍡ Ǹpfӄo}{좈#|)1s񅍩Ķos0n) Vl}cuׄnn[.\i/mz%$])}?PGdy<ӕ Y>`hm}[IJBŌ 9nIM1cx1 -d48OnS!Z -8U 2v9$mp1C6\XWy%c\*q+w ̀YkF 0ޘ --T+Cl -wO|س:f୙\l>Cɂ/j=8K#i: Jpn"0A5eH)J`ή;gC0__zO}|Vs[oL(GOzԟk4<L`L6X#~9WpM GYtk;1tVb+q16`J?ѯZK0#Vxڔz GDp R ]% (E+nXX-[!m~A lzay _SCO|f2灠e}>2:GWGx(kLR_?yuV~쎱Fĉ*C=E *<'ł8c`5GzÚ5ƙEϗG .{+쪙Nj+9M>0ܶdձEY$ K&b`'J6#K#%yuq)) t+h~8D7YtV3p$Ƹ[rW>fSˢE)osh㆟t)`鷑*Po3w5si*sCѼsƾtg/bl.o -KȔ=)|*T ]R7~#NqF04pV?$&L7učtM}_/ϋLů ]٪/q̀@R#313L{lG_Cf՛vPEGtps18m.V+~$isRE 7XSf'-&faOٶK*B@<58KEIi9eev_}dѲЏve,eqze OY||o&ŤXe&vx1MC3<YcY=xlS{Kl-J}{!yɥJ̡;|7p7j*]ػg큈lYe!MR,Yea -.PfGMZ~\]vzu pz `y<^sBaxKR+b',iuIs.2:NZ0c`H.ɍ,^3g8! BQ4Rй\J'D -zZ}Q..c0P8@1Y}8~̆l"܎v_/:Ȅ(3?^Mj.ٹ%|%5aqI(-ݚMSRv BŸ{w)%Wpm!^!pA)24I@_|9Ox xm0%lm0|3GlĤꡅVPz(N71< ef:N;`|Q _q2$<}zDNK']?)e?B')9$VTϝ$sA=ަ'C Գon$onon,|stb\>7Oʿ6:2-.Hǥhrp>p^QkzVRZP: )>cDp'NbBt/ffѡeoO+CwFR -?0tH9h4yT8(zoy]5ӉTW=aCJ =EY%;qWܰIL X#Eeuq)͙y >yԉ.w'uȝbGoԇ6`>Of5-{<⌠qjCክ ~HPMdmJsD0hA7n4/˳"OkVM%O2Bo'6R-hGӕq D]]]IUHj Dzqryo/B ߇DݨOHoC8K6*`~) )9}N߭`/.?S"Vo>c ɕF 苁",2f~Z>v=a)[+f[ 9vs0g1[l>2}1=}dFF;doqQXm,.gڜTk0 t +؎$eؤL*X[Tqǥhc!x@V%\-[lℕB^hG!-^ hGOQ]8HW姬t>Ƿ?Vc FlKnڟAǸ Zz٦ ?D)}`+=zuAřPHlvD'/)C br؛n|5JBI4Xq8 -u57`P˥ܭh+\sD=()6SA_[]d#ug[N?4 @*[t"x"|gv7 r:/|å$o⇖8@-2W8eN~xG2}_E"+w:Rm[&e]JiBMòJ{(Z@p;Te~0 M)BEKS*"ڤlԒ.޸P6B%v+h-2D bD"sq>'XcD_rEY~(Ľâ4sf@Ѝ EyB96q SN(O$,b\w_:{tWV 7|CY -s1*#K%.püp -@ 1w^跨z_6 -׶zd>h!%:gqɗԳ:siA;:%UME05(YOcrwac0QlQl43|0 |~TtF(ƽA.V"vL'TD;ȿ&AfV:ϕ4z kg/_1!҇T3L>ŸaB/QϰaVy(H_7жT< xjڸFEmBQIj̧e~4cK=AzI7et&L\c P)4QEJP=$= -XН~A"_yWsQ]v}Aw؋^(lfzJZ9}޸*آѩF9$A  ds6LE7? zqTԌ9q' sü:JP_m167 :٦5 T2j6 qӸ(ix$/3&X#f4W!bFo0s,f{bFyOyed@۬(]*!䁶hY4hP&/pJ[t&ॲŮRB%4!iX+%T@,BRr&jWߥ g{TA@Y&vA =L" ~"}Hҭ*ySK6'w6V&omʏܐ%uɤ)ZR6'?0ԡMyNj"* "l2%Jv'TȟfC4fϣo8l`oI[}"f-"R*jU?6bZl;9fLwK -9ub=Û@M(\[)mlhK`4 ށ?-qm'dЪG4";RD48 9Xr;#|UvX?fҐT!XS2}(r{OcGȓ+T ~\{iz 5jE\4|2 4.1+`+'˧@؛>^On? $kn)F|!ɀAgXgR><- ebބ#;zdL?0Fns(GnЛqx$_RƔd,f1L a[兎>xY=/X9b 'uR9$b$(+Bsd -0^(<`8<^@ 4ΌXㅋㅋ"xo>82^(r ?1^x/&ÀB?o^ɼ#}Է?h:2(?1ّ|1(??_xYzÜEWb]Dhw3eIYui7w -oZj@I09|#z X ÷cw*lr38%d#X R6]I\kOIbS@70d а+G̳Kd+$b -l~g*P/l[ $N D[nP~̉7u)qgN KRZX%CMʬ)us]pw3 JdWkNy!M~At1 .A|WT3:ohB]p`5ޡ.3ֶۂ./I/Cq9";𖶾l˥/(X*?%T 2H#? o#&KMy\d6ڥqp`*8Q8p5aǾ՞Q`;J1*3Fz ij+\x^; _2|[̲+9OE#8t$-6sbz5}ɸ%66; L$M[t-®.S9g!BWHB񡡘w^?E\gz=~G}$cLWFi̒?礪}(B~ڵRy1dp,F䚕寬K_]ʺEeָ=Kv.]7SY=RώKeu>"_~ 8\]@EgA*A ڈWV-}:u>դ)a5d^ʹ۳^}$V[{38y%Fi=Ѽx Iqr&vF\K"r&`qVn;sF+e9kI+Iӧ) -nţU%kț=?-~ -i }In<s^P8ΓvwE.r kCk8BjA1P`WV5jLCFP}u9hC\ныϾ\{m {LCcD!u7k죡54$$VׄYko-pUa: - &E9ЖUIizEVY;΋Tدk#·Ou![5,2})V[/Nsң㔻,/UǷaK4-@X# ytI?ڒt@u[{?˰b*Y=P^[79oa*hdP,ɎHe qBY.""c 0E{=V>qvbyg'/ED. A-[&cyetIk_Όg׌kq]Gjl~M3;5l6 ' -D/쿸n2t'7a-ܽ (Ƶ}9o ݹX?%=~^BAvo]~4aC"rj(`XJb&5R!wږF"-(z(T\F A[tL[KaU_ja8$D]֒ B\2s$ -qǎ&ZYLl^dbss]ΉbvyC;' ew9An,1hiފZs¯y]ty̤,JSQ75mJbt8q/be -d]S*VCqU®.S98v2+tU -3N)?s+uWEPCiҋ GEA{fP,<g>0-{v 6D:6Pj[ԙYnAKGB;j"6gW? UjE/J+h}͆uϬ0م양ޓsɍ- ]\ޞT4];eW^'XuD-ѧvzU;FtAELCh E}5?5\9}hƍ ̌`S(x8.Ekm>4ґ  -BV:Jbǡ$g[_E޽:6aq5%Nfզ gy򑭓 Nh8JdK8砰pf"TptwOQPc(jL*kQd"4c4D!&ϒ;Uw;;0م~Z#-peF5.}`o`m-ZGQӜ,İ(%$iRyrK դqP8mΜ4ʲxΤGis!ISMD})JSqC0^1iN)?K0NeBnc&tP[w־B;R"qU쮼yFRG?r*岙ژ Ƀ+LJ=#rn 3-װ/@J}pilh+HK`sF%\QJ  b1`AgWmRR:2̃ -S; "wXԋl8@q0=!&fRwmf!\̊jq@Ua+5yĊW8p@S٦ЀT_߉85QNqsWyOĹ+q$o?w@^޹,Qt讲P2zi$d%lmEѕYQ CYp~4v Tn;}׮_ -MDsZtr^e\ -Dql2Pݬ5ա(Q!&9 U/LFP>`{a%)p}͗NO087S6rа1B#@#NAO5Ta>;};ˏ..G͏..s@1U{ul´\Vάڴ؂:i}rҡvIAE_ܹ'g/lh%4kJeyv'0>(sBt3Ќ<s #>stream -HWvJ}&Af&D1hV78$}kΏn쮪jw!c{@I{,\ٙSآzk{o'u !j>FRas CT,FÒO\R_}yxN%QhͪL8lx$յ$1i̮Hml*Υ1sYTM"$B*jg݌DI* |Y[ʱ.ÿsi23UãR{ghr[2 3GhHģ)!!wX1QV's1}J~804WlfeMŸҲ(3nTXynSF^,Տ&'zr=vGqsAK !lUh3’.u2= y7ƙfۆ,ڥƕ_Ga*>#$qņ/IL㧆~13@!ۼ -;j _QZJ؝CRX+Fl}[;ѫ0 Ike3$!GP^[GIP@XrSkwʻ q+lz17wBo\p1̆,ݡ[7haڦ…Q5;QG&#->h{n@ĔE,) n*7Zz^1S%LർY5wŝ"9`Pњ83%(AGoJ&M^', -pVųMkwe -ڒ6/jSq&58;1Q$d qR0'[w%̶vO>"kG -иSh Tfe('0) BPe0Z*uǴ {!LczE)hӅQUm\lC5ғGyѷ7^5ɛx *dꤿh?5+1Wsҳ@E@'V|5^86~ϥs,sqɋјŠKiVk]DЀ r㠘 -Ny%yV6@о=z}Ja:=- +t)BRwȽ!`T3V+3TV\䦕X-ՑNRw#Є(IqJD*9Kpjx +/. .`_\@\6?^1{6QJ[>u'lwm=f0!x(P8DcX9.={!*ii2H80*!fڰU[eT*SřWChhgd0S}1~~g2x9"U꺗%\B&ɇjׇ ږo o2߾Ҭ-}S+RXGSNZY]ʇTCz~gęyC2KL -ޅ tւ(b5 9ܩ9S[qC[|V0: 8f_WAfWª/_ IQ)mKCD\7\1V.&yho_df*Ɍ - - [[*<)~ѯ] &zD)^ `b%ȉ&uQT̒i,hMW~A. ]x#̹#Hd1+]n_/2# zݹ[S =B/ZȷI>+`Dq`HҨ ם;D4g뵙l3v*#7\_qMFToWzJͨy9zrK,yϱr"w0ϱžJМ^ITTUBڱ'_[+A~!9a@@fPPpQUW]k?,%!7''ue\gtGcL#FڿsykÌcVq N]PGFKJ]!|5ؘ%_M%m.j*3ۗXo_~`_2/~5-ZC^jZ15bo31g|@P SvdOj]9/ӧ2!86q;A"v .Vۙ8ri g /)zڵb8x+/ˤhsb0daFymjFxsQi6azǎ$k\3EV\kHaPG|r{Sr5gc)#?\_ !O T߄#BI9+)FԞ HE(% {t@l yw ~eLG 0-Py pk@$@:9JT OǙKxڇV]Nװ-\@UM/7*$>x4S_]hA864ˏ2 RW0@gr[QJU]{fFmG&^v>}Lꅙ#,&ENrEK:͹We&6}ś Kr2{9|wR}/ژNTI - .w^~h_0nUS5y .K'\ϕ|9M}'3trx9KN̆a~~"M$ - .|:TǿSo,?Dn9.毼7ʭ*z.IĆI]>; ~"B[FWNڄcLd(p+2\힦Rz;,S crt=a0GEmd‚/@y}J\[*T9fI#ew Yl(0|tБ!i{ @I1^2ASv-vR1HxrPN֡ᙠnB)j{cxCxWL2ԕq̋0h-1tkجn -DRP̪A 6dqvnf#@!tΘSiFNq*ufG6dfzlz Ogf~GQ Q3_P"}}p~cT]LTzČUtfĠBQufg*R3REcfz)Igfzo03=b<8"tL/t LOӘ1M*CcCU&x24Y No_~`_`ݿ}˾XVJ8$FZWC\8uN^obR$1W0iϝ-CesI6r"!=LJ(g;I\e?kyg*- +ץ*|GZ]{Y8a-%/ 8hBJYW2qqN$`)yK _i)Ox㢣mE'8>^Ӡy6Vݱ7:E~1ڌj-nGa\}Yى { $ RLVGzU8D@ }'!l/ ("Wـsrcpb'vW׭{❢0>!x|}5?9%CBܣQ>5$@ryѝ(\Ubn3@oC<TE89nf]oqp"9"pT -6|(#,%(V/yhW6_K:}E>˟C޾ -~s x~ %e ُ?W/_~{􏆇/2wwhl~4{l Xq9-.~WL^X7(*=d h]|2`F3'7peg/g1Z_6-兑gzk_!wƪssν0 dZGcȼ~qXue +Xi}ڀnA-(wlbj+y}L6aFnx4{(rQx$L#R!A&h_)+MfR2\U_e߿mƊ+IkNP32!ދ^Ay-JDhQ5;R&`sR1.d%C^ݣi9BTSK.zHWjx Ԣ [ R - Шk)P AY±SBX>+)t>:Κ:3hHˡB2أ@Zo(Qs*azИ4*fx9}y 4ml&Ĵ4qaIcMq66Xhc3i@-ioN9"&Ϝ9sH-Q6o֪=AZ>1sO`z5=}bf 1>1sOg>N1<ߊ|xE+ύ-4ζ2vim!v -M^8d nDτg]I7q_<]dAzZ'sR!JDPk4WLuɸt p䀯e(v:ATE ގFm0߾;l-S1;RezVhVPk7{֞5P|ksfkw/א;cU9VS}/8؛AOb\%:n W2}V3 LnB:UΠ; K)]4hl3ˁ1>6AZ>gSsfsf[Όȿ3f1''f˙bO,v.?EzEO =XM wG{f S!C](V/F٠琔= Yx{?`[ -|l8*Rf0r[Ρ`ŐFgEOE8`_h|ڑ&u=YMsҍ:ͭ,?< M)jա(ޘ^@ȞB2" BOmʛ;n4}%3#j0Qp\|ğt5[dD`t!?uzIA̢۹ *}.&.3AZCX H^ak/F&Q4Ym0pLRZtBNqX]F,r6'M!%:yGxovdH^X+pJ!W' S89JPTWVbYp -^(g#ˣZ_Nncuoi%y0!~)`-*rd-9>ߠOØ5N/\bNr<.4#JZuøU:D  0FI@";!=7k}?$Mwuڻv57pT- .Nﰐ@= -vܨ5m@-Ř4g@7z|+lZ1\ oGi(f 7d@([(H_f t@%Pc]LYr;`/Br-}@ff%Pɟ-B>qG~C]ЫOȸc wR@Zh |- -{"}[6Iׄ5}U۪k`[SR.?:=/Ҡ+UpUy~9#Šph m&G/D(J+nŔXTY^s;}6&GS.uCKx 4S}tl&q~ue4Ll_0ΨQ1L*Ow j6ɣGlG1ؼ7&w~1c #$lbk>myf!)fV7p3dH^}Ot{!(AT@uo(|6HpǗ(. f%G4y6K x&3AZ,lLg.mg@" H<ݤ p }xГ?8oD1EdQGKu醿hVa$fm%NDiitl|!hgӍK7C:רeQ'4cf ^" -?# vg+I:h0i,& 9E1ib0m& Ő% dפ V/HgF1pPs89@1pN(Ήd8'fN̎vБ91Cw˧cb -9/i\j5k иTh*oQl0uwDPNIu -Ab'|f{UҗIǁ 3&,yWb8/#OF!ZO,*.Ƒg7qFrsjKtWܻ\l -zrׅ gG}y+lz!*2g [JfQqy(}p@(X_d: e" -ʤ=q%T\E/ 8J޻뜪?5x<9H3 6f5kl01ac tU2{;0:"ڧUנU wlӯXǾɱe ҷ^씾Y;cG~I%c"Ev~S`hcadT2+hB>hJO?괠϶+O*\$DuCvb+ÆEMoz1- >whh+^mja(&..aL{T^m^@J0.%sɱS /c|_%N%7sɱSa%~J%"rhýT뱉lB{+MZ: K?)[/P#$\ -";ʉQyᝑy"rus2v_DD&{$RsL98rEwre1 m̦Mf.4fn!W=̔RLu[vj ݂%DZ:c6mcѯ&,}cdaY=DwoQi8׳k/!r42%h vy2/Jw;a?A\v$AHqx -ˎDGY+gtSJHUNTF*>P^Cb,'?C`VU,1 gDI ڸL4m\&q4Pcg4(PoH ڸL'.WDKXvZ}.6_f x`z<{oz1_L^3pS<{ bycp"[f<{v< (#p<~pvp79:?&>$.?V[eG~̬կCX{X{ϚeY_~pğ\qv,E(MV8V.&xM*,D  30;tkZ]ϙ*1 ov.*@N(Y*e7F0.Lrh6zv]7/g1¸(p : wJHD[s}^o^*q U2 , -HUޜ@ -.Xgɸa6!S-ݗQtBG@Ie|@ Ю@aND: h(bȌ.|Ԙ!z!=;OYĆ,ϲ1€VCHL@ ?;:|%{9 6Z7w0!c@(kG -rO>EAV3dzl6!/ΟKrzX-EjW!#*2_́˼wXr.7 T"}jAa<oﶌ&LãAO;9jVHY^m1\>Y%:+z1a}Q.ڣh/>HZW ҙd5a,ӣS$c4nsw۴XӲhY ui3!ܝG"zӭ"bzI'`|L\{4VtF*CuE^ҹ}T/('~6#t)p;nM7꘾>D-:,$"?=uD qVI<>WV=oRپ56[Dv{Rn"tA3%oزqŀ~B7&,3 ht҈sd{ -uꨩ֕tH/i^rV7T꺈/3~\#4,+2=qZ0^MQId~ZUd_#UY/4 zh`mjз]ʟr42 -%X B.OpXX~n''fmd^RH臃hdUo$(C -t_NCR_hM@c0hT&Z܄"^ඃד0s0Ht"JLnAQ ɴ]Hk?fw;QYbWlXviU΂ 3(аi~(4Uj옦WDIcz% -4Ei"ڸLT@HXvZznjKyVdwʘs]rXŌ(+ g53SmfX_̣S]Xf!l05-iWM8˱qv4X_OH\!.˳˟"ѕ-e`u9uUjpzncB *Wjk .gREYSHA41C.Ļ{K&rm(7#.r*dOJC'),bF "-Mnn2~䣍QͽAj r Vv={C8*eR q֮VުF֌;e[eboDx; wA@Bʍ-^."gƴ?,!5bnmo Ҍ{Fuj%OI3T+J,t*HL8 4EF寫˿yKgK Z2P\MIS0?\ko  aOp{cޮR:86&uMbOdݷ‚! \Hw^\F0 -*]jq8QXoS/u7e#R|+DR)Ck cK("Wn'g!ѲUWKF]k%tyʤt-t5f6pGX ұ3b QJv ̻ze:j8PV5دrS nLtE*BOm>n[$cvQxT̾d3X?|0 *5/V4%Fm=f? kM@du>1 K:(#N WDL2v,uN([qy -f'3cGu;"KWIv IHyav|v/a=f{LǜÄK=0Chf̞(%[3{fXMIf| Q݈C_xh c>{:4{rٳvhN=6 w;'`P endstream endobj 186 0 obj <>stream -HWrL}nQAQ%n15n7%oTQ5?{* --?/GcuWj_Sq%mME%_3IdՂVBd6SVϾn UZz2"Na5}[ -HgHV㬙`R VZ+`%~ao>J ivԕ\Nٛ_=sSQ9,KTY#7vP,ʖd% Zm*[uS@/QI:5o8E{aKho^Y䪙I](u5BLyGcCG)zBV8VoQ`+4|rLߌ=VOajL^& w`\*ŶWernDzѢIؚȼ2ٛ8oLqR)_#}$5g uȞR/8ґMl+ȚAa >- B6pqRb=7IEoxfTm#Ѽsp' 'K>=WXwCG)r"ԆVui#~qvDaE}sp^Oo/ {{pǶwOar%Ôβck~-;s"'{,+SQuD -*UH:#+fwŠ% --Q㟭<8]}Z8+gcVBѧ9ć -jZh+pɈ $Bs[Mn'ks^"F}fkQHaB:ܝQn;r-;D^qVW -<@ -jgq< CBr(-tKl)o _.;M FK$Mw*[ - -Oo1b9KBj5jP5Wހ"&kt@h$lf_E:`za -}rv@5 -TagM/:7u˱+W>:;e*A 9aB췠?11_l~)sEhbH!;'W(ig\K;Q$NX7/x`"ݏԈ4"ȉ4 #͹ rő" PW˥j=#x!ID. nPci- >a)_%vK)(j,orNaTNzRfi!_9;7Y|(Z(ʂ#ˁV߮$Wߏ$' $.n$9i w#I _f$9i A{$I9 \Iv+s'yۨ7VH\H.˥Z:{մи'eu - dދ 2!Ӛh/CO>*M f3a*yw%'֨*1_THN~1Sdݶ-k_! -vE:;~b;w*σ8(5=ۊ^:$OO₧9BNIld] NwKvQ? \:{V#ݚi|n8cge^Nr >z㚈А\[0JN_ʘA;u:0X'܅a36@[+8ܩhJϐ+2%o_gl;Wi E齶]J3`uKILPmJB`b[+ݲS9#E"&ؚN>p)9q R{AįȨR/8"ػ"r{иwhn(s09jfu -c -՞hdgQ5w5F Ù`olpK/Xd"]0t*fS0L :|$3ЙdBf\I\w= +f _T Θn2){҄3w&݌݄ 510+܇ZɜDf`w;2{Av;2jfkfG5wd4wd0?{:2~pp*Ww'ed E&ed|~9yd@4wM][4wMG5wM+XW3{Gf>>="30[Ƚf>Ы_s.'_Q^?ʹ< -* P$-G t -Ӝ}_,9,]2_,cXQyJ.AElRp2"l-Z{qчU8LJJ> ^@=5̉X̻wv(Ge x|͖ͅ3 ۵NŔ 28G^l1ܘD_p%d2 )Pt):#$<_'*~vd>m-. %?v(Pja&T:Ӟ/ ڎHֻ=lQ=򷋷 y$HM_.D -{ 5Ft植+OiSUivI\e>ynv2| 8Q;ļ6lZM[EG ,Ѳ$$ol 852s2/s:'4!$ҕ\.'3 M:%^o̞7?-.Di y)S'K08еvDw(9pwSs/A][ϝf㡄@f8)+C:lj"A까?E xxeXJ }J-](v4_e Ϩ N",bvfJ(s$@ =;< > |ꪐ_EUo\j!Ȭ\p[e8ȄQv*4JegB,>YuمgQZėժ5dr7l 0v˙?Jx'7]uJ{nBJWX+hGʨG7՗ܴ>&Y@&oJK@H`#l V גo[݄gbNe9{]@6>Ԙ]Rpcp5M-AM/brȷ"[͇)DJoa3`EmqoC6s{-xL1-=ܰS1`pCUqD?\ / -0-)RK8bS4DVX(<ܗK|\YubJ֤)c* *_HoCB{?N%\Z3eʑL#E FD$֋;S~i<P/eHB d2@è(>$!m߾O ->kVa/; jV1`hG='C2@JU,rڡP6ǰ?+PsmcEwN "= ir G-zV (925uT$I veB¶5_>1Te&fu׆}LąąG+c-F*`r_8tUFH"i7 K.q{)t@хbBEKL=>8qSyx=t]//51Llgw fy36 g{[|(:5Q͂lwh2{VBelA}Aࠪ?M'`GIX=t@"6wBBEyZC~QgZ}8W;(=q r"gNROi2"8 UOY@JјZ8g073r!^in擨Lu0Ɔmә&л5]'˃yŗ=W8jhOd &$iښ $pRc3 -?Lf'QLgNa2CQ q+qy%!o k0GQ;sޣ/,Zlk|IYc{$T+%(:ugD#JoLkyODƛ/qo,k G e>LIɣׂjA՜'x0I;\І -3Sv[E]u:*B-I&f{>7. Vv -%m5UC1^Ÿy5F'o5<K"~m->|wNwV%R1keZ3HO^+M3~=LZbN5X ք:tqC0n (yۇG`˿*yu%.~=ji~)#Xor9Hpj.lrsd¡0@w{]wO3-dA[N2+`&SQj&4)T:O'~'SL;Vex:J<` -#V+޷p/"o #BCu^;gFc5*v "k㽓(~T_{'H2J{Mu -gy}] QBc9hz+^*Ke]8e٠ lB#ֶF^DQ4]ַNьQ\%%Y[2䠕54?)k&Y,E(gh0}ތ//^QWoXb60o֦M`?*8` ̀SRD~`E>'}sAPlE^7́E// 56"?WN  Rݸ~8a!ױ3|uR1=@OR,\Δ͍Obd-))~`~ZN(Uabr0#8]U'Q#*v+f!ve1Qv/.'{Ѿa=оvKLc<^<+兀OTn'Qs=E03E~=ߡG3h>>?b]xP9UТ1QV,ӱi%T_iՠkl4xdJI%_wۭbQA$ץn]ݜ-K6>yı*i-LDjqgoK`>_vLd4JqQmO6fZ0r|=Wu%ClEHEm9 -Eɸ.q -NJDyn dz߉'|RjY jEM A*IK_q%UQ(wJp.xP]!(T]zBmsvۧ< Ə2p :"* -whHVSGh4D/s9^qRyٜ8GJbS:^;cβ*C]$>?6ЬN7aĮa٘P@o1IP;DD*sQP7E뜫v72P> Dz] +xP5@@0]bkyM3! -nޥ0FvA+A:/D-/e-KGWu< ),ڵ@>y0qTiW2`G ^:DKiJ9!2ҧF*XM1?٣2OZAx#'^vA=v9ދ=΍EH]s#{䒎u#xESM>g+2_ -3tu<G2^.k]~_Z(xXDM%eZQS.w<ã\~bA'2H$ -Щ"!8ÃK&mz݈+f髪HwdͽFZ\llf=qZ*g.05ck6 kM>ڒzRپ3{fq"ۡM,Ѓ XE[xIϷ+Zv_褍:jEGCH'<؃) m3#}0""I7ylo۪__Ћb=!:Aoje2,K@mSo%]z+o:CgnS'u*/$AN3>^okjǝ@+"=V R@̠ǐXrb1xbc"f\Za,~#1.63!c63˷"~%x0uѧȬߒ+҃ҵO,)d0xn)av`e?/nqMՕ| -8>ZKL[##8B' wI?ҳPg)$~*T=/j"dBZxUf'Yk9zݪ`P d(l - +tUfg0cgTY]q1VQ)wvfUL>h.B C=9V:=BUkx/ԎU2a8"hX\os. wl2 һP$,0̀M9 -5d}B`{|\j<j]P4,!;LDXֲttmoFq=RFy#­5v.,`{JH -K`+%Fԑv -2 %("FlVd90}`Hp]~cIx|`I2$.ꋖ(CB (C%9ʐ[:@ Ku`[: -@G//`I -  9_(EJX|o۞ȃzR j!jr\^Ã^@3҈z,Ɏ6, 6k7Zr1ꭼ /չQe2ӑs)4SI!F4!Rd ^TR? ٙAD$ ƥ[9 z:|e5WOP=y7pKӓ,nNA.w1FvP@g> P a>!=wQ/%kk*G_^]gY.觀<\~1r x) |%f -֐Kͣy Ce/p }NsjZy$CJE xR::+cޕҧ\Ce•xi$()I)0T22~c/xW[! AQX ZNDVP Es`ZS] hIZE4k D~Ct(@uG@X&^G"!`dDf -5#<)lY321˿#yjoet 3e2{bbar«w?5eP X;qۤğғ9yO5/NϺE;/Nw6sg'mA\jbKȄ$} -Nx {7x4Z5Ѹ`"*s` B,C ]eoDbGz[e[A]&[7:, Bф UB%% VC5 " -(yJƁ)lվAd%wf&MَF&2` -5ۜY6:9_Q֬θ1z,7Lka}d#+aWuYA4Gzs J(B-H:YS? ,p@?!.#l,U!^`v?aSbj>u I}"a&Ejl9>8V{En6z cw$, I(@jOEж*pKBmBWq )Vk -h -?A̺մ8HL$",WpP<.2gpektvpJܿ>Mn5Ng>$К^Ӟ&_ڻ鮓Cv#NOA,iщZv]̟hÌZU7!!`o^"*3Go8`:;A:$Ĵi(w8(YeiIX;/$P,dd'"ȳE$nRYEI P$c;JRER6 I,qRiO5#D:jüD?n|vi(z -jl Q>Q`LH~" -+RE4*k+ rKa},{ t wA ><5_*Ӕqu.a[m`m\v-Qƺhu2؇(8 r]T2ПPm|n6rvf-~-*Rv$%e*b70+($8sy-@je:2Gx߇*P?>YqFAPB!?ɥIäX]pi -"Ik^6lm@]|mڮl˷ą[!rbj;%0cSW#0QHFhBs&G&QC~ -k䙞^W Ygl(JV`]N/ŷ?sh߫_KAO? j>]!S/Ejr_Km)OV-`d*p&LO -ha31}Mٌe}ֺbq녘mwjyu&M`jt2 >Hy=z<.z/BawLFTBS 򞽘wBa[g6p߸b»~m^x᠉plnvb(pK.#,j(V,iA(Y; SN|]8>C )Dg1Ҫ鶱跀{}+;Gi%("W8өsu х1Sq9NŢ~?l0_.^ƤJ4\B"%̆,uTo%ɬJ<6Q@(=wlO!9 m(8،|:ZD&H95݌SH+$B%WfcI~ᱯL%6ʲ0ioņֶE߫kYXJeEPZ*\G-DFGه4R*5SN Q_ڑ`T_2tnZt叁b?iƊWr<4P!aNOxBD{:b -r!V8buX.[] -5FfF.hJ.dhұXK-]ӿ yX౜BF_BI?u)-,z5]}=/Q>Y8O냑_ \ HDTIn.ň X^[ LjXez}ڜP}vEu8瞑eVc?0(CyzKqyUB\c ;z7AN\`A7mIm~YQ j&@cItSlo#`[a6TF痁d/^rv̕ -FDz}aQtJZO is|RaTXCL$>ya]4mH@6Et3KWifχN*/\XlZxߍ^6Ygw*Yv`|a=.zu{e!x c@$9`۹QFK0#N%cÞХλa[HuR><G#i >k9\ޒߞ=RȊG/ Z9CX`,ĕ[9X6=@/%.2)q Fb\/+<ĵP/ Tb{i C+; Jm>ZT|5>P;q-"g4 1 XYAJxl v`WX/ - -@{;3Ĭp/gitʲ/i>]VذMLkJ(<4*ޑwY:Hu]$ WA6CSe8+EDl,aQAQVo!"Oug!AN?9D'Zl$:P Fӡi͕1!1onw -yEhQ,DY[ eCz*2cQ>6I~+0dZM4ӣqèÇU-B<AM(KD,~eM޿4J d vӛB%gJ7Cu3)&47CrboeF _I(G_trofpЦK{bgc[٨i2p^oE !6Nr]*2n -a:Z|Igb."|s,6 Hl zK+4Q,3bFFDbI=Eb}1mFFD'FF=yh02J>qhhb}-Gumj7P-S 9&[q<}$_^Ōb3d;"913g1bFqH̐p](;1$x(IbFX%d +̝DX̠_\̶h1s  q=:rƩkq3p&ͨ]Li[H@78iȋ4wi Gv31D `3Dq 17g"bo BkfL,2גx~»uJN~@[: - $>Spwnl -etBWe2uqQ*܂{/ø.U٪Şv@RFocO( j.*B|-CrpY(H &nj$}_'(W!IKYkxe)]UzLfTvͬtXHvT\IJ0jnCk~WFgto?TnqkD:x]%h -kY_˪ʤc^(ޥ(TUlhOE`a7fG"Eol͆=@orTʍcbr0WЁpBTa>xȥ_ endstream endobj 187 0 obj <>stream -HWVJ}"@ !!CQ dAE@ou'xtﻬu~?t {WM)N32\5+ČʥB΢τ+lGb\4tuŌo}4/7犖M=Pt!ac+%oXq]aeٟ|3d&sD?mчMmLS -ggɩϊ3Lo=7i-XIdDf!=Ղ "1IuoaVe6jbRݬhSxdڦ艼OMݻ'|CE5Tj:B3؛%©jӵ:D** 6]RPw(D*1'%wbVw^$.V{ʳOn}(GNPeDQs0H=`T ۍ' _pfJ.s=ܙuBBF˕ nv|>k1y h$+dcϛsH_/JkkoW8iD ؛2Uj V1'(0@hd6 \WOZ@z+»ASQSfC=7MbZ'kT踏ywC)z'V=u⥹BJhNI=J6/Qe\螷l9LJ4n9u¹^.f_z:hAZnFqo>Z>4Po~WO8Gydj):Bݍg{4ÂF[E\v`>֑5vEfr>/m׊j&ٍk֠F]_`PHz abl j>6–Ď+-/5LH!.1_\H\JMyf |Nm#8)]^y*,myBV'$K& ljW{gr !sn*WWt/ӡ(`ØXV7xav& xVg vD7QO&X9Jl0%%]ltɥX*ֺQAz&V}?a61LU+Ӷp,6YY=;V[rV -:!Gl - :r!H  qlK_K؅3.~חTq4ntQ' > -x&< 5D mO>#ZhYڷ(Z: N|R ȑQ^!4ei\/^39̩S736O K\|z!7g?Mcd|.s ]7 f+NW4`S 06;]3˟aq<|:ŌOO3N1y$/..p -:5^]oP`^ f>vjz}'V}CRG&_1e[k -*Fd46B _+6vZ^|$杚Pm L -)!*\ w'?zuܓGըӤ& K7 uŌn᳏&2pB8_U iabdEMؔ *& ap -;OY tNBh3G]mLLD捎v.EKUήVЬTW@m_P#:t~pfė%:np}GNl]G{"T,4ބj[O#]>А"G(%VER8mh,Ip [Ĵrr~,-%qocHɏ -$*f -*RvGoeScI,IAe}; "=ߧzk閸܊>Lȭ%;d -2.sƞɑ4gW:uD<8c[y3Y~s V\Df>tD2rh='1uc|Ďe|bGq4Ѧ@2(My:߽{ xt&zx0FAw)v&2RXXo^7l) 8+e%@msc"-QMҝݛw;:;xg~8 -lN'Z8Zo:չ8D H JH$l2lL0gFiwۥU@BbOwsVwQVFLPa|x8249;h7,]:ɧ++e5BN(!0Ǥr |%% H F~CU;WBP#z4N4r; &CNh"W+P&̙bi_t{jɧs}woMB(EUV'#V<=FO:q[The,`5`7?|C\ \!.+%@X<-hp'}:MˍK f6ۥ ⦧Kʋ@2RE<< ~A&6'|_4ە/h nU{~Mגi'\o[0mͮQhG\nFcs{k6W (^tmS[i_ふG _!r2YSV-ʣ쩰{HxԚwCUЇJ$(@G:!%Y|/TGci8o?K~!yTvQ&L0"6p`)( iզ}64IoPBqFK_H=WNhAP5Ӣr mIU8fQao"= chxAqva8;09ىI2\_;8eNd\eNd\eNd,܋4 bi5WSn]LmIS4_mN4pS6 LT'n Vk H[m5թy/s6Q=᫈s^f["غNVW+z$02fXE =gdޒb9vi]zX?>$>my$[VY2'7j%SwP"-'8A=P}\{~Hɰf0,ץmM 6EHǴKAY>fyPa=.6YiD-01%Ԟ - -&bW~SB5-jqcp>`Cf/lgzN Vʘ7Џ,zu*bgh@$_nBė*Gt݀ s4%Ŕ&π- -Y, 9 \p~aFD,oJI"i~*БpH.m5% kʄZ9 .Nk f́K`츏`F -_iD}@t'jJD}t責oB/I[yp2w/ʗjl4d0ö(5(%uR۫իI$S^YL +1kagƐgнjQA^tm幃]Zi_">f捃qZG4$"9(II3= ʗX`x*˧h ʡ[GSabv~f| ݴUЇ ]n؇f-qRm}! Pׯ`,Gۼ`*;ШL zTc0f]H b&GaّU6UbLSEP8륋^H=WNε 1nkNmVcu&W5c65(+pom^ሦ 3yP:ؽEdQҩM>%|0+ٜֆJA) -hs %>oR|UjG\G[c溊]Os;˸ ,"xśM8sc4 k4MG -p|:חj_:j -r-(##F@4C2v ܢ`F˜ǛxYWkznTvlfB펖 ̇b!\+bJ4Ŝ?|C\C2_ʉI4sbAh+pp?g\|E4 @5̂p{&:'_;sMT|OX[j6/e%AiI,`E"-GxIL?s+u _$N^E]DoϤ )_z?, cf<{?"T#XEhc _w*)oDS)*, 筚f~ :toJZ,rသYGR k] XQۤ'пT%e!p]aI8A/Kѯ)&~H "rI4g*vK:,~a7,A -Ժ -κV3{CQMyeVC0ln/LzgsmkheK]BxfthÆVPNjQۆFo|RdR9/Sp?4Q3l=MEגe r4%"LVX ,lC)1ω`BqkGE:js`S g_XLnE\S>M-`jn3F[XMNI9:*G?ɦvQ^'F~MkH?/kPۖ:pĻtOs j$HS!VL7{ )g`SgI)L4@] EGZ9,,o9ŝ>^c+JI$< H86 x{P@Z`x*!=t.-F|s9{,>'N 8l)=$(qԓ6gv}!%]|/*t?% DF ]`4ۼh8ШLI f"\ y ,fJ ^{8]s$\&QIekιaf;<휁"kTYThIJHKp7/Q\@p;~ΰ'.TЧү0`=})R"na\~s":~}~}. -F-^oUUV\)θ96bfv  : ]ncYeD姧]T%˟J:NH(J2=H,6adb7 EѪ>O^hl6L1ݞ /Q\-1Ĝ6mM?/\Գy& Ɂ' S%g"ty&W5%Ge-vl:>N&bԣtC{yAU;Qe:W;sVnj6LoCgh]xh,hl<㡁y=7Czh,hl<쓇C#x<4p46GFE;=spcr/xBf0@ .@-EC2{2\4fg̐'qGO h'~JҤ1ib̎ys(9\Of;hzBf>r/hzBf ]\Ag2Ǹad@ЄV9c#Qɪ-hG+X v#A2^n |hVpTAF*6LY&]X"{?ħJP@TJ -:?@VM߂0˷9f60awO2q_Qۤ'пT aBgmge#]C8 rLf&2K:Ǹ~@DRKN =LO'_i -Xw_Ac"#r銷~j\v #8-oYs RXl삟.K+ѽU@^EϠ/%E$(O4 ]!>`)磚ױ-;I8^ 7*Uܥ+@\U㪉Dd/_Pެa$:!NVRɘLi -p"15@{ud,.?<2Ys^*P.ĻX)!q5XF DT:FXqةE|♆l\NU^V;<;b_[#5.rG ap!>X) .Br!usp -O:ˑR7âKK@_`{"?/]`o1^; -ځ5E6շA@02E5Ģ ڡE;V)vO ?t+ueO@ J%g8ᏛMBus՚t4Wt:4ߺ=JO*1,zd&90A1j#ƣR8ͥbVIQ(yR'a bN" `gB49 Im$w$wdEbITNV4̎z|ij}4S{㚈jSy=L~6$ld_%z0KUL0GGMA#+d"w1 Z|4MvA]ٳ_?x%m/T^S6.%q4!m2o&WOSKʂS+B a /4BI,D/,mJ5鏽~+b?1PZ6@zjyLfFAOix!527N}E -s}qQGLۺ/x=89S˦Bjb" b]A= uF]& ?6/aM|ٌ&Cqd(ʘ 'ffL&Ԙ1K+͌\¤+cHib2sL13;Gc1s {1y1tI3]P;sQ Qf+3wͬz lQfΑt~͜#3|_t6sۺ( ɸǸ4қ(tx6zR7e`)":<4qq/5[a~D8Iۢ -PT !֗<~u./r*YS%r*jkUN;^ V!2:`|WijQ9@cRRq;n}ƶ54TuTڞt9E&Űȓ6)t!K -uˠxV4|0"BZfO<JNrM\z(Okj(cFyk; -6d^oѧwV^E$rn%> ҇pO!*ѻ8f5i_ - (s٬ql5Ԩ\&'ߍs*RgmݟG۵0beaKG/)ΧB=eO%>>&wZA<&ϡJJ*6 -nZFḢ‰_Kl -z Wnw-%.R4&!^LxLp_0S]*wbt`ؓ72ctσ_.o-D/yu!io녀a{p;qE!x_ͱ\`|Ȳ'LtIb]=QohW>sd@ @ 'EAJNQg?ys LTAZVOg$h;4&o^YkYE~v:|v:c.{ -v;c؂\HOXXgW(fng;.PXA_KqNcN#hOw{7髧%Ue5YGȊf0͆v@q[K\qC ulO6qTK]8‚reQ^k@o9DaT#`Yȧe[/Y+/{oul]@m ^-~枿6dOCȔd.IͅWI=Qwaaא sߣYFDXMtFbN,q1 amRE٫Lk"ON k!׷@}ݡbS4\ .D_6dtwuDq2R ,1 Z|4J+j/ŻT)07!A.OyYIJ -wfN"z+tu?̾MuKs & qdb3f=a,90)ʘ%LtbFƴV=3R`fdf爙b,fvQ1Filyr'=63fFrp3GfF1mmfMJQfΑ+19GffΑ}͜#.{E4"3`f爙b,fvA}#fd:( `pc\ MNsV.'Wo Gw\.>EGtIOk~x;B/Tać|Z_h9!+=ފ~E,0Ag<+>H.N+Ms6>Ad-%>Tda86TkT>=[~m/#4AA@Уq;"]Ĥ]pXHZcN0QzE*!XK{QT0 [jGy ~"zR!N%W+x,cx/Ä5!%AΰPݣo˰ӽ `JA5Az\yVie5<ų'c mj z&qTA^D}Mۥh~iupRZ H2,4af.;Txo3krcaU)~'Jszx@⊩h~IB3x1הY/W1wˏ 6UR7I( sGK\ЁAzλg2SߋŽQPJEOg<:ѱsYy 7'Tچܒu*3Wpr+9"}HjI5+(.wnt#AoyG0i@} ;#)>;l) "[6`[p4[w ]h,ɑa5BC*f[^U}&vQ*zV{=|;ƠLʊdcNK@6R<`qY׍loXk|'z9I -kFA,]1p L fJ< -MoeiE9l/Bzxt;x)?.;U&.!' ]LRq#EF)€lojLFUk hNXdҷz6xѳB)$sHʉ/[,{w_?q+F)uACZl!tQQX -&b^Vݲ&}q[<3Z֍aO G=6z7Ⓕ됬L~bLZۃ\(&3XX=?|K\\%.dt;K&?=/=/O̞w5G{; -ûs -ûs -t10EaMf͙̈ǘa9yٳƙǘ=˙1f)˷%\f =3/0<<<g{fPc8v ..~︨3fs׈2Ӄgk!.w/(lH/GP(.H8Riż?f*b>-L| -d83Ë@-W")?.5Ɵd#s1KRr#~ҟ ;/%@S` U>dEMet 3 2 BtSBp5l=³3UdQ LZaG0S̊CnрD}7K[hI8v}oE+R:JCJk:ԖTxvDQ_0Z 6MPWqmVw|d24;dX'nRD7 -!H޹ZQۥh͋.OVi">_35*C5 m[t69"zhUr~-s6nۏ\Щ5='F3SK4ި (ӢSc3KXfay 7'Ya٣][2 -tix#nG 0 -r#ؚO[v`3XmG' o&􅝑הّC!϶gDh - CԶV',Xh,t0> ab;"*دRwwe|ۋY819~rDɅ¾'N]9o1MwPt-L L" i2 ƕ~W<)bn$lX877Lg6[x֗,k큻FSI^b5J&L#*^ -w./ u0P -|µM%*fLҟ-Um8'?7'2NsV:}(zqio㧜v-ŹrZƧ2ˎ~QQhDk+o%7Z/Nc3Z֍aMճ]fR\rW~aJu3el6L,,VB'RbqД]oT1i9-҃2V=ߎ}1"X#x7MV <<_Dnd}4^;s_2pM;wGb(%Dg>YvdF3!yLf0|&UdܫWЉyL&b5Crz1s^!0э! 5T/f@&oW٨ tؿcрAesѬE: T4G?|~h7uN*^ ojaMm 5ILvQU{堳)`uĢ3\KOPi˄@+LL韱,47st[f@=0pxa ~1+;wl4)@JY)ᒊb.؆8ᤝ2PzqP ~aq7 ob˜z\$*~||hMM+CTN9+"S\[Gz+ƧYtx1Wč}eO- h&(4W T09Wj% !%²ФV.1\NŧY,5]r]X%C0V֯,h,Ɨf o >;,~Ryq;]rB YKʘ3q%L\H? l7~tp!e$)"i!@B#Ա,;oTj+GUz l瑠)v_OU Wf%*3ě2-T#0(V=P0hXH%_u'P> $E p| -Hg_D2.}SRak0~Nč4 :XlI3W (#;td~,)-LL LuWC끏n4WJPbHR=R""sAwU6ec-?FCKp_M =\qʅ0?PT5II,rVtҞWx0y ZQǩڙҟD >9\bG{Iw˟oJxtwuoJwwO{I_"nloǻtE]e?K k09$* 4.*QuYd'zPG-ZM a]QBE¸ -.8 Tj)ԅh\/Cc;H 7qj .ۢ ٚZ-[*ڋ;1c pR!w2r4ў&״)Ĺ5hvry^,˼lNEvG -v endstream endobj 188 0 obj <>stream -HWiW\L@DcɡꦦAKssu? 3CArPg΄t/#^ ³8A6;1xqb?.j3Šb/c^4ypReke~|cZNθ\d-=4ɰXQ#imgUY2;8bn,q\i9T!6ԥ#{[<[ꅑE4bM]{J7:,u_ɷ<$QVb8yðcRfAIP5V(aNǨqi5{z0[0]{V -Ζݥm(A+TslvjOXKkY_/1j8;0 KJ+Q&ED06E?l)YO%u.W2˹yi#d\]l@b 8拃K=dc{1}>ʑ8FGr -r59;F{~.,S!:vs8]ljg%uDw|v@wJm2JHϖGfP=cԽ!OB,֝~k\uBo۵?? -f4..o ])W0CCێx>Ϝ-/60fl?aUOp5_`HЪr-ů SIryWdY;*=f}qhI *#N.X09CDmNI֍/L7Bha%q>=خFfdCa?3*#RBetXpblXkRoQBۃ4_S$ 5hV~&*Ŭ[j,Irz^*M,=#TǪE08ii%{XV~ЇRbΕp*y-N֘׋G.>0pPRl >:b+Ս2b8 -^AhM*Jܿ"΋RMV Y/s -U(SQSߛo.1vAG0p{ 3f=7U+QW\507S|S`f.9qg^` ZC匌Ɏj,Y$sGBm2nU2^La&源V#/HT7Id!' -E+fdrKxf4J6K]}KPY!+ Ohu/ݴkF-T6khbF1[E7i/n ,ޫ;SY6QwUS?|Hsj. -o&tRO`9R?F0E9׍_Qu#Ax\7B%U__'B9׍wqk?Tu#qG<.ڌR/cjpr"ƴlAq[4[KNHzh3gQD d/x )~fToFnEjwE&)@F+ܢQ䱙a*ڬw7Uc8fn~Y4ʜQj94`4La? }}JG5qo(ƆA奵,/MLBT8%CPx<̐q0#(<fH8 x|.̟(2)P NLpJYj#J$G ͱ-gn] 3qe˙3@19spϙc0}c+>g1.>g1Ԏ3ǘaZ98ƌv1yL4Ah4ˡ iд<4 (44Wԯ7 r(4i 4i/B3!BMwqQgnK0564\w}mqK @+ Xqz?EL 9,E/ )sRHPh2 -ϱ\~򽍣Ir/[N~"gE0Y~xR b{cʶRW HLB,gD G{uσ/I]]j?z7ܲ0{ ?WyH L%@p I2_%3e -n ?9 ,$>ErLʏ&mbSԶ"E.j+ERHld}^TP`^dKx n%(ɍ?[DU[($k~RF=QjH|u0=@x6]S0]:ObMp0 zP[BK¾u!J=xQɪ>⫐"!5v7xΉLiig`ҥR{y 1(< kV;|o=g+̛Hg ,)ۤ!1٢_gE-[WQ9ސ0qv7;ğg  N7;>P~:c(9>Tѣ ^|h?_,sF;cD/<܃]2%ѭ0wPR -8$?0&Ð&Mf/6.]]2\8nURvrqж:S4 -+=5Y pjk&h˪LQ̵h\b( aKDR8$F9="2$)v cu\'&d;Ps&6"sTOKWx C<7N6^7N6 cƩbˏ~nN9kOjSZuHמmXzloGxC6 $Os8'R -ub(F:/u46'p %@X!z\ O+xg/Eг ]V|uQ;[o$-hh"51sA\A&_= }ܠB:2B1!,b mQBN-)‡N[ee2 -%%a#<xeK!DQ}pb;o>kBcUp0W5Hڀ:Xd4(vQމ*DM RS%J Z$/O.Bf8c]Ɍx1 16d~pq9CN\|qQ>'c}9\N\Ƶ9Df Gfa,}dfe{. }[m!,y.3|:]ۦ_Zbt &˾'7~nPl鳾[Lsof]-xQF=QiXޡY&q -..vN]χ_7 hr"BJF0FSGY/ &8v;a 6yʹ^؛5@Njp9)+W %!&%U* -GQy8JM,%qJ9̮tΩ +o6āԋC$f[+@r|̒} u{K \N⃎=> ڟ/_ 4A\:\~/e>p<",'"xPDQBN-)‡癋C]~LiRvCII؈9)3g !T$}yz|Ar(!^[EMX -&2w|^!R[=PTD-^äдd^.6 erlr.wcmNtn GyM*wߛf#BFfE+Vh'^hWZ]Lyf&Z.jR(&2|{97sb mrS9sQz?jim!8H 4DwhN$ˊ@RݝH)m$0RU8D  $@ - )"՝_tti2|>L6mڮdU'H>Q|hSO -_JH]4uC#`Qy+"- R0/O ZjO`ؒGmFxF("H"jfYk5hJP9 FA;w/؇hӰeZU27s0ضl=5@{¼^{{)#1(TujԷ./PmnwɆCf4erq;faoz>6kHAsrYJ-~{JfoTi -d޸EQ =ׄu7h> Zln@,x,4_\9\~ez[@㖦8wE./BE!uIr"; OՇĦGr Xd/VQ|hS,PL4\(*1IM[m:@OH@ud3pE6 PɣG9qPcJaP]½#1(+4te| ݺ3 %{=ٷ -f'}@LRM=nZUBzlxV"v H{a0pTV8{4LlpS~ċR^g - ӒX\43Щ:"+H/棳L7nǬ0 O ֎M8d7d{s07n2H[7aSTJ<.%t=0 -Y-A>{W3 H -S&*SX6$]5OD@' %rC9HV!Ba0+q;X"_ˎpܘn -&6|D[aZ/$KV x D.AW9ENy Ruy-mkt3/8$z :2=$Ly޵<A'_}c c.w90A~cl,9hm؀|||Ak͗wacstJZ|`U[qAL'p%J Rj9p'r\ܝw<=i.^V$ZS!0_ڛ@)IG+sK^/ BCގg;4_[+M x(I\_5A E. I9gfZ?Y ]ݵv톩К`!4I -q*=D}#ix?|0 V\ZÍtBk$ֿeeHUʄ[2AAV >o\J\o\J\D$p \>Xb/+8O(93,QыS$6aJp7 |A[Az8J8(q)I%R *oP/O_TrFlCNbw=,9~n AI7%_ -\+}qĘ֋4 "`!8kиQ41vEKQ3@okvրo2ыu`ctv_toY}_Ծ8J%-rLS@R13ɟ\F~|43Gޒ>dd&A# ?Kf>әd^c2#u2C߸.\ -]^Y飏;飏;9L<-ob[-M"+[9XRӎ=f7m󍁴P |Dj1 uGl쁃t yUV@Bb3J)]Eˣ RuDkQC6+w@CSC`!(%6qNԞq R70)փJ@[b.EezMv7^`(Sn'kTxii!q#1J56v6Iu2P(I^JFxҪ]/P]dHj(Ab?T&SjrPBn#nVwv 2b&2v]_427q -P(V}|$ c#B!:;F~JDUO.5|s @h}dSEyޡOBfEɘMPߝjKyA\Q6WG9)J_ /dJ??z fQ@_Md6̀-[ ; K+wX ",1|k -rӋ~ϊq]³I7uQMGӑfmD|-ɋ#f2)2H+ -ON& 7\$ m6@a/G/6T9ZƯZ\|\ -qwLާ/l-v1إbfkѭᒐR!AjrH$Żh"/"B|XztEWS5m|ɻ44V8-sDG< u`ctv_toY}_&]hg`R"':(33ɟ\'O쌏`h<3hVOl]cM;5)߸u|_./\N'6ehzb3Dv?`3+A73yDDY@p" >-WKQhn -Nky9sH.&3Qx'*Hʈ/,XC-=v/.Etp H 4 !7jV@k ht!$Mź1r,[t>kt 9M8z(Eߨ1[du^QnAT[;H v VG!PWdFEc2#1hLgWdQ>'3%yLf0yLfV儯 kec2#|<&3|#d&ת )%[yGfVxLf8c6̐w6R8!&zlTuZ*iO.9/pX{HGj=_Y. -t I9IeBTҹV:`ƥ%GUmO1VoE^VLT,54iՠQ:or*5's h~bu56> -v[Ix.XH~A4!(o f^{2t8Kʔ$TJr\EWő{UNVe*fMT%iޔ. F~HO56ɕ^@U 0$ RiIija:5Q>j!J[%j *&W(5+A+5RJI4QXr="n?90y!b?` '~"<)hs/IA$[h}#hv-VZǟ%JN )`bAAK -¹u>%$=?y0;( :7MUBI+d:f>ݑ:fs%p̕=G87[t縷 -ߦݦގ4=:@1uJپ"|qT[ttM,6zJyd\Z[2S & 50|ց0YPS]`H^1A+Ja0K{X*\ALn9b|; .Y _o8f)I\Q22DZ>n`ݤcn7(fznvFVٙpgznv6w=zfv᱕NGWo\8ܿ\9qbWo\8Q y楸d0IGyѿ$8?&xDAYAYX|Hnv3m *"XY,tXc"RFog^;L]L^9e;s;f-Ц :א&O&-{5Wvn\|Vזl{)L+|`۷ \<ɐ2%/9KgMosm5/ϹeCl "*UC{a!7U x"hjHyLZV5yh/vvpQ$_ِowwD9s۲QlU#MI/}=aT} ]v^Zr1N ~z*)>>~~l6`MhYGug)^ݷC.uK~1X+%ժuy` -o8eE)V2i˸@XRV_} B(<5 Z,&D@V -Z+%%{^$ -hVSR)6Jku - 8+ט0SMZ;m2A(tЃ~3o+{(sdz=Wl'W ֑#.ĕ)GDZ -_V8CaJ>4IESkŋ/qP6B #`e2BYKs]9n.fpU"B0zW{ԘLyzçb'*:(L _漆E͛%3їoqK ?@9406UǙ;o7OOO^RϺ2sqi-N0+nIm%$]јEl/)lv~ah= esrA29crWyH'ִ$Ӽpqyob/_l/woum϶74T7*v[kSdFu9l,iii'Ð78t\< hkG]5#2OW_$O^_(!o^%TbWId[X}8kI1TOkRzٗFg+Q 9dx L-r#"^lt5 ~AHD!sAKA}Ɏmf8 JAZZڿ=ddM^Y,/5^fWިbl_z)Ep=á'@q]s^EjR\";J\'uiZ&B|M6e/Sڔn9){+¦5)p){M -MkRΦ5)߳)__¾7e&c\¬*$tJGy8!J ׅu>WTI9Ԟ &0(9B<bR`֯NȣSIɭF-X?ࡔmH? #zi!Ozv(՛όW g]YvvջD ql$kive E fDux' Q6(eœSztLxd/$JT?!GA*>DwIcYCyRsݜ[(&o6E͖H6CUY*\S:g6Rx#Fҥ&h&f $]R(WHaC/ZL蕿$#8(G( `&M`F1<3!3drjO #edP#:qwNܫes2xdX^N"*Qͼ38;0GyfhL*;0Clçg`ck3bmm0`rt `F1<3pny ffR̠b -c050`]ҎL1o/+,A^>KdޱN!]?Egv%uס;&Xmu CQ#]^Eas!= ->*3Qntb O7hTnzQu -Ş,3NAd -JTcddbnbi7Ufqx7,%|ԤӇ+i҃HhuDP7f-*[8pQfdH5h9 ]/%_ ޲際VeCRDՅk)F42KC)MsXq@l55/0 0B_\W璊iAR<,rx*SD;o̙PRaZ)l'/6t hIBҥfA4d=W"Cvё8G~/T:2'eAa`i]h2)ή1&>@L>UwW¸^ a,BytoaYDtXp)v/ؿ?M$84cT>Nk.i#0\d#;qq썴1wnC@o+b%CZF|B,H -HCtQ޹V57r般D23鑎p6Y-F'tȗBe$TlgߵDfW([ -\R$[J[n;x_з'6h$3! -ݓsf0MH’b<I8" [+x x^ :kb@.JYk*^)[=Fp:&mbg؋(&~bP3K>Ms"x.i,bH:X9]b@xousw5[r" -x_"~,:5o3ijhUʱcul\4V6NE"4@V.j\f8TI?%bs)aח/}i, qkNw\x]gnŞ1с%~PMn`3 endstream endobj 189 0 obj <>stream -HWRL}% !!I䖄䎀"AQQ=讟UK?Tz9ZlI*H='7 i\Ҭ&I#yrf4PJee;1@I%Y<]q*i`ւ&k ػF:_)0Ǣ,2[KSZxo ArF\X8Vh=i ~AnkGotw(fLحKpjDlP|sz,5 gP -C6z g&4U^"+qKt%i6Qc`vzޒ@&Uluzm*}mݯ"ݳ>į1+W+zėőWQ CMQ|4pQ()h|jTɶOHQ1UbE1tEPv:it5:PZs)k)m^Kڥ&N 6q1zYgK.ז /wy̷P@u%usrprOms~l_zfM_AuG-<ҹL8 Zrgٮ/u䠲4<+$R/\OPS\G-{ -礔JRXɂ4{8Ra_C$^}VPHeV0doIJڣY"pvd0z&y/K P@H$d0d]osҗ$y!|c@3G&WImG2ŗ`= -jすK2DM1Ly053_A eпuy+30R`Vg̍Е.4 -0#rf^^u*I*XYٲi_6gD{F.@b $x~{dNY:,ڕ8yGp҂Vei*F>{푚ݲ\s;vͤIUAxި0yg:8`,;xV颀ie ~V a_^~9/,y"0ŋa5sv2 'lҐ_ P:Rm)a(s}Vhk!c)ՠ!CAq\譈)05,NockԔdHO>4JM(Z2Ѓeb 뱋mc4?N ^~EX2[2>L{9܈}:b,K A/p -d - -B,7 .(:N76P8n$^V6B:EBpH[ ̛NIcQ{Hrw5\cAm9U@f @f RɕW0~g_}\ۤQ>@.N>ė?~S߼+ˍ̷zjaC|!F(5 `ِX9 ^#eqY}n -94`& XVX)@`ۧΈZL ឪ+"Z^Ra6O/@A7S3wGaS{;erl<< ,/sY_G+zq+G:v#ƾr|b-%o6ݼe-8d-b[71!vV{HT=5kյ7b(YbULoZcF9U2zER/VZ{'-LigҫHI7#xx8N'P$x Db/'Ov{K$yG=8)ЙtL`QzN.`4ĐSZ‘8QJ<y4W!fF2$q^6K54ɓOu,1NW+?w m5#7@pס6 QPɐ>LMПְ&lɻ6FoM2WV^"<5iKt%j C͸hR>QgZvkA#a\}-W+zėJ!9."АnFqf 5A_yI N3;LUkfM^s)"|)MHKڥ&N͞=@y NcWAH"'$D2&D6&홑pXWmþP3=}>MqL~:@9)';Ev9|& +z+ժK{ H -MiBt]g,bgͤqM[H? /W-ɢ}4[ml&$>L̗?\f(|(;hM}mJ -_R t?xߖsdRNJVü|о'X IM$fZpETX'Y,KzAqb1Nmq{IG{~H_!.-?y=SF2,;c-n[<Ƥw5޻h3Y3 L*?T2A|T$|Cl"R"UZKUQ:dW$_:t>Wc0CҀ(s'ǟ@2'1Ap= Q7d15J,$}ΰvv -2}zy@Lưk-z=;-|BԼ~Ƣ1DlH|mg)gkSz "ךbhJ**X1+mU d\}*Pn{Э9Bb1*yTv}0Ry9Es#)!=cQq0TS {fZ .%qz|4W& -C ؤpg]4ekv2QV myԫTIr8Hمw5%]b2u] =#XGfD6I:#9噵TWYo(dD yTrXс+$(˦X}ctt6Y6&HbC@_~-)@:7Zl~^蠏'%.?\PO54ӗ=tw W3 Wjcʣ胇8}T)Y!3sGN"۾~>/Xϥ#4?Lx- Θ+ƒ^HbøL.] -$ٶ:dş`U'n)Kjh^>\Ho4r3^z|ezjy#>1[ OIp{Ac9Y̐€,fHH̦)3 3Af1s({Ōx)n3A>1=bqau\=٣V\Hミc<Ύ7>mE{c硅RjJ\iOCDH ȍ% (EFOuw"239N{Wkkyː56HT܇Ӯw5+SIIƋh%N]*060E\"T3P'8EU;I/+ke~7zfַ#<B]R4_9:'zvu\c9\u"aBmڠDkzQ 1ۓT%JnpLsi*T'%|?&'wm糍rmߴ4!m@Tt7dg/:n]J=9v+,-Rˋo/p2ܤ -O.t@aY n=6%_qhJBeTW d7xu:?u.?'oֈ .,݉4!h֥w3cU;5O;J}oQ:Q7ĽS؂RG4sۗp TXdЙ#v9㲸 I<z)d(z=wV# ,qUg̸DR8^q@߸|A\Jk - $̟Xu"n{wP7^fֈn]:=L1m7O(yYD p^ ŕn&Qd'eܯ~Ɂ>oj;tccOk^B Цm\w67eUgkk"6,/v܅1 b⏼%ȿ-0Xm#S}|!d-߼4>i7lUM`:ePٍIߖ*.A~tZ}By-YK@!WXH]C[h'Q>e  9N{0F0* i6{iz1dMm_H=́Y۽FK cx~Hu8Sힾd 4(VOyh> -O&3',/Vv߸|=\o>ѓo['rD&}e>oA7f2$#c(2' 0 3,2' ̩˗qOS29G2CN !@q:A`a]f]g D3~9)߾GM4&cY~綁d%N&k2+3AlJZfJoŢʾ'[A]c)vUUx/XiT^hBezr[["<ԩ%` VxH -*Joө{y(Á}EΔ bG%e&3e QiҘ%e_ZLlƏ+8#)d, wMQ2AӻQ$-T*ظZ͂Jf58shne:3&tl!ip)^um[ ^>SA2FEfx|H2CwJł*.3g2()12Ui snQT ;Ef-f`& . g&8R@q hM3o9Gv1vMX@ "<@mi}tn-`POKwBm690q{.NeܞK27 Kb;/wONm?yDթw>/V~wjDb..J4@ H%E͙*! -ViW8)CsqM./jT>"Q[hPaU|z%VʳoUX@ y& 3 ($DY瞬O I쮮];: d{~ďRD&.vbv(#EqT50À $z$A]/`Ct0᳴E pAt0(Lg.NA<2ȸ(^ da}fb\ -Xv: ?Rsch;Iŕ\Ng| -h-&S0(mLvK&T yhl"u8>'b+:F"RYڹ/dlcdlgLѢAa-C?9=@ZkAS1n]Tx,ԶMfr/UMݶvQ8Y6N*UEG(apSlæEa[)DaSlyS[c7fLŚ1u1Ś1ψŇ'@{j,M:VzhZ+?nBP*/lo-Kb)Jtao,s|Y@oWVl=ھDsP<.2WO%|@fU5E s9!hAz#P|^[6 X|W%bBGe?>AM%A:J}1pz3 {!S -vIDY5^ I!xw[q8Ȇ@IqK:}٠ut qWz6OCa{K3G=L S*)~<0M>E'!ܸ ۞=_sɢe/$_G_ -.H8Sƹ̳fN$@.MøH;/$Pd%瞓UJa]5J aU7 jHxz%4è^E,(JWU؊ V؅'>2DcF֘< ,7~I ˍ #FV$UFC -%ʽu|2K j"|H@`#w9nI'.#}uL{z`K wV# friX܇d3H5+7dL : :yG.dSwfc*?0ZYYt/VC(}9kO8V!@FB2AEd$PɤkHњ>F52nW`q헰YcfK]̜}Фy~6ð|; c-1Uuu2ŢZFX4©7~V\xFۑ]qsZU9`Ȣ@&Bw[v beMea\T*feMe_웩,~qru "!N0˟NPv߂JM:5qQ]x!Km|{c/Nh0XB~_3k)z_ (`)Z5^{/zXmdzA>Xxlƙw/2pGhb̕Eh-t" \Ԋ Fs8ߋ?J\??.`^/A5Iŕ\Ng| -l&S0(mLvb&T ylPN.I  g)Her{ {(_y?he;ȣS xkA\] -8I[aNmd/*}*x&M3tM,%@~r//]%zA~Qyp@&`dD5YW˲|%iɂֹI -F{%VV+e5f,$J#&L` uX\{D4k+ -;܀jf!FW":APP$*D'8c9 -X~ ;؊ ,?Yҳ@zvZ#Ffo~腋:ҁ0m6).z -\)?{;Q˱Kz@\'fp]Fhoqt/&s-A.2~n%-'! s 2 (81( I4we(ΩS3* $8d$"An~#;ZH  JpKX,1a,.O;C[8O8˥{=p%F/ ZbZ)6Dpȸ9µS%ܕz)7yK-ZmFPS|O4DQD72Ϙ2| 0ʍĶzD3(*Yr-=aH2Ag='s u0hFz%6>4R . -b)Wk*HYsTXM_=bks-Gb\5{??u?Xz}a>*-#X*y>g -'ZNcJ 9~A±Rޓo?k S.(ūЭ1j -wF"$muhԱf)g.Ha\FJ8_Vfgrh֗ -@f2)-T>pnqЊY=Xvq0\p<̈aFзk5U\\^;2929d10\s2O 4[D}J=Fٍ"xsL4#jK88 -9nY^UNQ-O i>i'l΢W_"Xdfsv __YPSYQNnaX,G*I~fV&Ǫ7PQmmYI:0Eg^v$m!i;A,M1'pD|45TԕO}ѢJ9GwnO~9#UW딭8^#1L;͐Jn.nY¦Lv0W24B2' x%ŗNdrqxQ=J*W YqCeK4tI=#WE/ W9@jaЮuZ{WPwe_RTF#P!Ղ їfF6yYi:F7A3b_A{?NK.w2\bWrSZ+#f!:d]\S.z $} (>p.XZ~@ -N.(d.apͪp;< Vvײs z:|D{K P^7Vy#b)oN(Jg@9j>*/(P UK>E٬"r%Q OwYI4u&h~Rkӡ.!PJѷIpxG0=".{D!Ӓ41hiю&ɄiUv1,ZvRʅϺ\R.&31D;a鐌Y,a8M|_}kח*[hM8XPw &tT3HOo1>7BG| c`[jvs8Wޛ@ 'k -@@Ғ~??4b="rK<#b\A h"I)I)IE*[gdw* k/;8wc+LZ +vX -`#`?^Z]yw/I@Jq \ Xɓ:R3@BI<9ʞ,Th4:@y_l mG$>*r򧢌NGM*iQrPwy 0#g]f]f?= ۸$a͸L2N/wIM0@3qeɏ42x 7II%%~p[\|]Ჰ8'&q%/$1;h&9е7^zHUgd2W[fjѳ -O/Ma+UUSTKZpȉJ]{2 XlA :GorNh+xKhVAq RU/.".iߣiټ"tASCq0_{ƲJU_qC '06n*ZWr cmz8>̲KxݼPU~j@tPohNNɼ+lK0R-^no RuP/Bks-93; |:8 |9 BWYtJG-H\g .Uu$waEYoϼ|S\7<  #R<$Z*[Y~h'sr] @R11 yzu}Apt;ÿ߸xl W햹]:MU[,b3Qhe-[3_H.g`M'AjVIʏʂڵatWFS4Wɂ{ӌGu## y2/iR9sdm63Ur' ̆B!Ox>vPEFMy\rcGmlqMkq܅ !;L Xᙠ@k;Gm0⽼jA& 5 {jڸF%l':$s -]bEfVi gbz L<@B2sQ&3@gx~3 3{pJH EeawAqXdE1EBqQDfbma?2@Pfn2sQgv3;Gf0gvNd~pB\Z;|Ȉs4mvZ'6\;ZZO2ۿۧd @^k*6 -Rƕh1rMD -xj!}[m,< (G7~u>xVqX"h҄OovCL /q} aC.7%})#~,-;lʀі9l\e2`dNFuݗVtN]C|_[?t0a9Lf.Йd=txeL -eE-td8+\~]{2<H`'gМrkc e}rv#03|s,:)Y[(>1%vcR~|P^1T`TJ}ga EG~ =Ioe -b BńR񊳸z%D{탙S!uYjcױqKPJ񵠔W+MEuU[?/\C\*_ ԣDd\p$D$w$'>>+}x ~ȇŊC.ׁȆ?yD}cC؏ -h7^=r:qUbC㊱rr2nܷ,`cJHRͤ7sޚ!`\\`tQϔ] nGVY|vr4Qڼ_KC4hk m8V+"Vv#Qtx.S~7nJ0VYw}H)ɘJSAd (27PaÆ{H.[aI># NTKAH>n܌y|IoKiqOʀ< endstream endobj 190 0 obj <>stream -HWvZ}#" q5C$&19h:޾\9SUj請YX# &/3+ -τ( nGm^_lo7^&$ -_ڼXqRdI ϶TBn%SJiSr sgCݹ ŵV-6Q=p2MQ`i?J-d\kƅ٬ J_)M>$ -L|&`a+E&,x`aagso%E+2njLZ险e:f6<O5j10Fjzbu\/&%E򪥮ZB Y,AY̚¥rYfEF`;X0K}ò͇yUJ>S=HPƳYFOz@שkU?]+]P?p"W  d̷Bfc|&3zf y3Gf^ܞ?O$(XTX]/ -+sEj/ym Ż5Ag \F< ɐЏ7_C=Q췀z^i:2Ӫe~/_`Κ"BPb ~ !m/\4dԈ:@Drwx -n}Q*; -É!/`Zָ70L6XVދOE4 ̯j/(X,>:e'hQ|!C;],7'2Y?A=.WO  .~2 ಟe"iA -/2eg\,2h'o"Mw'DF2AydFP,7Gf;KqA-Y?!(oOd`~2?FQ3hR͂v~CL%JċVeܘ2yЙLi3S3^ulx6?Q9vs'j/!zrAY1˳ dza)T UO)ão[9ò䤦АϨSڼ^{x6=+X/[:8*:5yG'e?PY iJ\6aVM2p{f t3Gfxs{f̹YdҤiurmHub*HflB?o\&F6 -vdfzHΆ.9!ߗk*vJ\&V+h},Y^LkQ'?R=0Ruނ720l.dRfO%s(Xi -nX󇚒<@ACGT7A1v!7L{.դi+>-]|L J_g}lrA~-qR7 x~0Bm1fS~=BJfX}˝cczb;7˙+MrWA(gBBqYecoO ->O^p&>~I\؊Q`q#*Vx(>3%.ʝ,TD*f'[X.(ˣoqJ7VxKw?ZH͡~jrYj밳oߎs%Rmxqҟ[gm -lN %s1N„ŭωmX᧓DOol\~#"y[.nN;@ A}W8 VEsZ E<] ;)m'IHYܛ^kJ^_l΄IҜd*:zպ_ׅE!:-J!wBL~ENY9T(w6Ff?d1+ G;u Quߨ:y%>%bF*Kς>QÉ@VWNr c:6GFtGh4/DMuhBdkhBdĜ 5 V '_&. nh?q}qvx@YrR*si Xذzj+\Dc?Qdנ y "Z^eJWW9^h!/ -̭VPʱiׄjumd.;`z髍#! J#md -~2J'ֻ"f;{'mxdsD6rªh;0t̡d??v]Q}&UBqV/qBe ٝ]Z#.?ƅOD+!h0k2;g-kݨ ?!EuD4cᛨv*]YNS =kO>-QC X"R+hcAak&ԭ8$(xDqN h7%_ -eH*T2?b&{"FBHqv\XolQQΜKBp_ O rnIgJ" -R%cRg4JXi'"me6 -)P/J`e@[F(v:mkIiHsgu%8L!r -/8-Kœh{Z뭥<[֖~IoU[}l|Uưw8YO.51)(/Ԛ"Ļt -2 3ٜ,ؓJi_"EsnT.x* ;Jxݐ5r~0+(\*Y=v7>uLQ=jSͮBN16 cme,V>݈u7!VTjy#hRW_zՌ5Ǧ@<BwP 6^t$hBjڛ!\Ң59M T(}ӠT'$#zFky\sh@Nf$* +\`%l^5Vad;(fѤy;|#e4) vxdgۄUo4HZ?ne ڦJnO.pމwSҞwq3w,{'ޏ'IYtDS'twˏ\u $_'gS8Jhѓ6W<8yKi57r(ъ4\1wbH{}c4-}:,i}{㪀zSȔR&}"6 g_+40bƬ%fl ⭣:0Oa~V` ؚ1hw~VAr&rcgÅ#͐.nE޳JZe|´~%Y|5)p -D^ "\gXr8_1G띪p%~~C\^Kk4ZFs r:7vie_9.6MO2fwzMƵoәݲ!Jo*KbI!%ǒ~DfPcLf_j&3B&32;=#q \LTe:YOM8{Xd|Z ?eՠ"iXPsYR" ^\p\Vo_Ԫyg Veu2XH%>ؽTAb,DwW"zJRH(V fvwmѮVĨ3 ['zWvJ}<0 -4`p@8 F3GDsNu6mwU]RZ>B'p+t)vj.|Dhs3ASZȧ*|G1%]7(n|7;i·-8b쮿19-ICxF1x95]ꂗո.86gggN?jƔzq+ ;f^od_@sqrp98sB}h2θzh2ΜPx!^AsL66_h҃:mnxց(@[] ?$F߂z2D=c:kUSsUa4kJ?yGtɺX oU+}4Jṽvpd״+A$i>Up쵺Mײ&a:gYZQNR(͏?Z5W8X< (!E"63L  oO|S\7Y iđ%' vSq#ץ/لEl%i:I{clVפ; /Raz50}qӇ]7MY-ɽqGes V(.)P[-̜ya'̖%k_$7@"!DQott\z2ԦMfj2{K* 1IOT_tr09Z2<Y;}8TtfL; "HbR"^ 1mVRjG!3gJbLf#a09]dz\.be2ɜP{In9$sB&c,| K\o q`cQ?(g5ʟ1%7Ȣ4"MfNFG&31#܂d+̆!FҹFA<5v<&:rz+\˸4+@TiNfow ;XRGx8p"n2,7Q5,3Y*@h dj:FpMZl\FvMTk>TE蘣LG]>*U늞p c=+ĥ'Y/|Z&5*W/=j%o}scfLŻ$޾J#U. I? .B6+-qQ2SR[Fķ6Mō\NdRJSkEčVҞ3YSeeT:8&A0B7.+澉<:_2tc C9v!i")z!C*hsģ)&tB j&35WHNmS;Eqw,BڮB͘BO::f1כ%N*du -NρWݲW9d\#_.^=M\dfF}$},0K֏6+Y^&z%J.+,z :F*ƥ-ұү/=Ÿ?5΋u-Gܯ֎SY-xXUMś@FSCZJB$`sL z ` XTxϥ8pM4$5!N)*ܒ^Љ^D -=Bnai"їWqƎ{u k5}Ǚ<'wRJ09nM[cFZ -Pq)k!+tBV[.TC`M6pI1դU:I%q'k?T,|k܎lm_X.__e[3K xcBYAAQ(dzt-/aAIW׮M!V좸 G]&} 3С^nзDK5$Z$$eZe2ts?/R[zQCsPX0Q 6TLmS ܌THuǶ٧f{r7S_@EWW>` cԎF 0[hL"AG@y&܅r( i ] .CmP;+ނ3ᦫtG stSoutp.snL_ 63Y~]Ȉ ,/q.?T@ViNQ喆U -ggŌF1%sZƕ%Ҿ0vÊ -In&#[ - (% vIY4XXXݻ.LP? yQmw 5l.PNGIN>8qQC>nhJQJnj..2RyG\nOCGOp/nrt &2/[ *ּ,> -}>lrŇm VF5,qvI8S7WMȗbJwގT$y~֫OQIKqř؛8Ǣ@6B7k|ƏFH5B;Y*mգ7=xpsc/PR k IJH6#lsQLS(`ҝ^\}ʅjQb`"cx"ot|x,3cW/S,WZg{qڍ$7AOqCW:X~_ŸY ᠤӄ/%7ⲌA1,` FmX=+J]֋gK8śNU&=Գˆ=t5 -Gρ@/dJ|<9﨡=#wڂ1'gH<% -ZނnZmuUE*;#շyqb3&͕g2US6e*/$_ SB~,x=!Hu]f:)M:KW."tB:lg@\6b6\ #J -D5/!p77É}m-.";\E=hhdLA lHS1QĿrƅ EG/LSF.mJ͟+iP(AK*r -FIԃLB-H*v=zM6̠8a?<\?;,_UB\rd\qQ;/sN&e~ ~̗ pApx0oq%h+8VЖChH<Ш ^,|MggN3Au%s[A6 1~W^`1;"+ URiJ췺enʖ ]+sJ&n>j -~2/ا%QA{ʟ4 62[. WIljv8^A%̓4h -ӭ }q;Eϥ;>p-QR r,#);vp|ె85ϴcHqEY&EWW= - ~ .T 6'5rQ4FĢƧT`2z^SCl -#UVEZp6dOx&>A{)w{ۋ,1Nx(dMYY^셕Ec@Ji)s.ܪػAV5T1aXV!0**31} mm^\DV A\ԃ'N|P(yDIiU ~a -E-Ou3k0u jgƠm`ZŽůiN#j-ȏ=.w947 SDCq~v|础=_8҇ ~a4ZǙzш@EgLjAȞ7p\N -ˏKw2cY`迤4Q -o\TB7V4rKӻFY1#)5R;+zϣCy Bux Yz9egsn?SϏTĥma]HpIE?ttLsIun&LLozIt9"H]O0KNOuQTT4שH)}S=S?T_Rx - -C{!ݍQ Upu/e|ASxBDᐙܩv(L'4I'_sIb63<>. -y . 1G8Te54$SHnu^> ðTQ/w>Tjt h; -~4Y`A/GfY bexg栐_ed0]̀a*,Y co\9\x6ppwQ_㎌%?cVe|8:/ -i~Ė3Azڼz$=Xmw}OL~MHຈ9cb8صH}v^LHM%~Mƛܥ$`y-k&o^uAk$a!wsO>sԸE]) Z=y -@i_z [{/uFa(D@IɍV ̚9a=b/|oq^ѝUr$` E'l]aHu̳CRKlsDBh{vR*kqCuDx6upt nN\BЭ6͠YP'a3UZh)\DΟ32o֩Qr0 C(#F(ajlTɄj -)or|w|0F%4ɈsCPTlu",)bH9 -H+1  Qb`#ra/y -F>8S#f?8ꢄٕd1lV0cFyv4;q#jG̱?5ŏ߯YyUnzA( mBq#D%)289?fJf|ס#nBi/[ Ӈ92=P}@28䓔Ƴ͉~Ԍn-UЌ,2F09$sOk% J:he7ACT #GRrƬ]<\nq~r#\bqLD3BxŦv;SR{lʯ A/1=z䏑 _O?BK -jAA'd lDr*%0Jx,EѦ6G@;4JƂ_J-6+Qr!Rsأh#ȋ?m A"^}Đ}H*gP$&&k\OwjxOU?j+D "A UEu=ˊzw/*/F('fd&OUC۷*LS›@Ż .p@FI>$pcOVtٟKl -o[,#!o&dcNP0"X ja1B7S=d:l8.j0ᜫ!\/PJKXXvUR4ԋFJ"LQUSf{!E^Q\ַyED "kem7H 4 9.1ؗ+ -ZM*< vL-.ˇdt|4YJ GџPq*7 }GO8e$wʗά 4/Lf0W":0Rdr苑0L&riKK3_N1([3_N1B‹)f/{d :0j U/%3šrdfj \y12sQvሙrQ79]4@eִ֒t @BiO#z~UiE|IѰ ;ޜpDuŜ ,@oF`˻VtVEc37 =1.w%i,bx ?"X+pkScr-l+gYp[>>Y&íS-VKILOmm2{>}&b-, {+kNe@`['E_¯ПdXeI3*}kQm'>v/tMICsKv?T4 ,-ly-9ܘ~ːʳnj31jLA[4BY VYrLfjNܳlYdc -(QS#޽-tBrL918Ήax옸sb;vfrGط͛:ʾhT~ݾhuU[MayGqߧy02g{5J3t*28YY>2sP{i!1}d栬,c_ $gEpٓ5{D3113cڗ0d}I^v#8(+ؗd`*,sZ@a2d~̐O6<}d'z;]d3y mg~f93cě3&30&Ff -әd :rȌd\12 c\(H3JIFG2>mCw |ގ{ U5:VL5eB1b]mkʓ07*]E/ia8ܼ{SW?݊j,N%TS1ZRƧ!Jtj0몊xO߭E#2 .GA`pє^_y%f+4*[mԛ8:#sJ!tg^c]\P\% Ŕ-@y{6X "_KrY'\u^9m7Y-UC_qTuq@ -]K޵ghڹtvpiqx{˖yO2:+JdJUjcH(G./S⸣uIF^`"`^}H][4E'RV0 Ӡ1\H#+?b1^Uš8ECVq ӆӎ#*UjlnO)+~ g8w s5B^0`_ZUR>*Y?X*RߜI*V.8=\{`s endstream endobj 191 0 obj <>stream -HWv}A(* q֨iL4ONNwGP>gaWHxS/ZV^ëNkB}&~oS!S|4zhߦtS4 HZɛYO?T$r)ޖ@z9 Tbs>ZMw2*Nܚ6\rۑp@|@ 6tw*!Vd##t7EJ/C |2{zkնd3QĂJs'( ` -tޤ~,j0^ c*Kj0"Rk/7\$Mލ`5S9#WqutѼ.2Hz&Ea`#ְi;%Wu4k3L/@ lQ8伱-ۍǟusGmY{OG6%PҰq񹑎NA`c8Did@oۙde= X?$ŐRG?Gtw,|pJ)(z~32㶁Yx2>F$ o߼o^A^KH 2s}4,IolM洕u6tb& b{ڤx >;hlt8 y{ U6[ڲ&iE8 L p&<-xf1K))B0.hC(tNkq\ cXd^^TgsP>YRD89~ߞ| -$-sM%@@Ѳ,N{]Vz—/Xi 9' -}~TL#zI"\:V -g4776R>Xj>.a>CDPJﬔn!@jH*TiΑ$zЬD[w*vGs&‡ /.@SwqٻzAo7% !\\:8sKՃs6e;Ѭ Ÿ?cjk=K6V -רy8'y"rYa!k wjOvE<F-6WiTme^۷~yna -BUZ!Ti< (; l%kɂfwQ FU^ۄzJx!ìגr+=2kɴxU c-4dDφw) D;p&ܽvēDnoAw?f7.N\sHq -jas臘JoΕj݁zLzd.H'Qj[7O@p[ޒcg$yW)n"Z K1Nk2qͽ}@at/LFҿz{+YYF=5d㽐^թH}l}RRB,!'J-uHgMN|ѽRԦ;|u{ րJn }%:gBH@ft9&PB$_.61@YAIh\NfAqX4&W4ov/ "Xâ bֿ'&Ȏ>1##pP[l7eEv@&8gfh/8gfz}3 sJ`&SDj~~&;3HnGhz+h뵸 ۧEх,IlI-X6}LC~9_bnYG@*/v9]%ÉdS6& bg`]Hq[x~>b0dPE6ɴԫް뽄 ɉ\۬גr+ewiƉ`̢py O^C㈙!kh13~Rkf98bfD/-͌ffΑ&%{C238Bfg̛_!fl朙Al朙ԗ!o\zB> O<jm3Bײ#񴴑6cGgh8LR;5-x>~WWzˣY+3{텶*,W幌'"¤Dk(8UU797+R@P%9v{ -ySq5EP<:4.@ Y^HLI7P+%9F1m +/ `.G$ ׶. qmںxwpTk Cp4_l TE}Ab{3 C84_l]ԧ/.q> 7.`\J+7 bn> -ws<;^zRqesOg>Rȏ8,n_Q@by^_Pp5 džeΤF>~1̌:nU{NB,cmWlIMk`'ڴҩ0SgIV(ˀʟ\?tq׃?d2*oyX 8L6wlVnGhz+/ϺpgQta=A~%qGе6)2Z|e;)fM`7p4ċeNp"٢MI#L!@>8O {!B\u(>dZUoXP FU^®O%TŇaHl *)7 0?4g8^8124g/odh ǐl²qX40MѠr aN H6fAy_42\9@7993;=|̐^ p\ΙΙd~EzD Gô!^Mahǂ% ]3Fb蛎Fevtk\6S -f kyTJ,bUQuz@{QE4˩vhUTQ "{ H r./^0s%pa}#Scm)i-WɠfM, n- @28$#c:g!B F%r0 Ndl` {f$!{Yε9g|ċ(TxG_n*L~J - PI-β+!mTN!K,J!Y=#\7ȓiq6R'7dh0,}& 0]W~ZX=/s8 p~f{'qx|ZLs{|Ko} !8"'#R"LjB.&=-1QT**PmhRM\xamZ;]+i+#J[4PT QK!kcw@.eW~!" ᎇ\;Ⱙ=SD&FgA`6]\cw-Q! fi,.:ٟmrGCaN+x(h[O'9h ZGE*/!J*&mǢ4WAi -:)*3LhHL,pt{Y/qb(vr^d:y;] KQ^b|Xh][ "/>ˮejBA" u - :b:cU6يy^f+(LGSk'T*@?i> -0'2Vkɧ緭'0'緭'im뉔ImiQ'$_WxK2 ,,0 X;ٴ2 y'{m CX=~TB" (c7~C9QYD.h 車HOz\ZECC@TX/n¤Ѵ+~.\aZ=mXF{MSvREqIC*KhK"dbB|-]N^#iN^Kٱ&ۚ -J2pJ! 23bⅲ/tS}/矵42uT'XKjjл] YbEXt\ے@MyKt#=WcۮLv׌aJ9B^QS3uzk/$W`EzZi!Z_B2{8hL5~f["؜4f~ 42{4X[Δ3悲yFc 'hK 2# jGf|9+}/?Ef/75@s /8h~/?VC6C]> 糀'| 4X[:OP 60_\:u1.2mş]Ub_.غ|'𚱥]fT 6^`rmm~q6"}{'RP;6È])2E|'iq%Shk1_=oܖ> `hoIվpf ,|Y gl9qH5%aVUY؉>l`jB͒Y",DBSNJ-2vJl --I"[Y mLn]>CIn4*;T"}U_).iGBzWv9Q.ӈ/ *T#L -'>ÙIx~6aه-ķkJgR1U- CuNn*ak_KbV7uT[dp?<-VIU9Q fB=zM_WtYXv Sg?_ 1ftBՈ̭T_[iv8+YRs8QY؏"dvkE__!ԮbW)+E-e MY>m ^ǸE!!8+T!KFi!- 3t˹af:YBt'F-M3AQ;gIWuժY5cM-g|a(h>yJ:I<`ג-SjY/ K q*Xt 7$2&ݓ@G{giAŒŶ -Jě9:<.@2$u$A' ?D&&K-0v0V+FCIC!ifaY/_^UP$Cw 78ǩBշ+=r7X"ˮ) r9M,jC_ƌ!^ Po%@MP f]P(CIoN" ͡@j[hNЭ'xŨt~_S - FB%t%˚лpFьPxd~d3mX2-?:Y. k7*\Qsf%kr(V6 OR׃_*=_Qftۭʍi2I!Mujh& 110sVJA؜g_eB[ЊIXVZXTcSj@Q Q({IDM3g r;|߾ȍ1_ƈ;j'墾OR?o(}| g$;w|\2m"&&vyOn[v]ٹ8V^ AF5A`(1!g띧zrC\/~;"]JSHJoYkiAsPy#t|y,>s?kV[k.5skUמ[ݽ̀',Hvm?FT=3(,\CKҴ1mbȦb/. .w.b]3'XfD[jXZKZvwϒ&swzڿY5 4w jz߲IȣXKuG21Q;ą9UJzq -K+ EXzaE`tɡx _B$E 7GoZW{؄JD+HGn-B$ -,DE3sf;t~]WԶIV -^{jnC5JN2!"I -S _Ei7p Xy! KBq4 äqQ6:̟Fdr_aҠl q4m& ;hNVp.33s E2s :%1+8'f891sQ Y 𕘝OǸ0ʔRYb+dvdpm\TJ-=a[fyWbd(p%y^8۫=kgô[m+*ynEVL钔2-jAk lY(^'7h7x߿q$bfJab`|C$*P3pBP@~;]yR1; -dyӌ M08>%>_jl[P"_̯[G#,W*IӁ; -&`jzɺ] mD3q-{kް'L7,_dunF 3><G)Bڪj·w $o$Y)3|J/݆}K26[ؿ|Ո%R-QV*eńjnww -HҤtV7)LrAk VZ|u=V,dE> ӁpH2ݳ&0w 9f&F! -AJW.rрtTB",gcM^d^Rk[IͥWбV_7 \JZl RAzhoj{=a*_|ȯXZYJ`?,xzCDu7%F .̤5~q> `Mײ G)2-QrCo _N -y< =Bv\Ez!!zWLD6VVT ]-f|+)j0{F?N"'cǢcPN"Xʼnd(}!6`~ĭfٲx=?fQow37;Ytv =}. -ݝ=RbZwZg/.hQ} -&c164Jj  HHx ,2>e{Yw<2´?A FB!_Z' ҂駐ֶ?bq/V.II',h W[袔?/_Q\V7ℇ#h^2zt%gϐ|Ac#JCAj$ -16KCRQOdi>R}ӺˀMa\V,R}HMGn5dLJf<.pfL38}>~.f顬UTi?Ĝ#0o!EAe-Shrz@I6Tr/bVM.'4:(iQ/!U3-zyt B^GqRJ64 B>YhvJI] e@mJƙwm]0ܽ뻨BI#^)s HAtPm$q.r]( )1?(.3NFq4P1DI0m& ̕VfH43|I(pAq4. -a M|MIf.KcVp.ls>K|N ǎMGLu2h:2fB/.^p>'GkW-е.,Vf7;/<Rj{ +-h6yE[]jXSZ—|(:G0uA?Kqdl@hXha$r{tm0-Wa]@0AF!,GBe^ Y^\OYOXHр !1f,j]]9F~ 'WYxmxU7Uiʵ7CjUrLJ dda?wN bZ)nxTd*y &3nPbN١Tx 8\}yP1JY2EiՔ*ե#BFc[oo>OAy>?qe,RS&i-nFT'頝s u,W5`~<@.h٤=u:x ɢ+ҵBݣ)BTiH}1VirqɐʮPibIB=ΕaT\X"s*3 cvaMd"h XHոHzav -F: -ɤ dt,i/.#] {9@0Nln˟ kUc< e)D a(܄7rH&+Z^paɾ@fai0q9R^E03t0F°vЎy`!iff$_ -Mo3˙'q. a-BwYݣ -vU{z zbf/D "?VQ-*~#2்,ϮdvZd秐gaK з rLBfW,O&3ӋW20$3vr$2gtd tdf%o\&.I/w{\`in?+A >j]q>jd5r:C=ܜ_'j(X6p[p)B*8w~dU+Ш'OveZMr\3;^*c@9kxK3I]Oc<Zߋt(SF*M+^bQI&w)G{poRB$Z%IW0 LGvt!:]1 J AUV1I~ -Ue,_[uqqf{c -BxZUG70-1QxxEgOu/=fd΀S] q3^H{h :7ڌ#FF2\eֳjp[X-K<J).IeyK~% ռ@8Co((RH@y(mc_3] 4aA䡥AQ*,OQ¤!f'C>z=%!ִL -p{"7RGT L%DS_q -&V,hK ΅bm @Xus\ .̘-hᗯ`<kƞ(C)U/$hM\LBYBKIʙ,b_"fhRttq=1bs#v܋gA< 3q| S>HjnȽ %Q>(}Ȇ.I@72`0c@Kz Xta6jH7C\dnaB$ -u215m5l g|x$cKjy5G>OK^% lS["3\bQvT¬aN-fGerqE+;o_ϡmp XuTqT);/>g7=CZ?mHB@He;D$n[bRy* ~ [E B%%Bs@ D;^ߑΜ7>Gʫt;#l fHb"L=$,םLH|;r0WO\x^X증kA5!LO,"+3("bUK+~LT̍o\ .7._!,H9Jfdstb뛧%10kzdp'6R? ">671=l1ϖ8D4 >Y`zj3Kn_>l\Z\bOJ -s8H ¬Ra˨Dy&-dg|3<XBHB)8|1U!ݥMB5ӼWC^P%>_"5%NF-Y* l  Cb:҆]'SsB=U7=7?~d_JbW~"PrNjIo˭5m8v`n[,W[ i>eh| kOSyED;^h]˩j_;#1p^ho 7E*NQt2+^֋9ɑ(AgJp/BmcB -ԝ(ŐJSq]IؿܑcS߿7wD̩DN:0M_#V7<9}Y~a>4?Ugo߰U fʠ&hU8_nFGu Pv~c\F>*C4;@4A9G -kQtLnVRU~4o?D9fm4Sc!~F8@# v9; /frnf&LnP10^̍yns!o+NW'kH*ǭҭ8^W8p!cA}?_Cio,o<?RkΞwJh.|&9gzup\bF)/O*<5T<NAX.~ᢼur/}<؈UWeɊo:CY,zp^#Ts MXkѹ%=k}I;@Ε| 5@~0:O\'.x!^-T'Zkc#Ԯr2wtjg펞 GT "H gģ@H}4c?f,y7X!4D` \,[z2S,z.g><ʞvqK/3Bt:yыƤJ=zA ':on(zEy Y`Ez^n!':|lEad`|h,/eŢ9öZBѠt }ޯ-f&|i1g3_\`+,f7.ei\-"g+ZTUR.n΋I %z$u׼_0bTkÒL+/ .2-L{D>:ɔN6QI'jA>{7GMsh+_&,$99uC) ^C"˗"!7HbDz4?}>#aŔ!Ecw1T%^>\CpΈdT"3"$22S16M@'(JCʧ5ڥ+ {/ +99@4ڴ(aYeX;ΦpԉgR[ kjaLXwK|+M=CWvscE# .Vqt40}{bP),AB,9)|\l {3W!d.bɾp2z2]NT x(T7Q-(75fs3sfU?_w,.{ЉeS_Q:^f;ϝZق{ɶxM6%Df|U:Z5U(C܈-B꫿yK1Ҏ@ivxBDs8 :J..5US-w|FRl\|KfMt?Z=zȇDh̖DZQMMgO -E+o& / 2!c%m'Sғe _3R -&50W^ZxQ [wݳ hWtEdGrOq]' .#Z'_tg+r1IxZbOP4mM Vf&P+۰T&FfB8BQŘ͞M)Ajeh9F=ԲOCKr#x'{ bJ}1>5NbIxt^CApr -v"acۍYiT24 ,_!-Yn'kxY t|&=lXѤK? ҷ._Nz<X$0ldtJ98I9mFT_s @$!9PtOM·b +,[*C,> D$`gqᢁKd[K>mdrN_d 19K2DJ"@f#3c.GfnA61_PW0 endstream endobj 192 0 obj <>stream -HWrJ>BB6hc̀Y F*}{&&/ -Q%*3<'WV)-hmJF-n+*Oں=7xBD +뛛49\0+oQeE3*/Ɗ }Z ކJ(1Xa I.mi#4q@;yVr +o؅͙XGK5LU [֋8y! -#A8H+ޛ^ dWEl:_X(Fs%Mt17`尩ۜ!1I~x5$d5ͨS""xKpe/VΠ-tet0rQޕX1:zD`KRFȭ*M 5 r xvv:J=h(j0|5N<;7B0ز1Nw.rhWPϨZR* ?7eK+$ZDD.y_gUFיݵlk5!gAQnaJs{qN3/%3kZxzL6dRo&5/Tإ6~\[7 vKF|#;yҳCHg*nQ:BdS9>.ɰ2%c-.v{w8ϫZ[`(DM{C͉es-$n SV\fX*3q{W8EȶWGq]pȴu1|l}ъ8~bԱC bXАz WeO|eds;_fX4I^|N -[Z?@S\;xEӇ5ׇ -HЩY bH_k鰿t# -5Y#މc9r#՘6bɄEU*/"^x44 К9R,u1 G1l%CnI5fM"a~| &Rs (q -4TyIZ)[‚|~epݞeDcΩcBF_|)_3 utll']!Bdճyʇc4ԓ8Nru%!t'۲*^MxP$tzhJ>krчV' ;:}=zd }2$bX3DZ&@;>:gȍrA - 0PK&`~>cLEHK{nK;VDW2ԆVApvK+#%p՘z}aof>w^tw> 7G6zMz'>%m+̍pTfp̉c:-aczB*Q\H*sן}Ȥx*dzYOìŽ|X \yy)o)2G yg^rB~fowGv}⟞{S.*ŨEX?feXcq*~ FsJ=]qUNR/9Lm!=Vp_͕3Mj="/ ,J(i!mͧٶ3LXDZ^!27%S6d&> lf -0NyfXw{.o.1%7M&|gd_^@^+zf1 DξY̠6W1S̼yL ڇQ<G:̆Qj×]}]OY@lº_rcr^S{,WwjZb2jHl! , OJ =֔;ߑK -~>2$\1{/u=AVV%T]ñjx=)!y;r̰Ub,b꿜9ThQˏd#8$F 9Ǥ5u=,D4c )`,M\Z L᥹-ڒLTP"MD4>,i*8ĩ/4}X9EHH!,_%Q\/ -:H1n. -{gR,٥`̒NlZ"Eܥ+9*A!ګXK4;(t &߂ J4 dc,'F+OJ%)C;+M"@ JD'0.v̦{8Vfb=3XT\:ȅD3!.gDVA:#9|?FIoUKܢrb uen.f{<ժ6BPokooAT 01 #z!\_͵HbЏ{dlE mxx#>8*;.P61zVc$ퟰqɈnA=C(9rd;j[h^nssnMB P* D'5p|Ph.,:Q}əsK\a2sLV%R}v-CȩŘ{Ԟq3J/2&Wt%xNV }{;*oӘHvt`gCHE%=VbC[Fp3E(@5# Bj\>fv:ܰ]#[n ?,[ʁbN%Ji& 7'z,n|7TyFpxCg/)@c$hL -nK Q3ӎ@Bzz!xS#c)zYwԎ-O#[o^p6OA4]GQA:n&Dy -$%p7.z=|͋p:Jڊ`q>y^c?~sߪ[yrxX} %-z/uiACNB*Mcյa)p̫\L:&zA-F}LNAfgMN|L31[<_P,i#Bx}2e~7hz^ le 4Q~?uV|Ƙݱ $9L)*RHY)wNS_/xo]1 shs@f;+-Sԗ$=vU*8T`!yc_Z\XY.Rȑ&M^lhh|$[;ڳkx}n`I%F - ^Hkt[A*>//Zk -zsTt=3uRs$U~Q1y'%DG`EO@5ҿQ+CP MEhp-x겛Kkjlww'z:g1©t fB\G`r'SbVE>jEԷnn+.PQ]fgǮYqlm -ur۵54Qh[tf"=e.ZV1[z_<ùٷi.J􎋅isc&Vٺw'iϲ4vm0Y`%^R7l9sz!|c|(R\"4CE:vMlFMxEvayrK[2F`/E=5а*"k>ab=jOCϸ ^+4/tb4>bvP&3c waVI=Lf31 R{YW" e2}b0}`fϟ&fcDl f23D`f3m,f`,Aa9YLNY7/_ A1V[kgpl=iw wAk?Dk`@b/]h9vJ -e૭hh ̶73V*B~e9Y7,J1XmAn*JWA :fempˇ 4oPQQ( P$(bHz1uq+(\ϳ8bq` Ԏ u^QC7Pw|uu:Nci#i,$x]4**^{y~!XwKn}$ݛ`PM -"KUj}<+&_ᓲBs5y]놛46 ΋n 0hӇ+m~$*_*_Գ`JI*)2@rHx));jD=9.Mt J`9qTP{_9(zV(lI%Wr.CbjZsx/EtD>v57,K) ^iK_znP XI5g,cGԣe"'cG@[{Xؒ+#G}Ԑ҇1A}S-Hj^-!M9ZHosG|̼[ -Y8ܨndjr\:  ,lt'35! -Az$* * z)(& x:HxhCtMHѿ7S@wgunxX%W#׹9ԕGs,sdK:j;`ے;n;`+Ǯs,sc׹9c׹7˜r%'9N`ư%rYRU0R&*Pœa PԶ&|lq}xf2M9< dqLUAC&Qwnǚ0+r -i l4EֻVŤXbvEǤы8:B ~\b -1bFf1so9(l3Tc g6x/e!MPm6ir5W/9DR7n$2~Z5yjA0.=+V< dʑ`i9+۽&$Ѿd((䥁uA!:ÍOp\`y =PE{keYdNe$, -o](-ʍ]P -F4hM޾{NF|pP]kdr 7@5{e@(SY!@BqqBXX)5<#H$z4zś}ݹ$_dS5DgHbG~Soֳk?/ad-[Y_\uI -`ШN6n@V%Yw:}uDGa*PVPt)ǭbyŠ6!ĎHRJf28ͻ]PSlLA 7%ql)=0Z|* z a)z8/o>zw80:30z4 ;``qknΊ -4$TU -~SGAU7K܃#?A +| %Mru, P?YK+NO`\cYj+ж#CyƺNldL^\U|օ)j0Zhs -̈-`y{ID%}E^gVrrd²z%&J61/"⨉%SCW; -^rV˗C,KJG%n%K<,c_C)AYRa˯r֡K_̋g(A7 ZWνMxtAЊrϺK; Ia'^-3*S$|A1!9(l1ߩLdfx,<<>1U}z#IXwcNI5ZMڸX5u:(2icʶRWb Y#2( -e[A3K4յvUt4\ZC=:{P6f|1!.G',$` bXT2i;l|W -GdWRfo'[Hb !GvG׀ -'+g?a(-}p ,BNF"(NvI Z\M~3 <` CU$ǝ~.OIk -hǐf#>C -",P Z=}eT2<&3a!J:Lx|?P":/ɠ3'^29xv2o\~g> p[ZCpnpّA)BDoo8u֌@]i{ -!<͉K4SaZEcz[T*]t@(mv!8ѫdρ@QA8iS $̏ӏPj<"kM-u0G%& E J#LL O5o:]Rigatv hVA%)'vv7o+Wcaph? !m9OdbūW ?&{riU"Mlvw^-?@ݤ%J5`#'H~oVmA  I -p6uN8 Bb0(@H~߁-x@ -eNP|ARf_ H" TI^T>.֎C݉tF9-e0/TY&3y?%Q_?Zob{!/6U9@/aHYTIMP>rKXe -9H>p pR m!ݘ˩ W+K8>;U~.OUH=U.OU%q:UeY,7t֩*G=Ubto\J\N%߸0hKp,FJ&ml|W -9g͆N`?\Cz;.).(h68-Hd|q?iKmXguzE3[ji4_LkimLیyiegSh|(M$ǝ>(<%U:{ pЩ o` ҊX8RBDI ^R&x KM|3DWO-_?4Y}?]%ʉ/H8c?BnU51| n?I?x1XFvdi3f 4B3 Zˢ]j-=:{P6fNxr CP ݔR=i\ 2ШT0Ot1᳴x pAt1Lg7.%.G?d-m/㝓^;'#/㝓dO?3d|1xx\m2;2fޑpwdgWdądYC1N@*-U]=8+ J -@^ #ގ bD,>lrO6W>u/uzE,>cJDtId4Z-js5 -m<Dz|Pt4!d_$)uґ[LӮ.~xq~"H."˖l2;&Q -TIveUdHV}>$=Q%_#xbH~8A<ŦvӇ h$g_\yjbKDؿv@ED1 N1$1fИ87|tVW"z)ƴQG%͵(ķp 7xv+WQ;荖f3 -T 8=Oia%F3P*C&-4X^ -  -9(Ș;P(@:s<dz_BAF|YwnAs].s8&/|WmQUΖgX*%9Ja Zփ -A0ZɌۻ࡝-zUg^Wyl^l35#SzCM$D ,D0F_k ;b-9Cbb<8!*9 GY$cӀ̹bc~I#]ӱԏ 9 } 4-c9_i9 -̬WYʜ $7HKyzg+*"BZÅkuAd@.듦lyXj"H'=ǶWFͥWao6kx!tAϡ] -IY/Ҋ@s0ei@.0LRr>vg^eJJ G)'xP{?5΢ކG.KV#2MIb눕kr;,Xbzd DoLF)oDs`2p I5/84NOj40&naR1g+Hf>fj f桱?Kr&[O6eNxhg9&㡝]t ed$!.ɐOFcCCL8AØ95V^|7d ]O]Z lCm6zTL+)P!_*j5թd"56]ʤXi<8'`L8dIN{5.Ϧc*Gz$)Hpt;_-.ħ8R2W(Xk,(\y+ZC<=}U,o'(+ 㫗J*ަ -XRGpzK{aVyޒ Rwry9LV܍ȋOʈ6eu*|Hisɹ>!wY=;!O6!˾x;%>u=(Xߡ~CMeeUpAK>0 -EFbI_F~i E2/J@A+V(iǶ-6oXC/W<4)A&-X&J^jо\(țˆyg҈&B:ų |5*=4N+;1(.D-whu,P%er"5[NްĽ3P铬)k<9:F[ePߦjv>SD|y\wQ.;TZý24qRm1)k : dlڭ^R`zˎJ$ )޾*NYg^!6_ cؠn=3kѬ1&FevCɬAGRGR5+Al8 ض埕Wumć&.|LTЇ3鶶ԇڄ-[,K݇PN"~irÿ擸+oiXͲ8*or݀E:㗣\ۄD{q`=lH?a7b3^!c< -%ylTV`Zİ[CQ@rC䙇hXT>7lR&UבqYq&B?ܕUsl dl)$'nkF:i"nng%|<<Drx# -9gL.܀z6T_숉*'٦m WlQ 9|} cN> -= ~-e. -/^n'c^-fn[tkL_k]:,JayylJb͹_M݆lrpqn¨+z(u;BP-uey ZǦ.,cK-Јi44AeX F K1J -Pf:FYTMlUV I8@*R"ԌDQ BneՁ9Ys .I8ٟ]ztS- )l[=v~5q%ȥF?tAb:0W_v|n0ҫM^Snd[`n >rpaЌvLڭƾGny[ e0(vt7ͷ;6z#ѐb'ly,^c@8ڱĶzd`QYS=FHԜ c] Be<Be{aH/..Ⲹ?AQ36'aŻJҙx' '[9<3X殣<GЋjG)k`2D[JdOB@q-{l%=*ި%e ]v\`6 -4 -mfGݾfc;c2S~גɵ$!ɂǑeUV4l"4HFiC61Ef~.JLQJM0!qT{Ǩ+?y,RXfgma^;#IcЙdfd,&髮PhBf0.ǐ.E2:s _\3.Mq|'ШIWy#7v ݸ]@d\=h@3Cz6=McWa2x+M 7PzIS%xʱɌ<#刟KBjΦG+W s/tZf2- ͪfe D MNJaRi,Tc -gXr`9du}Գ"g5)N5y)\UvLz eW条ϒx^ժِUM% ^ -fX/z(qEq)xIܕb_#iӟ&]wC9tٳxjw),6MB?Ur[4k&Ssw;/Wu9iz#2ŗaoVYN\TQ}&&q" ZH&R.#W]--K"qx3f@h;`yڋ)I B\%(:gDb|tݚfD[nȂ8/넏I_8ٟ]ztS- )l[=v~5q%دā !*B* (*7P 3 aw*xB2ӧ97;$㈀&U}7A\}3G[-"7F&ժmi/c:se`kH Z^+\UwWP{?A.xܚaJR2#Z hӀ0z9*b%FV [Sr| M^@ 9>jЎ|;\MqYM -6{XG<+Y=dr)} v(nihf_J:ZdN43 Rb1Ve~A@\?#A0vpc畅j,ߍj״NLa@9E} $_i|ۮ3XNUgv;qBB ÄŻ^n"wr?PaA˚hH˴^O~p/ɌJcIf4ɘ̰K[Ė8" ĐP1"37ĥ7&019` p9L3y yCϴ@F}WN 6$(t}td$}1O^Cz(ִ5 ԩ7PSSiKiz -Pa֫&j~ʁz!㯚90c.ڢ;#IWTV7eN3JP&qTwPƚv(e6͙Xx{hà㓤RHnϭDZPu{(^B)ÓmtTadx5 m<`%;=~198 %vPɏ5,@|AK5R=9 :ޝɭ endstream endobj 193 0 obj <>stream -HWvj}AfD11&8;Y}~(@ծ5ᗈZCkOISUߧHa^Uދ**7i.}8\`>ҰfCzsIH`U )At3*G|[i#6E޾ѥ`*_,Q`kDH ](L -qLUZ ^gT!GuG.}8o%,M>'iݘ&0F=× -Ek"% -*-.0UQȏSؐc=oZ뇙$ˁfv?9\ M TaGGoO1J½VޮlB^ -՗ ܛ`@?Vչ -4a -&"i`$69bE˗ka2ùLTp#dPfRW2z{)m}yp훒Ynt"fQUΎvJvDq)2BuqFkfo:"Ԅ|q~$S{1-@jw/)8h -sOK3ķ -Ay Cbs`Ӈ$6㏬v_!@fB#ODL;qGxAY sh`>MwS[kδOXh%0饃#f+#1D/_ƍe%g)i0Ur-/HԨy16}xu[Tz;xq+`b@-5)i2{!)/-}î¹[ZZP~]U7Q -\'yp"V$N_Du -pimZ;x y~L,S٤+Ҳ3Z]94x47> c&<0*臇|*O!& -&oOd bs1R̯\|Ώ 'v#1WlسCDS=`<i37n206s&6s&57/)/:_ Wm<~Ow♍v -sE;e[Pޤܧ86KD5waWa`ntƖ?ZP~/7TDp"D vo;pimZwx"fg]Pᛗ?Eތo̗e0dܸ̍m37n2>i3i2$xAis㤁CisN8i P>iP$ rn4wpvIZγ?&7/ + -*iNZxX|yq!9ԁ-v_JJa,8\t'2z)7lZIKXme@ňL>{2J%5G᎓\EL#`qEMxl׵}-p9Η?@ab -2EVFAjVD By(u/6š89hH !8c ?(mǸghK9s rú*RܑBGcW 0h -b'"d-9 ]Vpƥ2pU߸瀐KCd_u"vIR*ZioU&X חR@`H+Y-&iWGbm] + u]qدĕ%|B#Y`0iȌMv6&Dg|Yküvծ]ÝZ@$Ɠ!iRȌk'o㌴Yw2_i*u%uUr6xN:=@%ߜG-fkBfǧ\ԭ<2~?$!U LD-}jz|:<S>:0h5&XTbYH,7r:Vh:u bC)IC?8I-B8bax,fuԪr!xXfPBL95usf-dlL933!!pSЗֲK|&t>ᯗdsKpshұ};싵;jLPk`QEZncW-mLJA-Z\f0k/?yydte- #/7J]Y*+؉Q'wzreLW,ћWDsΒ2LA.V}a{VP$uީJ"^i6;P eߪԆON5.IN KI]?b"a5hs E!-ZJK?h:T e_#}rDP+|;&PatyK2 c.UnPS8gVT.#CS·^d=WYp$396 4 _J+ٶsi- a o5NmqI&6Iw\,?/?Q4Whu;LRIZ>-m b,^l\'I޿;VT޸L+ם[~Cy{'fJ$8ILz -*d[XTş"\6k2֨rHo`]%5C\2B<3Xy}2CҔt$TpfrdS VWUqϾ;]Tw9q&&gbogb4wȼ3ayi?F|0z*JYOCD4 08 ;?Hwu{卬pPy#SW~?\~%.?\~%.,V ^t:7}$ki=JϑSbbN1pqV["pH۩C NӜ~yrzPzGv-_] Ps= Y -ٗ -0??.fWmG,,+CϗD:hws?Brގl J7&2~X7ƕ=]%26Ԅ"нӳh1.XbM -fDpN~ -@S8!ܱBP͆]:;52XHf &M͌ !FoÓs9ndIY#Ca4ܗ5|267etDC<ԡ4SIMRĐH J&y: hAb_Kt `~dd$`d4_5J6}NAY^>'CXL29/~d ?\KVfz}g7lH4X  le"6饻f]m'qႷ *ϩY$]??%\iIj -TMU'S5-d;;AFĘ]V Np+*Z5K?{&mT Z"Gp.Pd9SBtc=Ѧ1UIjV;3fNI%cܼ^F! yl lcgF!׬l4xtWT\g΢hW6PtwŽH 6+u+ -:BXUsWNEO$ƳRzW]HK&fdn_Aw0Zċ&rA.2D<[YR 1eؾWbFs!M0 :*FJB*@d$RGbgb oV"7\U9M]W9Tثs*{cNwW!F:t:7u5{G9rJtD429jK%XJwwp1 K:$~yrzPzJS X8(ft4Ca p5`8Ӏeïpb:7 !X/lz&JA ,#*ȶ2d+CVV˥ ?dIw>Et\=3 -˯_~).@j7=1zc\y|$@5է n*ҥH=ɫzZ. s2ieSN{'=^&8HCω/)Zu=_3mIiUGRj-4%>h00X^tzE^K<@׏U-=݋붃R}t*ns*/Z<¥(o惡!Y-S!w>IZH ]=dg63PJx<'^>'^ɼGd$DI*ӌ$L2X|H2txgelj3֖6O3}AY2p<,foaohf4} bjf3SfѴ} 2fj31C}̼(3Sff)306O~ѵglSMCe4w -M544 kh>iwM[ŮiԞiL645"oK&$VK.xukz++߹tKE GC$!Ga+ 0Wl0l]:x&j$-''5UDLFhKMP&5VN47NO@ #,\Jʙ&55Bw]Wf9SZ}{ҕAZ=ԱML|#J5Uz<9Om(M1^6tiɯ"5ܼ#ysC7e-' |>ɵ}C.ŕc2lUŠyR@q #}R?7d{l3ϨНf6W\9c L:}xݸ? }8 ǡF{:m[?o!̏nn>}`-qϙ>es ik!zQ6OΆe>X'\ɡpխfaf˧ܼs>m;Гx-;EP15GVo[‡¨r*u)qZ/;O|F.]Ag#K'!lRJ'⒇#ua?O.zp'w_ɛbY5iCVIC;+~) _rpH'e -_hHG) -_x_H6"~qqey Wf;'bF'.Vt҉q%sIzE=Aj7.{)ʼn|*2DN p,uwΛխV{8J+ύ6毪ۿ%ϙWU}As]Hj6zk\ɠ򲽠=@Į!`$D~58M"çZ]v.J/Z8Cl貌?HLXtK^EިĚXIS+z\I__3陚^լ{>T>2ɀsšvIrܢӌ__ԊR-А,4$0Xwlr^@Ghx&&_3hR&56~/տ3ThV?f7DR@/c^F^$d`1Q&3c؊%3GS#3N8\v4 $&9D)V!=̎b#By®mv1(bKKoYK&D0`zN`Tc1 !xw)-.? t7>,ď qғlOnzX?e| ^<$Zh?6z$ݭ6exNWBevF=ZiML#aI;LWisO -Ͱ qU[sRPNgE# I z %J@?P=u&Ѕ7K@&\)kx@&}ar0rWGro͌EXu -c4OP!ݲ<wzQzl^,ekum%Fulbb?0 |Ͽ@\_\~ .5 t=wOw)o'X=s-U7XnqIw=㚮Œ+,DS*J->u}A;/u%:"Kx$$isS6_E!8;Zx|8 '5~琫ѳ_ViVi̟HKr~2LMgsI|xp.J!Ɛ9Ek6| qHŌAI xLж^R?ϋ˃87-ve4:0TQL~G>NPo¬/ǎdXHKMmTo״b;2O%-$6S*[ ֙4^}L?d׻`mQsQ!3FfL,3d`1dv Pq̰G#B1;X3sp9f@ʕ4 N1=2u̔vfD%Rpf7ӛsf1ӛiOe?kyfz"<鉌<3=w1=%2&"7<3=w1=3=\LLOd.2P/.ĥqN-cY'=!vhmݴ7@)5 - "Չ|~g3.%ZbzH꙳J|DrZ)8eMtdSPٖ.\B<8@ Pدę%<A@("r d `{ {f$,~ukU?GFLwӧIm2gAü qKkȉĬWY4q }6dmjN$m.b_2B -/oe:gHIԡR؃ X<%1Z< ܶ89R~fF;`-$o9MXX~%0=gZ7f϶ǠZr2`^7j_fpGPkc(T;}pa&c_̢+}AU̧eC׈GYRYER*7` Ak /tf1!ΈtH@)Uĉ8{+% 㲯WV]E, z%y+E |dև#,SmsODLjJ w|hA-E0(A `?x`KjmQJR5ʺ]3Ջa -)! -5CS zuJdMY,#˧b)͢5D8* u aķxgyt&\umRg_=!ǖ+ -KrldOFDAz$`e(9҆`<,Ŭܐ+|8|Ac B$.I9ZT:{ 2C]̜e#3,cY>2sP,dT4:Kg?fu ۭ:ӫueLL\@|GF뜜Zb+yQGjoPhqN4J}܄"@;v9#/fT&NhްP hMSy|+ v.`qϧ;{ɴx]` 3CljOAe\9\C̠-.2sP'mf96P lE.g)b23JSfpQ٧P )3"X4xl -d%+)eE_?1. G5:ca侌>a0mIT^f+UxD#ҿ ̯.G"Kv(YV|MR|\|LN -l[_y_͌'ɹDEkȉH{VykU4 f҇͸bf -Q7h6%8"9@hR/oy'y>HSG'Px0+R{3fr.e<ʅat&aAK%JD0jr50Iν_~zl v#}&l\]5|>~YX %u҂^bxgPob',X FgՎxP@Ք9j&}Jz;۹,jY+':ŃLFk)Dzl;Ue( zgB'sB- Ʃw@D[I)1%z9(ŲGi H -Old^(C;iMBv -\NUI9u5X՛$µOziWyG@ -G^)> t|k.BjmA:LlCKCN̟}i!1{CI AҜsفo9> sb΁~Ex]ٔ !,$xfk0?Cvaʑr)`!\h6nQnG濐*c:ll nPB7J()l Fm&لsGYH#ݙ -.Aw'd j .ɛc6R`;1VaޣUq#a1._1MMgȠ` Vyщ6wwZn4#6ܲ'R+n -j%P$XoY%o;o$lnk?3Wnj!Dj^pʧ166Ck.ޱ6_46cYc3FYHFMyn8>W!Gv&Ѭ hzHOhL @G7 C*\{_hjl&PFⷠL5/iGԯ`z#I?8V1#W-: s mgT>iZ=*ᆥfL_gyGtYdl4 4saц8d.WIXT}B2 q9%[Q -" ͟H  -]6|qu cK6<<)zs`Y#)\m8i(϶~6:eEe_ÀbJ/ݤ \X3IiS 9C^3h2z3T-j~jSowc8X[~Aol]8}#WAQq i='̅IFc0\d.@3g2ȝ,v1<>z9L_ty9w=WXiY 2 73wp3Ѥs\!\Px<_}hl4. 6vd@pѐIѴ^>j rEcrE -7. \FQIW6GkQxcKQ`ڿ{?-kcy!OZDDT}9)RDʗڶKpOZZ\oT_"}n-P5/5?(ГO>PUI1 N1+]EH;+2-e/ ;W0@k{WdݮD9&qz'W>ަ~M$8Tk *BC!X~:#BO2Q 83`񪨇ۈ2ܳQd־8iBA-{2Q.XJM *j#T엳3Q>kdF|X^,K8|8 $*Y_z:!7`x|L: *+I -a5SzO>k;WH`Ǡ^GO9K=lbR1wu2+͸9'^?-[b>0.'9@am/Z;7Z4؆6h"u 53f רIH;,Ct7PF|t]0a<Gvj\˺>6))g)6뤅: 6%z~餌l_xEvBYdV*Z;vlS"YdM7v!QP7$[AB|w=#4 {w\!!C(!kB2:ɔ\5,k8Ǫn!'OEdZ'ۭa'>stream -Hks۸tIE!l9]mKcɩ"! `.l+^sjG#.7L[@,hjwYBI&hyf#nwh0{LD'e*>:'ޑ(cX) .D4!m>Hq<.s-lvi]4xmHπ5˳v*(`T<C-! ׵ pvqt;p ?iM4=,b$(yQ+znElym۷4ጆ1]U;`u 9Y[ ^C`Kt a$TH&qv$s%ʁDC f$Y JtEam EJqh.&10<V=|N9Ld]W,(iHbGm>݆ X]u nul!ws@KD0T<)4^PMs6aWAM(H`V.a5tm(qClcIx 'W/t ղk+¤N){+ +l 9鴒O װ򦾜ẗ́اJzVPI:&!G:@/55D|pZyj@c.;&R%aO DdFkd4֊09TrZ eiV#o| &!E?xFJKl {Jf6tM۴Æ)Ͱ>~An Xt5%w,}Vi0hʑ{A,W/|C ?$U{h8=rzKm{`tjMj6mm;m_/[ &K ~>p\{YhKm5?C)b7&:/PxUfC=vym۷t͘e7čNhj&"eRš1&f';L(Z&߷Vې  t&Id99B"%/΄mmdg\{x&YtIHOe&It|jH L)an4mt)1Km7_A0[;$"Ìhi [?Hdb4հ}:Ă:\)2ќ#*`qwUf Xԩ@} u5VL4BÂ73CNcW8Ȑ ԕI~^P&o,ӀsYVH{%"GZE7nPJ6@$.r ېś,j[&S1yT)գ%?9@r f^#/P&Sf`.qpz\D'U^ޒ^p_#N$]e h﨩W%T/ b&nVtŚvjz#\kbϗyycH7q:;~L2DY.o7cH1&y!_ 0e{з47 -ׇ+dXxl&O6Rv%ϐȒ ,Xt "?K0UwE1q#ѫRt\ D -PjQb -gXi -n@SFha7uPPq3U ;2Wu1߶i J3 `n՞[3l$$ 1-@ Bcuה> -~D_bRI姝}IZ<. yQM5GP -IX Ɓ=^NN y{/%t*Ѹ8@kdƗ%rJLL,5&_F@sixl m'9ګ_a2w"&v>L<ɬIF%%.&[f+1K0L` M^O!au`p/'I1yrֳkpA_g,^(*Z ]$k~!XwwČo -[|̜JqCpSbIǂ:ד2i4SKgqA @ `8a;yL0MN #6J;g#LC&"O91@`H350h6Rh,oK4BM0ersp7а}~윢l{ +Dmz'Cfn]k#ݪXt]`p*/nhMDpb.pȍ;)]YV{I%^[ŖZd$+L_BQ'xxC\;a.{~F`Ţ`]X% Wps.}:OC+aVVڃĆx%Iot ٶQOmv5Nґ#~qf!t3xӽK* JU1^zXuD̶2_;+1L'pdnOE1;ze}?u7Po:'d_w|GRL9/lwQ~zΔs?rї~['SY eXDhOJG|8:oV{8>:^2cGiA\}{bm*ܲ)x5@#,ޗJS$x_a>{r;xr"wiugǍ*w<.yʝMfih=3y>}tYKs Wor_)Rl-6d/SgP}u'l+E{ Jc&j,`%zg1&g_ȬY]=*&#3K/="ɑןM>g6;_WFȓ*L)@$,ms Z$ѷKjiORj=[:,iq(|=5mי櫢P3WH[c 怚1_Uuw,T<"j!Mh1N吪Hc>| Q.:?ݴ;d8\;9UsyP޸'U$P$,ѽnu:98q* DaÇD hj' X-ԥ,Tc#1ŎTHި0MynD(Ii//:;k7xzVvnx?hdfP/zI(7?i(t>A "QH~sM ֶYEJ \a}vU3M-PjYDP)>9y=Zh>@/qk^kw[AE}zξ|iPg@^C9)-O8(ƀdҁ*P 2曗VҾEPÎ;2>-g~l*~Ҵ&J!G ?sP9O3^}po. Ia>Tx}S73;(@oi-aXDN>HNgPzQ%S:RTPho&3dbR^h5~Ȗat@ϐwBFE9W\F,HuϮs%%*\EMa E!'.Aӕy{ /_UvZewЅ!'+ AEBjxcʳXjHRl0w#r(_lozcgpOb&Hg"QkB aoiU""P&TzBf`Ko_ouO/Z0k g`OzY3+.F,G=0Hnj4í1Nεuvۅ)*`~n-uF\^IU aRkNS`܎FCBllto!,<ID{#)LuileLJ ccNaocus-UϾ1%Ytm^0)VcR&gEh0m_ht>|[hco(mT4}nWkd,3S7I(?N:7 uD@?EP(5&6, L"ٖ[|BCvmx(*d%@ARM^{*6Wln;S\8wBV,'D!z϶}' [D!Ӯ -~_;jc7>41k%͟'$(wb1؉e(,&S Lhxbv]CP^wqGa:Ҋ; H0/Fi|aPRFe&%zhnLIOBUcMFт,LSMY|'VC!zVX|iaCOQ72,aH:͟O|2vx ۴'"nG@L0Y\ 4 M%Clocau<% .]Թ'Z͕E ꯆʙ׵eV+t^OХ~WD]ew$(ٕH)otkE/%K<^A]lP .N!8;:CxoFt~A SgXdm9eGn5'{qIA`'JՖlƉ`&j" C}[icrjWZRuؠkkbqgd.bԱes2IeF=}Ę!2[7R0d,<uWw\"[Q Ger]G6NYǀ]5[FsJλRNb+*$_:i 0KhNf5}R]&0PةK2J^n#} fX -d Ut2,2`ѷ]#O˕K?e*ظuC%k~'鿑c 4ا騵,66 ::eb,6u//VJxx.ò֮{?A꾱IT `s05j{e}v-2Yo[^.%<^-Đ24f l.W`E sʏ'P6T+^IR݊,52c,FtH{)JcM8@l;;iSgT3䵳J@: -[6_tج^ -2 mwf-WdYE\c{L[,#;[`[TW}4hk#:D/#xl2tvkƦ}0[n-:̭SlrASLuKMh5xfoy|ɢ̆nM}8%R6#9[O*;<$_CDLf^ 7 -]bl{{k5r{.o֎9N@liQ٩6wpZO 3 韩W 1׍݃Olg,K'~_Yz<{@O)6( u`y'Tڂ/G -VHF/]V]^{NrL7E`79w 0t"x"+3 zҍ$WAD{&r凓=Obz&ްEVءOjsҎnjRDJdKÒ6 Q5,EP;ɋ|]8w:|U.fݑb?Fւg7”(r -.6nև2n;8NbEݜ}: ?Z:~bOq w]nE.KnчcknU)rtX QѺm/ [^=2/N1 *jx󁝇IH/ VLN  za/m!2JWQ,*!p~8_lWR$檾4)6Ħߕi?w.AL=>v2/#3gd E':>6بd.aTuEe3dif1#3x¡&`*>So9߉~|/c_m#8JN?'BUނ؝DCA;z+ˈtB,2ČY҅z1lM dbvm]4wbdc.Ik M/ٞxH/vW :@q;X=v ? x m皪L{̊Y+=r x/o\[wzdDReW@}s6WL|7*~'Z/ܞ33ꛍT r/-3X~0q-%u{5>/y^ۣ01~/-%f]v/.ǧcj7+LR}f*@6=zݭtmiέ񷖚4Pu-n_[aw}vC 3i P߹T [X]sNG'mZn)Ts.ugU aUW[OS5=<@Px̆wș 4nEMVCi؎~.(_16.J0wE,d D>$p #R4o g:R}Jϩ : R I"[ȃ?[`ȷCj4yrv4L -4 Y ׯVD=BBaÎ\}dR4H-0P" -&!?\@>AЍ@,_!ܗx%^'qGS43 2Sk!jgԾ˩} (Â>SC&\ Q~Vяl]J5:ZIVUY:IռLgKl -16Ǜj,TU#OI9$Xqk*toM~nU1\st qOjȞ% .72pœmc,K7_VgՒPJ6hh/B1V|Я|*4!3B1?O -*VO"y3hlF1^5ژ auX2 4bwp'mLPfSkPRPy1Ecj^lHvf -4-hyA Y[u!P -z7oABiSkuLy$8BIf2sX%ڷ1YgDZbEBho~ Pb0BTjcqQM#(}ߕMt؝5QikZ>mhduXNtwݺB@$Z)qA-h+Q"!+ғtu%h ~`mW)ċ@Sj{tЋԮ!J;Shg] n~uTBi ]]7TB{ -rIG;tKOZz݆Я@>qpM :ch &uP@Q365m0)KԱ,b *WY.!{^<HwQ[iHhSrݿj'wfE A K0^emzh4t.3r2}*L+4렶NsMxRu}ai)CwOJy +4r/oN -aF.^7ޒ?6*}ɖ(ZKYdOhՙI\Y͖櫫p̥GثݍHt\iuUb1Aa^g|av #b=GaH[\: b򯽻n.dJ_,;I]\l>X,94&'~b)ҩ:.]3QX Iat5JHuOUgUe̚rm0\;1?伀7 J3+P l l`wٲ|]z.`A5ȴ4ySatvƓw)uIF8L/ʸ̱IAA5HL(z&ЈtіKj)4'ڇOb]Eeymdzya r:*tSuS\ o=` %<_P3h&Ј]f&*w#b2;@AcB݅9TH䐥ǛjyA|?yݲҪh= kNK/:~'l2hI6 ~>Y(`wJ)R 5AXlBB%&l[^wpjCaVɽܺme%[f׏q|p`aX FThpo$ *ot(͑!g?֫}+m?AB @9@ -bEPkr}o&-?Y]-ݳoˆ'8QЉQ쇯Մa7̆ |TXsUH~xS"#|_D 5?8 LjYl`BꓭA$ݬ4ɿֳ&,zq%RQ}e6H݄q˔{RY^]7tnf%| }C&n"*#V-vYJM yl9ʬ\2:q{eǍs ? OA0D<?}[_K_(|cx* j t-aMsJ/jWmۡ$ ,bQ5qɧNJƼg.'Zʘ8&D@ek& h8Н}.\KvE>eσycrH CD?1TI6Y:FDŖ;0 1HyO% -?1ݓtY)삔I-"4f#4tTw #؆}?_^vH'[ex`9v^R`SvL=] -v\lY-<\/Lg_%;.Ԇ/D Zg-OEؽ) -ejÝ|Lw`6q,cw'MO>)B tTp%B [poYdg$ < - -].fDc Te;މa1_dkO@Z&5U)Q @r#8L"ԧU?\j:hWxy`!_P0'e~:)-8YEe%q2[<@\mo1k՞yH&ɠmF'NG-VJĨHrm:xn ^HFa^i*VOGerUɸY[ j{t0E/ &aLco`ܚ>1#1>*()vP{jQ\KҬt.hW1>@Z>T*lX2;mVVA',t<^VSE YO܎T.y4,b#@ӻC $ 4e;mrTVI_;&$aANulU;M,wGs.ZWT,%Q`$E"ŋ^VE= |vzITDMGYT@~H`~]ܟh)c~gq2  ܱE'ʻV7LF|  $ 6C1T sJiy<P7{IӐ픆0}00d4Ҏqf4)aqg4a4U'Ώ[w2d/ 7nbwbS٥PL p)Jg.$|?ZdkL aFf$ BP\, >LU}<>`qlkO" bm`6 9a8KÐʧ/5jIZH 厽F{'4"cBj8/ÇS{05W1EU 98ZqPOBIA@ ZhUsԐSnj% -J?A^se/^ffzDa<:;Jے,nMtl[h{Xr $M̥DVMޛȱS2Jò&.K-&K+oC zV%ɒro2go$:)-QpAT2tqyu͘tHM=(]M.  O,Iϫvn"VN2גY(PN^VwX)Q7‡\p7Qlnuzxl$[nW7igckC#h5黟g=SRP* *.:B=Kʌ>bM;O_߶tTS@HU)՟Fz店|oS]ʣ_~rByt4dY_J?jD祐*oQa{?ZR=G}U.Q y˛$'էyϢ 4gYf_odVhxԈ}> -Ҹ>Rjl?tgG~ GMEFj&:׌'w}V #T?ߥK;4fQѹ+U*A+ף(]8xml`ے[mE+ux$P}b`)*MIaEbeM?ҧ%/lcD+=P}ܶ \Ir>EB 1OB\0z)YWd >ELCI6K zWk|{8^0Ǖ5:5AL\WvluZM WGgT_j҃q_) -x94I2F'N?A"4*ɮki]/lA_{%%&PƔY1=xc!Mn\ћ]Fv5/Lg,=4cfJɾ'x\$Ou^XLJcyy4 ܆OEqfՌ~";ÍBnG9yy9U qƖdwdHقGG | NB B -粼:5H)'ثc:1Z"U֐okpƑ]ed*)!lapQ Uapma-&JVk|rBTRPAT(Z#(Sk.ES(1_v&\$GߛDvXg'ȌYƷT.9\<%a) ^-tW wǏEpZPEtS ygwݧJWa%Ot, t1hj8q׷$Lr~͞T'a8J͕'td挣+۫oh-{ۨs{iPt2et( -V$.;yqD$qmnc1 N܍&\iGߛD -LO_L_3Y)!BhHI4mToNKJuɁA)6Jn؋+cr;t>cxؓ+ MtCW+K(Ht1|4md9Yz\r(T^ 5{VG5s.vJޫSĪI8:C]Bm(Xm&x%_GXQz@q{lN:(;TC]~+>(VSOE>_qd~-E;S/vq*waЈZ"9ܝf>aY+&[3}^*eo -ϓÛaDUäaGrg] vXo߯ࠥ-4šs k9"7)-]}AϫWO󂚱E.GoRT1&lz@ȠF9wN݅/g/,{цY6Q |a&'ipE$ɠwoUNLU'UxStiF|e̢ endstream endobj 195 0 obj <>stream -HWv}#" 8D)ƨh8D3iqx{ -PI:og?:>])brCdųtQr9{LQdsOñ -;F: 6s =̐Jo1$yN"|it$JN5+Z&ZJ뵒*ӲM52 z:+#sKj}agZMF)VÌ3c%ݐ6,(%h:ѢfYF}؊< -V)F#wVT.#z73g6.c c;͍/ NuE}oE=%2x+J+d'YC qVH+?b@+ύ_SRCXSd=6&^vChaxHj;bH( ٣vhp%;Prkr$/&Ӱٷz6-RsQ@99G j6 GxHVW\WkH_U}}ܣaK~4IOIF_a}9;؏8NK ڕj?q=ԓ aXmjoj R$ [1jgS]q!S,Gv -w* 6q%F^qqqq).Ϟf4uOPM2j[قtV0{xL奅#@ gxz1Ѧ; GҖε`okBlU//GYxnr;lB4u4Xq`-2mao3jojuX"x5k0/xg /xUw# )sâ(JR)BW=@ۋЬ8OE@OkԆm[m?x&}W Jm%A"q G{{{ = #(0N䠁Fo,(=L CTK6FM¤󳉔cѢEbia:=dRej_z*b ǜmk|bD4h8ư @)Å "Iב ䷴%$ k$#-?"G2%K5 -_I?Y`;k]I5ҩ5+Z&Zp͕k%71UejdtVGF=ԛcdg:@"J {ɺfY戽 -VRKn:?H_;r,~^ / 25oȋz$o }g<ێL֬QLԊ8tb836Ā2!YWSZ YDOM(SݏChay$7 "abhIf_K߸| ;)x3.N8Ws 1!M/7^G"aC=јoұd|"Dz>ڙΜ(țpʼna"{=yD|٥*>Zћ\mKAjK)#&N{u2S%0v'Ϸxc N+XuZrB>GbN3*"htI?kP>p> g?곆;*A[0p( $U;2Ft7;_4C>&2__'`&#R$׉a5P|5\}θ,3ʉDpbMHGEx_Q6 cm`0-A]%1ˮTt^+ ܆ z:Ρ`2)Q0Y( -'E-*i)ߕJzt?2YU0>(x h%P_;"MkyteRTϹ0#G]Vyȕ#h:~+t?y3s@4>ouH !}Ug9{L␉dR`lA;]&?%g2D˟P&Kȟx܋ $ثGoܩÙ|@ ȭm䒼[=IKEe~vGG-sr^{1BnzIoJK?*z>o{4lɏ= ix^rcʶSUh5**"Ήs1f0q[ݍ@<ޜZy h讪]U{>7 ?s5ا3N_㌋#iɎlD1vc>@h%끀\ dL.`qݿ@\rs -k&(/̀sz6q_+-#(vbab3b@R4/"" >;BmWp%Ύ_WQV㥶v˼04mTyu+Bں@MU4Ɉ_ؼ١R|ˠU@~9/zȧ$:D -dVg՗n7J"'EX=@IckM8Dx`E-&fY@cS+K",m 8$^UǕHwZxlհJ޷LrKPE[#vpȗo'.%jO!Eg np.a\̷Ġb"ĮW >fYq|[5_!!U /)1;9%W]#.̉|ʪѽb㶘or:5}m.ĒB ڑ+c@(*40>|/ !x=ɸ- m@)G ܠҔX l~ t=;#:O\(}>}Bܨ#J|Re-fokR>hć]R촩& G#YAL<3BAvTLaw,DMD8IĮKZ2޾M13Oʶmsj,+ƠBGFnxN guV}L&IN9wt&B[7hzXH^lk/ZLS1}O Q| -gt,nrS$ ArѤ̠Od¥e~!i%nyޣєh$c &?CRˠsS tia#iɎ.us<$D1nFuֶ'lAI7Ox/.?KnNauD)̀crM׊/glˈgf6]gzxK1ÙB1p0 im7O_8HԳ<.Ԗ|'^\Aeǯ( y+Mts3%K qBpT歅!`Qgԩsni[ڞy`v4>wS76`k 豯Uw_.2y>Ǹd*fY)4^yA2ǃ)&\=1Z -`Md{ hh!X^FMMloR~/1Rw2e qQjt*NUiOC8PYACԨ!3_u7(f:d]Uj. -ĉǎhaړTCՕhy$״~ek݄^h6poK=ф$ǂH)-" ;}.(pkPdfxh&a(P_dɤ..IXmJapGyGBrD3(YFpez/`͖_^f9DiGZ-H<L3_ ,uDuOH"DvǽDȂs9o#lT7uDz/pvNKǻa_טǨ5f~|J'ۏyaMV7 wfg-Hhġ6_ٸЁ Ztp_4'Xyֺk"G%ˁZ>«k@)p!s .=irP溜|Ǥʴɥ̐MRO0T<ƫ+Vk Bu ڕz /BXt48C$x[$'i -gȡ񱼶 -HL@ޱKe \'y1[7~Z"1^A-js`Aڳx3ReM%F`<(wzycma!f1ܯe!d-X%kѮ -4U\w1LMݨBˮZk`Wne$ *a* -@"ʊq(AFɲ#BEBN_ -z b4<D Rɮkڶx؊Pf¾C]cyS&!'ЁIUFVX CHD)Z}nbC|M9l ]˥/,bd%ThE -d00e_/B*~=rX'\~Υn5V'UyyTAP SSԖɮÉq.~6%_$wӻwTC[u SDK8NR^GF@ l <-i2zO5z=Bv^P9!ME` -3 *츝0Lups&&A0q0Q}(HPځ{CɍnoKo'!yT_tK!Lq+xѬ :Q|'4h {pڇ qjqzs^ba\!a4d핍1~ -Q&n6i/L넱{ęv꣮O{41v&`BkZn` βn_08+*iD[Tʿhb#!C9+eѿKjXⳭ؝7TbNNte I^ -:ٖ=F@缘Qύp\x7ڣ1)bwШ -.< )Z_M ^+lاE+,Nz=̥hi8wyb -?5Ds I}?kRA;:4_}jR qI>mpϛ?feÐN?B_|(\8r NEZ뮱,hܦ,844ڜ˺H,Ɗ;ޓV/~(7xL41d1bMh&)ܣ㻘-A.%ŋT -qE[#`#p^NVjZ.q7u 6%;{Ѭ$ǑCi:PIafJ R;H|Kob:4- - >TD,׿#ҟ].rrp%l oOa/ۇ҅Jd=ݿ]{k [+E-1R:nLڱ0+'-7)b< +%jF̺xV&/xxt -*gJ򕨰@^٨geTʃ_.9VNH=0"Hɢ,%>HA-i}gHkƉȧ)bdž!sC>"'g|f<47Fв q ?hz9A6Xu'X -"Uh@htϖ 1@{%:^;#dj{# -k !?t-q`>`Bٕ YVuf3^,uC8R}ѹ/+5C5ߏӢPȅh¡) ]p4E Y.VR*i)Qiد*ӉfO٤9$?,ԢMXs`[㈴3jMƭ.bdPNa2r[|can+/%.+yYƽ{[83y2f˹+ʥ+¯&gƀ7<-jeS^D/ă /4/ -S"^),K%<àUR3!MEJ郚3|T~FBl+-qɱxDOeɝ6upZ"~G>;x}W7@ߓrZm/"px|}-{Mv߁rL5+g` )zʗlFpMD| 1y$ -:Ot5a3qβUtIn~ApT?$}J8"I)]R+VV`;{T>LfټR+7wl0Kmd/oڑmyus`aPJ4l4*!LT͌N!ԛ׍"gVΣ+Sc \2~ں{v~!a$žCi#ڰNE kA&|\!.Ǐ\1qpJZB ѺǏ_'~qIs;P;.mC&#bWRRnFWVI(l>ZJBR eec]jvjDm& 1xO:/>e|]3ēQ>mX|jˣIS\e/-3L]N[J4>-V+Iò09X1P$M%mdFa6(GFuz`4_R(@$wXav3aכT 1)yNLI -Hs^T~} E(ړ \A\25vfMV: ۶pߨМbP;b]\3v (ԸIV+~t<.*$Z%_FA\2#cpOfWr+K"Њӛ}Ɇ_:` Dއ"NeJ)d xЦ)!:9~(Am|Io]ȌQw-%ZRi Vs$)!u vD -gܶ6[:iɄq/!ɯiA7nXP4ji/ &R3A8KؘB }0avTEW> POB+@Õ@o GE-dI!;ᐣ]Ih+CdEK -;l64Ռ(f0 ?)gB4z|P?-spQɜ)AH+φ1a>>HW~ȵ}Ƴ]>φ#Z/۫"R~=h;m6MC.Fvʃi-gԚ*N}Áty@p-x1qK?uѐu͝g+ !fcK%.O lPGu]d;㟘o -7)6:x,.[fʦ2^npЁi/.$G%"2t0আ+wo ̝{\I__Zfh2 -(-mN -[Czl;fӖY6=8! C#䆩AI)0u8 ~pm?:< g_<@';~0Ù 싇v0p4:Ou_0av:au8o%W~i( Cu ^i[\U$tߜ{'z@v[!xX_vTRnFWVI)*60z!G(E.P%I ޣ2+A,N;A `<~a`}uOFai*-&}geC0]g*AV bsQ{kSit*zި hX#+ -(̦aTW4_Jɻ7< 9;v~_3CVYJ~2!2.TxśW ɟRh`q2QB"O}}q*]J^ OC {pa5 .(gWZH2dztsza#JD=5&8􊄌Y**i#vzS5 -am;OqP^bsA}H\ PcP/rMԶTx&)<1W5Ac&FD~mTS:]_`:>UCXԝЯ3Y~ë|5t<%f@n7uX#:١WcR#rwIàY\T,;|%9(:Xu!&NHWm'<`@u8Xvi\5 %G;C92h,7hF+F}y ڕ"֫ ˨1hi㱢KwqĜ.יHn49tB<%%9S/5pJ -{3Nxw4a@/bRAO'AWͯLGIܶT?IF[AgYIon 7]+!z^xɻn^=EF&W lz +J\?\~%.,)%T6Ƌ^w\X\1gZ A'R.Q"pfvby }AhMb=WJ]c=13 p/VA}opd7#^>-nHSuuHr FRnAvdr) lYQBLj-ZumRfryjJ /u]5=n pK^ h@ysE2p%M|~B;BcʶV5_8H(giB.T5ti|ꐧʢQX03*i=U^8vUF_p4x^:gn5q4DY~'ʠ@^^;t q"eEF籟i;E&˯ąWyg m:'{ NT}f:!回[.ɵxEcmI\&v@uw%PDC `ѱ -%ݲfntfƤ\ݠSHɍKeUsٝp-"[z|PQq9^<-P Lf5c3ϑb 19c1J\_(c.bɧ撖/ۚ{ZuGυECìk6CO4Gmum7/-; ~>/6s;q >%<C]:ð5 .mܜjA}jopd7)m3!:NA#ɁJ2wŸެaya<ӸkV(4 -3h"tA. |vUg40i#ZS!:܊>Aͬ| #;çPi0 ZZv 2;U -F .L~gLzwkO`YooN^8RB4+p!j{,A\ -pyLsyɔ'!J('ߞJ7StLJ@%:y̶M}Z2ioivީf͎QqJ€jBE pYv#(,GRWD{b 츉wHфQbW((ݱv3WTn=BIO YAGc$7ݪO?QH&2O=F?%S( 9rl$rȇ%.CΪFA}dl5=,5j9-*;wEstBXEJ&㋫ 4WC*AUP[\LWT~k0ANJ!`;}yN{|I}r;/9\|Nb2ՆBI`lk -4TSJxH7"OwӳF2-PDwΉ1h9wnH䣽{C8H;wdkU0Ѹm0M< db`t{ e9i歲hW% 8_˩+M `䠀& &p‰JBU6u]G -3=iw&BW}B4IKga`{~SnV<{fP{|ٜp|$McadsD3(iRSV+eO,VT3펚Άbr2#%b5ТԖE8Vu8i ~gYƀ/Zc5Lm^.빐zVv=P,6xrp]!̛'Dz~K/(AK{oMרK_xv`3x^d{3k̸:^t)Eӯ4C\˜2 ,oP^+l@ɹ/!~]~c!^y:kgCڈ nhhw;"$MO}NADgLb9Tv_ _֝B&?ʀ;w;TT0=!nOv茊Q@N1+f@ -`e_OB\JKϷȆE>̑E"2sdSWpY>YExÿl[dwKKl[p$noڮL3C%uߓ-(LmԕmrL祘T'饸 -ߕQ#׭X3ØrWKwh4mރ -[_ރ3c^ۥx{_99@ s6|][(w4  I5䶈º-_DrhJ]ێ^i\N{1o_w+pSݭ.>{' Y-i=9g3}Xʧpʠ1=(1]_\vC]( -@AEG~>|L=MK,MBjW_ġ,<|貏阔K]wO|hlZõ.N9S!C*l eWcAxvIIqh䊾qAס[mD_W}7xn4L\զBܸg$N~|]Τ,d}.u2U3<~hۙ~7'Cf2AF-bp}%x.b|'pG1?_OşdlO!+,w*$cWQYd}cc@gG&2NB\3!2#5(g9=2uGȌ?+qa}"3`-|<2;|<2Ql_`:fe癏瘡vxe1|dNk\70b4`7 αYcIu ]iLa-[+58vanl&q e.rL祘T฽dp^R#ØbqիY`.M&=";"5({v=F!{Hi5Bp7|Ƚg-aL+;5@!x2˫ɘ%Cab*h=(R~Q|"TVWM7P4$<6h$_Kp)8C318-ӹN{1LEU L~BVp/Aq{Z%c~m/# d$ $2 ((L Eu]_t:]յv^E^ŴbPv/t+l0?YSbB@b"9[V<Nk7X}$0/55'&U@*_?HGe!‘4\.*o| -C5_RD/Ֆb49OPU`nAd(r $nI+FڞQ>Mbs CS$Z}*kTD `ӬL4qΎ3I2"ѸX Cݞ77 b⍈")IVKE+%4Bjru35,: -r,"ۊ}2'^ICfdv8 1J؞\3?m պ7ez$ gDq\Y+[bw)QǜYc᭫7`8vwMָG^QeeF׵jWv=Y͟Ca ĩ$sAAX޷ͰM93Z|f['OT ˯&wT`$ֺM "XA1)qP=#{'N$Ӑ_&q+9hbKc2٨p,5c!Necow+IVa} +b{KDi9v E}u""5q[Dyq/8HeiK o&3_ endstream endobj 196 0 obj <>stream -HWv} 2D7:; v{ oz: -Q8R߰jz"}6 /[jAw*F//06CFn>K=_Idf cULQǕ3CT "N[5=5525l  P&.mi4WGpkqVY  @'XY $E ˟/D0{2nеda.lGh>TţJDIο3XFM:!oWE푚~|ZܮqO;Mޕs8J HR9씰#"Bp#Zۋ>X>[mM%n|R@nnN˫2V%a/jϽl& Jcˠl 8Ao7,bߺ6~01Ò<,Zd -p)t# m+Wa'qZ B&7IQk~e>mJIz\|$wE6]G!z$=Q *BBZΗ"CF/\4]4ʤGkJ]~tAW$,v<ޓR.SmnBG\eetᡴ*{ N\8sz9y)62˵rfi^bpp/U :Cd)-MMIfd&6sl2*4^K1s=Y3_O1#;?\g\5sh/i4†0>ii't鮫5o\ -xf[ ̌w%BDjzD߶Jn'.2CZjpȑ^Ecɻtܡ-NcbcDAtE9>(@Q吭5KwQu/n]즵qS.<-ѡb6eX|Σ5B iFX PB e(a͕pD΋^H;Sxw(ET<5iV!ig/%6%8\>}kD,'ڃ=Au 5ŚU }$8͢;mCCs~[< -$U׻g⋻}؛.MeX9RQFJ֕ OqxbpA{im7h$@V-f&jBDJ 61/.ߠEn!bp.'I& oMQrPaMʯ":b.@Q CܶOF҉8!!Mh5P΃O~L\]C<$$Fu=lސ𧆰_Ch~s!H^a)O?+z (>?>Qmazo]j8oeŊPc -񅠳fOF >pYP[!}vG oF^d'r^4,嘏qƺ -`ː*AZ_Q -ږ*FoP[)LޕRu݅lj8},87z\Yz=34K ar}f>x 'AACU6;a<|ێ¶MJfbt]vy/Ҋ"W:^lRXaiHn1bާEa.0*zG,ŅA,f -Wa1S31+P Dž&&fA<ǢL2E$(EN!\4Xa5ACo'...<3YSK1cN֙$?K LCCl[\Y;Aݬ3H=*y_n!Y~pP <kEOG ҠZizj^ -R%ӴJ>-ۜr?(.pC기SpGc IH^Gqv2ȽAT+ˆPk ;?&q NjJ_{""ItߌtE o`گ:fkCd^-/xL%ŭԋw ~bYM)(\cE? fK{؇܉~aC웅V׿){)gnn ӮS6J ϨKaJ23Y 1cyEGRuxȕz ݘCLrwmCOer5Vq^jꃏȬ Sx/&+~Xu[PvLܗ9iyyW?8dmFV (Vb^d(Ǯ\_TpvdPm0a)@E7R729hXRk;j'@Nq d4EJR+oS˛YҐ2L9)>?5$h)ׯ|־t|KN$qf>(>,"M!J5EW^'0kMFPmyZ.|̪-4}q蹙׫2[EnZ~F:t|k>5(=ֱ=ɦ-}&} 8Řs^7׌ 7pr8i*p\~?gz+3%}) ozqY3ӫt[O%mP2ދ7eΰ.*zF*:9nJ΁-)] \2Z4)'zP&35݅bT -+E vI6Vy<4ov^OKB8>^gæJ'P/R/XO԰GcY}̷F@yʎFm ,Gc)8[lXāl~a&α09AGNP o~4+ FU|lDlKX+hgvb*J OC!$d#Hط$ -ⰼWݝ839O$mwuݪ{o-^15=?y^TPOdצ+LR QFSHkv;Գbz]P$q8hҼl4&0dbz.:Kq?޿Zt_v.NT:!tk.g\.N2Ѫmb} @igP!!&}cbdjQR/ۇ(.<&33G-O|^7.xEJ<m"cbވ|r`!x,2vx+2>CA*27._\ b2\Y~c2S\@yEfm ߸|I\,;wdJ{b2Ynsȍ۞;nj*9f,cNO؞;2Ziyf ޑ=&3{yLfpǛyGf)~xLfƆ[ Gt1hLg/~09A) D0هNWGӧR ȃfl';nD^=$F -3LeKVh=0ZpI4ŋ}OP7 D.4]҆%@D$L4'* eyA|skF -bgc٨#JL;)ˆ< -38؜7CޑꗣA2;^_<$3f7.KaԭʟnC(|Hj:̂nr^Ad>*b2xnDj6pF籊ɇ|1WBYaObH$ݧnDr&p9s;t1=F0)N鵁(7VrF56ls{bvx6~¾yH!c L+ WiF4sI5<,W eS Ə4+0X Ƞǔxy,ORl.g'7XRw?:Z5›|96 4_jb f~t0 ]>d{|?kHѰļezxUϦ.1pA5\]Br;"a>|E e -$c]7XZ{~⽔Fmq*WU4-`UԆ)ŪJ"*) >jR{N\c!KBo,rC.LH[RԆW 9tdڣJno)Ș2O7Z[sLX+czr@ Ȭ-B @RC DޅOwe>[4%pʯmOg~F>[p'Ra%e!%hlgRgKn -/`gg¿G楗_$yNe׶rq9lJSC{JPG.Xb SHe`:o k `OQ\_CCł&T)z.?TT> >>v|oCv@!O46zմH_,.ɕ? -ĊwYIyҋx"]^cTp`a" 2~K}qK~RTLt^'k^dhڠpA#K8Vt {uZ,vWzF]gM.;EWχg#J -@">`XKOs$1&yWͲ@{afLFp>$ ]Kn{Re߰oF\:яI'h1=؍t$eΔd5;rhK(؊9V 7`hq߸|I\D$-0did7tm|Sbcr)v ^$u巻g},D ?P]ˏғh_&_ܻZ/XodV hS `mq _~@*Òs 2'O]~3n!‹lA] -RDAC&&'գtX`PK!c\ n\4.E7 kټ|; M3`ҁca  k:?ahPORlW DgK-N7AxX[B{Hx}ytLGX+77]Hoq[nVވl(ElK;3hI6ys Sx,xk6v;gQtB vόr\*$R!AEA mJ -i94^yRH~˛7"e.[hIxk=!'S#p~W)v9x@C>Xچ%-3T;E -Ryp[Z9BR'09MLll/o)rAbUj?kǜaR=si٘IGY/K[%Z qGD7Q,? X]M_7*ߧR4 K]{\j,%Ջ$VEK+j2*`|Sv̢3,y"I/돕0^jE%B'Ӂ{QEHRa8EaG4RQ6Q)byfO~Q}F~Q._SF6*=#op\.Jik8փVFJOl;i|KLhфо xY@?"LvRLmx q68=axydxuD`0vElq\nЃ1hm|0icƎSOp̃O8ē٫8٫Ңx\ yèNE׆/^v<p+õQR"E!쉯Kx bPx q!ht[hF\053B -O}G|f=]z16ޕQyݖK:N=e:8JMa!1M5jc̊YbdSrwe]2\Q&3ze22!gy7L]ſq22q ='з ='k29ߐ3da΢JfQ&3\YV~pdq2cdЬ ='^A&;ΙK?jm]%m6R}㮮J.RV9)mg5M%k - *G+uW2)t"S?ەwJxNk]Ye{ڪ<)(QV"\7f@Yzi#5QYH7p1&H ^@Fx6&^dE -( rI59G0BX n7 -Oq&␂$``6d#kˣ'/f4#;JZyzЈ=-eݛ2n8^WR$hH-gQhgUWUJs(=͈ ++< PpWJQm [n؍TFmH$!6ڗI瞇d%k+y` ?1@@zSBĎ|g& ~Y&Kqf._)edy#pT Օ"tLߞ?|PveR9ȝuR5ŵ_ɥ+)$W8璂_S.p0z\;y,_H󸳒pT?rGrec3aƚjz41 ’d$ ]˼-a[@F[+2Ei1o󋸒ͅ@y}$)u >  -a K? T)@0ZF RXoF}YEY1y{Q"bKvҋYE`(}z&"K?\Q RLo r8D9t% - *Pwe:̀bPOmcaep^ -Heu|Nކ>gQ4W_9t):JH~>|~M֟M)\T2^](2@JF~C4-MAL7UwiK&θ,kaI/)8D\[vsF<ݳ #&نFr6T҅߰aBa`>|8eǪF7Er4W8]^kh=eQ Ɓ |6gksIķkϋ/.ݷûhޒpe{'جpQnV!Z*g@36T,䧪'Â^hۮAnI̟a(NV$ߙ}j :4~4d5W_Wyu:@lTRL6EH3BK=Cgs[98χI=P EQiq9H,@ .}&p{3 1^EZX(M+bևm4],l] \j {5|fF!-D: -p+P 3'漀Pu K1iy*8"q5 &j23"~'UdȝR+NcWM69|6; IMFtYGKNTu^)׸[J"6"1CÜ_˯KPZL܏˞ ٞ 2c`FO~fGGN:2s22s22s2-/'<,='̠ -f;?ʺH:x9x9ed0[^GN!W_WTBeee-?Qf*FAu/8ew(&JG`!ڑ3cf*#/F*֨ ޹d"96AukKxTDKq3MO?OG|/;YT24~٠. dὕS!n}(d0܈&?\1 -8tҪ-(`vҕH:`s(Dw4#8)O'ODؕ$ot(g._bz2v\e_i`p23pJ -tq -=DhS~"oW_FIm]ia֛5C捴塋r1ݲi>椛Rv/FbȘhr]ޮb9G T?Uu;d!9Ȃ]2̐Npx/6W졬HkXq4puD)wA M/Yf*F|^[.^Ka?n{5`ڄ~+I@xaYO%Hp = -`?}pu<,i cI*j!X,@ *~@6c~hKWnj#v!/#h5,rL(2d9(0Ƕ۞nU-3[ĉC<MinL .)GTuK'MPbg.a`C4܅(Ф1i1uÁHx61: QO"\'v"^¹V0]L0rnO#YM S.pOhsVga@? dqK >ZHprshQEPn"Λ{aI-mtsl*v::pݞ+S?Njš4[J߰)(^f6 JuG¼CVɺ#X WĎ=+W_XXRzd"kya:짌颲"a~6o2/å( -?> 5L[ DB hDСC{w7vjtgfa79󝅽PsMjaqIN꨿;}u}]1Kdi?~,K2FFs)EU2 ѹ!:M}2R[{:1.kA979/Gq}ThV_ Yi2c?RߵQ^_݉Y`Na^!598e}Nc`ݨ qp,IOKs8&K(X[ëUnncOR+L&ĉq(+TukPvʮ5>:-"uiuɶP6O$$[psʄ;@(js.h+w2h!雕/qg!3!xik#xiڼiiEҥA8fdK'f838bF8ffqČY1SxIJ̏L>P @qG8#vg@e_OjR 8 g3q!pfBđRLAKl&`9#3/"3&533-B̌LNbf>JI |82#YP[r6Gfl̊Ik&{ESA-~ 0, endstream endobj 197 0 obj <>stream -HWV}"H!22CTYPF@}GJR:>g&OQGܨӑ|(dZ#@ dt$h2KyJ1BkF -ܜP]cJ]GײsgVr2P sr؟9QYX80J@ WjHE9ajӔ;UJi`J򂹬?e"؇'-A g1-,ou_%*Ҍ A<s-b{JS.$rM0ϫ$uoEeQܨv{ eZKMrȺ C]0GQ`4XCQKTEEަk,VtgsXwAsɶoip*G8EQ 0YԺ !b2›(ʃ -F gQǥ@rB_H(B^3TAQk%9KFhz\ ӰLhr#ht ..6\ ]1|d*P,&Š7 עc/4:eRd |B+~XDF{[%dJ[Jo: -\SB>S nE%1W]\t`EBZM#=f{/k\84 >~h.  #FDI_I %%@v BXLF$M$4G - (q@wRI`xR"LLX0)X:%Hp,av~M0w.'Ǡ}4D~v -$SkokSJ/yo~RGR!єᝏtv;Z KiV~s:2u8-ب#tݫ{Y?]A *)m ౒AhcZP٫ &)~:=bʔux r#='SYcpr$@wJo@QtNU?pG2wE^}בoG@ < -iN[w[ϛ>x Ǜ"|_A{g9#8 >+@,*0֣;j[KϘtt >һ#$`:ET fh ǝStDG:FXSŝHgKN[)3tP>_oQa gj۵qs!jP;vC7%7b_/?!~)|ݿN|At3!@CΏ]=兮6k6ŷX FM Rl>Pƍյ,lL~S QNΜTk7 xa#U[}m;jV-GÖhdcSb(sAD no^st# -h0P!RC$9 ^IN "N6tp q ?}"eGe&4SkiMy'$&EO6Ag:y  s)xor&2} * XފˢQ Rs". w6cqYxBͣZecnQ$> -zφ4>椽ɇsL6Ŷ4׻=iYɜ3^!RW6[7e5cƒ?S J2שH| ->)ҵ3x4o&UVm1[{nÕ+M`%|ڦmN4PVȋ6\3u! j yf2>NP%ٷr2mv:eI6;2Jv/{m-en; a. "4$ - SWcQkk_9(dq}vUy((Qb:lV~WFbH1wՍC}L|Դ! lkUptCy}o?1,r#$9!6x\e wJu_9!_U8~$d?l;O$!;P!~ְ뢏Y,k3&;3[L8Tcq;}ݫ( jt6z -'y+v *yuvr%ţFX@ίV)?rT&CWMNEv1o`BuO!ON[{R~X@2Kh0DYܗӜ$<5":T(<_hӛQL$oX <U]u -]"c[5?]ٝ -C9hg%:C$a-, B 9<I[l ā0 ?m -K.\jWjd>|(Do!W& F؁JjŚ =„h﷼p[A5L2|ZZKW9X}3*ϕqY~AM\¼@ 2aO,]2k֊\RrOi+yJ0Ѫ=_+R:U0{丰Cl|(pN wL;tTi>ƒ%å+V&*P O|̷  |[8~A6]X#k{-{-mZal ]uWX LaMn0Ei0Njk3^>^j`,jV+'}`ɅT.'2tr =}̰.. 򻍦'`Fi4Y6!'`2m4=3}m37пTfn2g6(3N2CsMOl&hzfP|̆HFs2˿K> YC#-XaLb]ObY>Gwz!z= - A?~Yc- -f<>,m3&3&ksXN&f*z6S6^(%9vLCg{[2I876w;Rպ] mv{iE yn<Qg^xšK:ܥ~OBNs277z͏xIR2{tEq&]`z*hB)4`:?IgS١$s?㣪*Iq \tDcyM8C:$̚m=7~ 0/8 -_d@p坁ُ}| s Z|OKmKL5n/|Ot璝CAuH7$S?Kk`cjՠ"lgޅ -^+R}K~A֫T.0Si_~+|}FPWʿmS`[!59fk%BC"0S* -b^腉Rh -V[|g<ʳ7^$\9“"zT 929c1wN" N&PУݖXc ӊ+Lgu|\1Z?Q0KpVd'R%OGd -6H Ĕ͕_} h>Ki_kL -~I4VCvT<e2 -=QB @^;U3=̩Y$mƒl&B9$ѴaRע0<%@ zM@PJQ@.srf} ,M``ᗝS]4:3y5fmH?w^ɼp8mɦ96B b)kbĶX/wr/et4?NWg^Z&ZH=.h%g`)vEdz2W]V9 !h4/v%2BS o|6n,:DY8} -y1䌃/;Z]Ae-~!w <8CI@ NgڬC^1_LR T<3 ϒO e1PD>'f@:1{}Fw 1CX)by("..ؾ|"fdᲘA1DIJ=tC3..2U1PD\3ǾD̸ ?&د&fe3{L`fn3:5 <{MC`okFo"@`C X   ˗@Q8~_ y)to&CV\6XmeӇWMd`u65u0hb2+&d:̪1W 7h"f\uY,4n̤1s8h2f4]3=ʘiAJf̄ D"fA13e1P+bF9h~ٓw^^ P7iлYc -b6$=u>HCCC'[ -WΤ)m^z XvD]=E%:pl<#2̹&JJnN*S#g8fOuۻf_ >F6xq MYZWmoJ/~Wq "(&3D{ -۠ݷ<J!\~"`d"Jų- LM*m).8R #"E&ģd}^|.e&>g#uP1Y 9m1})Zē9 \+k06U] _`CjxOTfK9^>/JMl? =4Fu5͌ `tun"S(TTæ$~p~T}@~:͸"1Z?l+q-~A>$H 2! ( U[u2޶Z>CUC<:-VrThaeѕM#-@Ơ~ŸXn"ؐ!BM\jT՗L0Z@W0^?,^Kv[Hܪpw&k9]z =p)Uㅸ2C3+f! h2 -}4 V(5N$!.D`Le_٩JJW0cSl>9\84Ew&ϖ %gK -K`/Hx2V}}qY{,6g8 QfRd v6ʘS@9~AdZ(V+۞UR䡇T @?$|a C !`̅>0 GSoH biYye\"b)S2D1G~o;yFnmoI;o {65 mklmk(澽&Lns^w}{M81m?|K\?|K\xqs8VqM7._y EZ`i8{FmEB(:l_8y=?ͼ*R) btyUQjN_~9.< xtv:2$+6Ba'捍ajYR˿j3Qx9Z$Mp|A{gb *[A=wl{i\ -ͬh[b$BԸ#T|H.P|y*TpK i",f n|dpF&2 ->@9WPCYhvF(TsĂ{%iE=b {OpM=y$?s`=X{8I-2Lm9\]*Qh%\Rg̋SoH biYye\t8QX5f !ViHH (2vI c!dm;Y|,EN=o:Y|, ɺcɺc)vXd..~},EN= rXd?p?:>`%$(ӸtzINm5],u_X+6f0p#QD -uO/mGJ.@]xJs%Yh/&&] [a!{Ƒ=BʢEyxz4 -ڵZ{GJK/ C_H>^96BxD$nQ"п~fT֓%V?|G\ag!3e2#^L]&3/Hg.D̟ xMoO|O\#^B~-!LqJ3r41]]-)wT?ȫ u@/NvŦWn ; JєE:Fe$vt`Jd-ȹ!C'xɛ+3I8텊 D{ʼ8q:wQjW>an}e="aW*\'2(C^ߓR._ĥA X=9L=t;L:LcY! p|to[ӽ!Q,ِxd˸d(29`K˸dHfMe2D:sk tIf\>dt!o5!.\c.dߣ>u߯$]~ Uں˖'iZEwzUa8-#_,*rFZS}کN=Wv}( -  5jN5F%9sV:?dwuwmpx - %Eӓ sS^wڥLYWˣav"D&2UG5KVMKRr:1xTfٸwu@1"gt ^c+Sp;q`[ڕX}# -!MCpWilulh+lG \:(ʬ,ߕS;ƀ/{ߖȳ='TLcI4bdRY9p@Y.3*OZ vq}cLFólXTtq?ThO :. F[YTndET-|B, D %-&u0풨 ^F{RPVBT3@ \\9v ) 4c>?:7qZbEf,h,%W/)\f,.2㧣G]-1)g3:!5z~fO‘<JfE p9<' _|r28cH>zz)c~t ~&8>}!'${U^8~3!^NNa'VAC⚶6b7﯎X|0#d]&G塑-#LFAIUA!Nt~14;]9^mg.^ŖL9*DskqS ([vfOB0q Sa+U,jzy"?M2>0|$M2>0|$y̝e$CfUXǪ&t(u -h3sI ~~h'񤶟 -$cu8$b~>1\zR1BDtM4z#Ƀ9ڦ]jQoq'.<KIXN5sia ;I_uַiU@V6뵤=cNFNʙ"2+ql8hԝi~m0\9\~ev_blfsr;bE,BQO׊%aD5OϤAmB&g .~m;WwέRn"z7쭅؇=`RD㨝2e]hZ M= !0'Q->œk3j*䮤X]>Uxأn|X;F&!Tuce/St4U_ѹ0X#-MM%'] M''NP{ذSa -(0ӖV\]Fy`w=&"eG!So_Cadv0ϞwgWJ{ŎF3` -n|c4HV?5Dt)؉M̭m(?KDV|o&3^?aGf!˿,\n~pp9χbq򂟾Lh<R6>*igי7mtiI[?j~j[?=zǜXh*s[$  7]~-;TU&!V{E{<Ju-rxg͘m_ GN-ҝwMu{ +bgJA_H4j|sp@ftЮ}Veaа:+HY)^lp[\2mDqFX7'zzqh4NTi#qMkHU?| m82'<j*ʍʺe{:T\c: ֞DAEs< ?ne?B ]fT nd "ʇ{X4f؆zl.hLtXş{/Έj|Y霬c,V*k ^5 -zjM2<~ԅyuºHM ,*9Ո4ҢH4R$փvS_ڕ,R⧣Gǔڔ!!5P/nH`mM()Ŋ:&25_iSX^ܗsr*@w8P@}@b_R;JeJodE܃ʧK"c?(Ș6D- HHld|ēv>aM+ϋ#qt2.zY䣶k,*wo*;U|c֒GQ%aȾ/ώ"Tw'$͘o&"ݤTs0Yy*QNUtZ[xr%[t[>|bTPUDUQ (m~/Rxi> -{Kkpg1']L֏h#Vp0L - cNrU9VM(hކlH9N=x&?+ 0:jEQNshB(*X鳏Ґ9=θz7k` Яp34|)%kg龔-++8h&IiF=c#W >bd-x9|-siD#y-ېoRjITrvχB.?8q)@zF~{%/htݏq-Jqt5 *V" тs?Ya*$.aQ IPf5QI2",ྫyT<_VqZD#gnTc\ -$"gy=k`w#qG>6;a[E2c>^3Sދ?0p}Hm=c$iz3Sf'<ְYOfmOe>p&2h3fLDFEgL143 Wi?etmTJQYbu1?OM<<+\*lEFiC;c*@!0D}p*j܅85Q-}gЧ2B^0].jm赸[ua++kHo8뾱=Bt PQ VNO JM S.eÒNc!'_6y(k>GݥQpD%/]o"+ ! hIKwS%,һId7X lTEULQFqtkfq>~1Y̦x* -czu,wPm mWʏAzrJA.05Ho_O`.藩`A 엁df D_އ|k+ނ= 0z endstream endobj 198 0 obj <>stream -HWrJ?B#(̨hEyww7IuSuK{Xkク 9^62kעP_pw{+㍏K,2 'iEXO.Oy2BMK&}X2/ 0k)ur-b|);s梑֗J5|-p [X=fN6Ou{;ق",e}:»/r[MȖCF)KYJ(ɹΆQ áK$Ω[hpdfuH[>W$csZf3GPu+81̼ܒ"YG)F\4xZvaQC 2EP@@=ˌIsRYڮ\oF'kHbS?7w`iEJbǚ -l5tO8Vg@s -]f%> H~"o3ǩ pf_*[1EV;ۚգ!⏿mWB Dq1ScpJ`BWmtNzÜ&uצUM1ĉ9=$me٨#J<~-F(W0sPm)E '%?V.l7I._C]Qt+wi?OO枹Iʁ y LdO^誵lf^#[ af䎇LZ!$OM !5d\RfMi/˓ڤQKd ?e?% 25 OM"X -0IF)%z"f+\a &fx>,R%:<^Cm!+}z:&a -:vq{y8\G&2ks Eϟ3csg[v!ͣg<Ɏ=*J8tپ^̻'{X %Z2ms#;RBQᯄ2Yؽ`#n:vk&%X`fs*VWlj5M\MLzPN.H Nu/Mr{}ȭ;f2s7xh T0w~ԃЭpHBDI1-FQ[^ұKaeSN@8' p~`]M RyГN%|>`#qqɯ?~n_\3. " -cDB=vg 'R>P/֖8و)];Cy-KG%qt`<* J^lF\dkBZG+MlpFgYƈA==Vl Q1<.,-4DI ׀1=<~<>|2+"? -6ɨt{Ȏo b(981\l52Pb }Kmq:g5v0R>w%;(4JUxx^O>d/_ kyE_8vF YI%$(tD) -ZTIޔ'-E)ybT9e粟Bp^l.M a  mI\eCc[:0tjJ^ib:љao\h~NBs,f5#FȢ0xCT0toP_pb]P@Do߻%u0Inwmi#_:z2T:;K6A-^dQ#c5K%]_~ Š -gB8TJ1?O:>ics4qI:F  ᠈jTj,*B&0f&uv"3=Y/6y;syvZD&[kAu>tbS2Ӭm/̶Gg4o?uzFCf<4S2QD$ۮ>bM94IoNwS &ڟ!n+FQX\VXY#GEo2hGImlD63tb±a? X7et5{A\?iH?WVJ}4@ @$!D#((AEA.UwdzFgu~̟hH]j]ƨ$Q)J ːtp;O / @$T{7~횺h&vgL؛:b+%K{,',cհ\vq^ҵ.a]Ē:?; gƯZ`vYi(UC'@Wz0j2Aхx&х`Abد,) fO8]9?';Oi? 04.(4IG!MϦ0&F!c7ͰJC$5) Ń_J问Jcd8Bf# asd}!3odݸ0mpčGk[68]׼⦩Q qwb'4r͝=9Bh1àYN=(ȉZQxfe+PqC8ezB]-']RTU:yMH8- }tYϟյ|"cf?nn&~?`E',"Srav{8FtU/:ʖtfG:>gkj;AU3Vɾ퀷> -r.e`[U.Z_2U.vH2k57T"qnVW ~t JM o^3p0./ lpSKik=-'{*ifNT9fTڍ^?^V)^_Rt1Y.H}ńڳG}6!&g QrdŠȣhTQSX1#j#x)-<<tĿ%ivH6μcʈJ!{5iyF<_gz`BI-iIw y2؜$KP9kl9IܣR!nx~ F:+xS)[oYWޮ)MΘ7uW6}ɋF){ j_v -gNr&8pfjf/R>N53ՂXR8E&x~jR"r -O2-A+vD -`y]2t3.|&32WRW#YS_忈K("`,2bXf|kzYd("M"Cdg 0Df|c&?E{(2/Dq<d`\s<dw\r챖+Jkϖgjz9]ngu- _N[ɢq0l "~UraqFCtU/:FPW&AAÜs6L"Vɾ퀷R0 -r.e"J@Kخ1iz\f ڼӟ5x%ez:W-AXqhzHxȃ_ -)jqV:GjYZ=)\t ;t]|2 {:k,Xn2HS O g={ ;RL1)paCh2.gLTy6^b07ytg0yV&`0hBLAmbMfz~SPU6$"\U̩xx1Ð8v -K\~@gz~دԕ !)3 !$ ʠNBQ5w_X4յE -ۗRa#5KKvҨ_.w\y0SwAAzI"t%?>@ե>5)E[~ceBZ—;VZ<<E(TbWFdRdK*s̖0,pA& ~/7}p_+ -B8(B5VdP1cP po;Z!1 I0k 7ӰAGԓcr̞PY5#lG`P 1+ЇX_> $( -pǜ-Awq.b>'@W_|K}:pNiѺI, .C zr@(~ !FB `SWX_Mb2{WLtЉ ofdd$9#^T}2\iQmwq5fԠyys*qB4 tش`ϱa0YK̖ |o2>[RF"Q0KrsZ:GalӫXv==O5V(dozW>|~u,ʕho("(WƢ;" cў&(W&(W6UǢE/.%._Wq_qa',q,0|z;זoZ\L -O o"l m_O8 DFoio 0'3З7\mq >ue덄u^YKbU۠c^I3vB'ּqӉ]HOƳtFi$sj1`t]wN}A[9GO_0jRSyQG<:lIw#MZ]?h W#P@KlCq#X#56`"xqFj7I@Rآ1suBvdi@yPS;.maTQNW6{vh`o~]Rj !o0j 4*A>)\&3t2LfYz$~Kd) 3. AaqYd2\|9c~]dΞo T2E. A \PWd"3p[#3gv0=%񞐘xpf7vN&*zIP4(F.O[B?o*M=қѸFE9<ʮg>:qǫk,{>d.sӟ[h%' ɉʢtGZ4 "RdGŢT6Q/)>u*Pa6Z4/lsOxE>v1*fǺ.*eϘ?0Dğ='({O1B3vgv1ԎGw1#oyf3Aٞ l;ny Еf "4D\Yݥy,LqP]n {ʰ%L֗_<8AqWew V;޶&{DEӚ;VS*Zͬ&}H~}Ez\5>CкJIUgw& ^Sɣ:mm/Ur"MUχgR\$UYTI]i1%ev>Ig'"(@.Ȝ}p+ `Dso\j< BR5їPQdi|q-PafM^1x˿ 7JK6j - <&8e: 6ac<ʞ?b@̻ } 'w d6H_>X>P'K.ZK -s(q{P |6<4İ 9߬D UZ?F -ͮD3h^8Kˡd,ub͔SuPI4U^ἡc -%5'-?<,`7^Y<,7S_rPާ3gA11԰L' a k)֊դaB> -_4f栗iT3 c連iN5?=@p?Ms?g4_\:\~/:ρD fqy3jN&*zOs]3 JJ27Ho<"O/]7RյV=Ipև% m^`;.L3t|2ALp: sƂ+?! K421!97/9޲䅚4v*6ȜpH*Do$ Ҳ#b f A{мWfY@2r#А=h~@*o#4H$sپ1Ez~.خgt 4IR=B@Aٯ㹶_tV?DBcծ#-qߑS%i$uy$Q'  N2p,sIe7(w9$](wI&Gّc73e63[[I?|K\Dhp&g9 +,s2_M2JP]&~pG\QpqE. 00r :)BC!Е320yb9:4R,&Φ,cE -Cʂ*d-3,~lGNj1 +vpL&tÇZQ\HV[w%z{Ʋȉ?f'gH -Uq%Kg2N{ 3NCHX{c#,1 F ] $MI UjphN2LT}Ti O6%nJyq=ʨ|PpArFSk$Tx)J@yPS<57zFBC=a8}+K Dx"GAZ'ѤWpG4)4k5hK]O F \ۑergG4?s3WF~Hv7G-o~9_ ߇ræ4MqQY,)V^6 ^kAk{ճ|8D&^Ƭ?rEϳ QFrцi*M^>"bS±3:8~k2t_/KOۚУR G9$պM|Wd売j]cN|QBB& j$l3n5urtζЦKǎ?'v~zzvۓ/5 j2kdG^<׍3oۥ>1> -aSrШsf4mΒi;+toUAO:!А AN433NQD:>ZYOvJ&?kī:h&Oc;P^&DEz()"jc$=$j4c=Knp~N2W73\Gjf`EhGvvfdO3-q~p?3.,~"\YkuEv&ZGBVQ#z( -X^|PўJ --~0ZM+YH#lQ=cSwvP k$Y+AO~+3h_UR795.uЖfqmUPQ2++e/ ?B[- D1f%+.фčC: Hĕ&̧(sNYqB{cدҭԙ%VQs~qOq9" ;2cM2` u9ѹ55 9Bh9xP\]*a_5εeSZ3c<= s>UDߛmZKdz2@Z-Xa36gaC/o(%-x6PǷ0q+Yh-R&En&f5 ˰XYL] -cVNwЗlmG{g%8>""6qD F~@*ovG&r^2f>Bf6(B2"lI.$3>BfȽJf؋X _\M\O#?b /YßԘt/6qqYHZlbFc|f |f 'e!)ʉ˨N786ЈEZ%/&zW'&;uoX񯥄ZRő]l%F_B]Ь4X/Bk;[σco ؞hԕ]4G &_i`^B DʠyqYt}ae4LhhURQ (?3utEp~D2五~=Pz_`X9;G@Y|Mr1=ߘiM#Z>W̠-|>l|ٜ/ƃ39_\n1P9ΈdALn/퓛(x5p?5|@u+wK4Hoezs:o|9d6Zl4B \~.ҎHpgL43:*v<λ`|1_ U|y6q蚔OB2Ӫ, -L%l4T7;x ٧Ͳ?!;pȟī0CGū:]e+ 쨏K7{l O^ Ǘ}/-ޣE"ʉEsjT9G02\WZ\֖B_SLUT G1R€ -%5XμI^:, FN&݋l -{bΰ7F򹑽$X{CAȧQ;nrj^J)S5ͶZR[SA{gv.'ɋ"D) GotwR$BG --SM#U["|b!]_FD@WZH}%!a_wEAEqY;+#L>H7:U*wĶI60ݤeO\c1&( jF& h!V,rQͶ|,m6pIӝn>X\4 P4H_8~༌_,n^-5!Р' S)ɢgRmwM|P u̿DYn6R~RES Q(J/ɺr  =} 1KM",\Ӹ3;4.5 _h]K陝s.9f}3;瘁Lm\(M32 ~igNJtc N*Z=js3ZYTqog1vN$R.d~j/W-*K;O_Bn$lȵ`n3^O|pdk_8_J.ܻ6R45D9ñ@sj+,Wn*Mݡ.">~@)p f7LJ)NulD/H5>j:Jb'L/2GƋtDb pY- :Ll J:!B9tTxF$)5h̶ߔmsMr.)PΥ̕ʫfp"yْM!^ g.I=Ƴyk$}p!83J/k>I[i_NxY&P!W\D?D Ad|;(B4bL`Şyw\@x)iRb0ιS x-gIdqSAٸZ+blz -%ѭ4%6O kc 7X`~mClP> $o>A]q(9ǷPxtǷ0<| F VꢺSNo_ bd[6M&&o6]Z,3&xp[ 4*ݻTuCN=ȟԆCtEϺP'PeicK }$!fWI.TTHհlPc3ϮhP+ҧ>.š~x&BxX aa`-i=%cJG_2q måz #uإz[z=}RBjtGq7U"l7r d"Pt|JW۷tuAõT!0[$3kL%=,AKf"絏B&-BzgQجkX/Drڕ B7 -&A|eM-}ve1:M?/.?M_ˆ8 t&n[ǣcn-{egF@]#7 TۃDtM Ty} -ECht?(e+Saɸe5 L>Vhiƕf0o`fYs 8n9ǒmD:<-S*Re pЭ #Zu6ظy.ky _=5Q^5n +s{' T+s r;Oz62^tFwOg1FyBS6|g?gͲhYtj~Ska\Zw/!"jb-a^i*jAo_\~".ϻ endstream endobj 199 0 obj <>stream -HWVJ>"@!I@eAA՝08{X<LcwU]JY瘢('g"9?\gI%BqSoBH3p&%є_ηN2*5덃 -3"ݭ5skCϋڸHzkNsc* kX1ii-KT@&$e摇Q6z9-MWF z*;bjLjT-c 2AiP+D Efވc?V_($Sn*ޢ=(q8ȫ ~yz;ޟdD/`Bj<7|U3EDz|Y$U"(b8:Jg" 2m'UͱN9r6Le&xI'R_FW1evNFԕۃNd,ϩ]Л' ˥0^2ס[O__zHkOwh4c4 I5ˡWn+9Kgݰ T{H\7I-m޷O -AP.EqW,\ -Zn.D *bkɘ1b4E!qٜhpU6esl>)^̴;f!wAZO'ԛQ6$뎞2sէ\{[`u n.nޥϵ`6q`lRS? -"itQk7])2b/\Gm(ۓz8ˠɚJ۶Ul4 -p|_z) -{L帩V; `gB7k[#2mucDhHt%4epoHՉ_sCW -;V)uu J(fJݳ.*QD!! 5= dyӎZ**p 9F/-bt+!NVR,"D3Wv@LS`Y(~8{0 T'^~@ qi1Msdn)kdGDYq@U&NpNBT5 eP h Pc-Ze05~A`KEWX|1*xwy,|z'$CQqfcAb 'wk=kkły|Y8,/>̵Lm>]8i–8oе.ZD Wq)I:Bn.!K%L -y K#0ZlbR[h(ܔEmr#2 ~*OXG`ݖ#ZnyAGTg2>ΩdWPS* oĆ)3uMT cC)ObU6?6 -򳏞&}џ"5\(b?HHPS?Q_N'>oMzQ_| zU&\Hxe{{! 0UV>z׹+ W p>e^P1K!N/6O0\BztLzFW?af.3~s5~Sa: Tc3~:!k ;7G]~}樋sׇG.!.9@z F0w[ -odKi'-y4IS{lCP}ԪB \g1ys pr4jMdzӑnfqZ϶n-GCh;ЖXgTET<2F6;ָ Xp_5Xk]JNœ2s -V(uGOSVz:k@bKPvSA?ju!(0VhmE37LCȈ)5976OFrGi!=hu&Ҷm[q8C=c~cBaZBZ\ > *f'EK2\ސi E d;1!=sO|?*S(fy̧Sȗf>bvgdRd8yNGftdF쏑YS2f9qxȽ',DN\4.x9IxwIfc'-<UDB !CrQ@9**GoU'dP}% :Ui]3dq.NC㊝sWڿ8vo{_VGuшsf$Z[;G "u#j{IiuaKO텒j ""PaZ*KldWxJfcRׄM:Ix/4dtcv/,(F6%c4Ԧ%>nDH\&Z>\$rv׶1 ,6ozF8Og) s[PjHQޮ:ʰbH,+r8h^I+Z,%ѽp^179tB_uJτD-ZZOaF8Zm LUťJH=\ F^` *0vKI#_XK'@(B?N6Džzw%3ȥ9P!A ~NA.˄6=HUO (LijE-e?+ ObL&+Nß^>g0NV}![%TNED1oJ5tG6g&8:j8 ҧD.;-ىEÑBx^ڨ]6o?u*u\iQ'z'HQz4>VyEEx^I%45Ď!$; H%`) -f낅x< -E^=YOIgieraٮYö]П0l;5eaٮ6 v+5l;5 ö]]횇~c/.C\ _\3 5 &[>1^5L:̻+%Ʃ@]:2geBFApt% K亱f1yq;2{zDc -HIXONFr7/{%g2m!y꿮gǢeJ4Tl/jv3qpb1ow?ZlUy-d/dhKe?Q/NSPP{]QקT֍C|"y%S[F~ʴxUOo'Fr,h b64ej S+*&o7`8e/bfGtKQoPЕjՃb=ԙkirG4!~\45@[ rhd] DP p A:s̐-\&3Hg.ɆYڛA'-/㞓!g1{Np1{NC[^敓Aۛ2z:s̠#cLf+\&31dvd6s<#3@fbj ʌ2#<w \&3Me2\%3m&0hb3Q8+6hb3=+f_\؝ bj3ȌdCGfffp{Y؉,C[4ơl\.֢Gw)qh,NCJ8 +E8 {E#Ŀig@'; +vtиbga;8 ͻv| Xv\5\pU4`TΈúJ0.P,_3UWJg*x"_4Ԧ%>eY.nA$|MVM Ed6q1U0o־[i092 xoNiOg5Q#ݠC05+پ"b2g3 M+BvHOL9|RUA5-Ȝ) h -A jCF}J A o%itBU- = ȰH9e5桡),;,9fN'mcwZRvBҜ*-h'D.X YcO\QEqw4O,kcz8<᪬شeXn3xħ>HЄdZL5 d/&7%/KlѰ$(Fϱz¾g"dDZT*) qS'45~M>쎐7Ӛp!RS3t -Yz`' e%##CHNlnFD5jU 8CyPBy*@"]ބ]n|8\ma$me-/D`yw o['M)GnԈEMSb\>h35$_k^uPt. -kh˱!BZRv)ERCT+S*D.ug$p*SS& B&S$bhHr0_+~:K,zR%Ն7"{r:+j Q*`k^kjSՉ"wKpLߴ_2X/߲3{4aC{K-% |~b~n%5'!210ZhADPiU$ Bkf-&sjWl^/K/{_ŊX \>}!<*=0S*3뫼f{nVoF;\]!Tt|nW58ƚ 2w~ٿOk+ߤ,:U׫|q2$l,j=[˄l!88Z)XQ{ъO%SܹouzR Cl -9,KZ 1#$x`3?zy?on_[ajb *CŲH]_~Kwn+h\k4J5/,S~f̋0E(5x¶u[\f(zi.ʷCCٗTjf$-rJ~@/SOKzb.&3a%3Kw[G;GfAӸdb9Lf.Ndb9w̾q/ Y/@׿h8'<6^T_8]8yqvc`K(*4n#6$ZM=Sb Z z9 h5:3lw`""-\Gj& HeQĚx B9Eo'sОэ~]]gbcaDv}e.~)dAr^l v@ssLڢ* 4=Ug{faӹND;ޭy!#,ZvJK W Q ~^<~7._os-q\8GfW;LfPoΐq|slh-FAc@C ;24+wD3Cb6[!=fit7v9yE3klG kh3tlGl .pY\pfh*Ux+Z B^Ƨ2I.&; WȗPOn;^2p'wº02Scº}UaUACYfv9/bщ&KN yF3RpI)Z%~`. E{gd\o>U_@w`4@*Hw4t@$Uq4M'Gc䍢8܂Rڥ`3 >w`~ক3;T Z33Z5T`ʼ*3e~7@,C -e+\~ /1BV(‡5½5GGs0Op^ǟڸw?{2Aj`.8 \tG^@Y0%(d# -,N9 g_ [*y7/E7h4s4wU_)R:~6E4841G܆I##UN=!xZ&wQyŬv8e]b7"PovOَOَha;6\xv8/9i?B.VX -k-u{ 8ն ?P3ߤD+Jw6S񳿩ˑ`"ϛ,W/` D_@EġHjb *phxXka@w.M%+yF_ɵS~ &f̋0E_O'9+lI#m0 FѸK3ϝvaP NKD&ivKbd^@夕 ߠ"vAؿЙdf9> pA:s̨}LfAt$3cCa2s1&3d2Βܲ2_2׮3 -oj 4 ]ݢz8D#v>e-*)ՍJ IwTr9Kt%(;]hiz=Yt!,Dh3UXV/bщKN yF3<Xϊ5w"JY:'';y̱ +Ȩ=YU@b0K/ [h!e ͥarU]&FI$ak]:*l)%cjef\CBd\{&^)-/I³zJ?t+uf> $dd 2GqAݙ8zd6te;՞ ik^I#@[.5gAPK( 2+Xo(AĜ0 $u>5oP> -N@pND -?R+7*]QWL(4Ld8C p6 ,j~؉m,-KH%L&JMWBdMF%SM:6 |>HV@6c(XT3R=iI4^b;zlUr| A}CwJ8o?|C\ҫ.4QEd8&D<5lh<}R5Jڵ~V_<˛m!?Q\tu5:t.;-ٱӚ/Nɰ[A~p^12YLqތY!\[Xd= ;dGD|qIkI֝O -pAV*;﵇ľoB6ՏƸA=oяdJ\  (Gt"Asm_h^8R -9XeA%/>4]&{IM4<I \k*uK/ug}whUh;ɹD%oR.g.pa :?ɅÕ]S< -@fîb@M Y&[TRJ?|C\*Ga:;2[":;2Y.dx_ A^xN2s2h9hNBߩտ8P_'3d0|If62?`\ڑSHj*Řv=Dq)V]ZM:eFZ$}Bn&2:pk*j,:KfG5=MŪf$0Ng}I&IG\S.Г>o .I]ɗaf"Dˢsi^2ZɊ[W 8AFC<2 W ?*z-'TH4 -]ή.8fREZl -Uӭ$> YhX1LnA1'S]d5sageêxwճ("k qPlԈ}1d1ӊaEEgNm8,hgl2 {em˯[W/ve)bU'H8ԅY΢yI_M,Z! ! bQqa\۵<$rx(R@4.Hox];Ap_{\,68 Xk5 SK'EZ[t!&lP.j4硤 D_J?K5:OPt~=c`zf542etZC\ۆ_P$L[ T/XTΒ͎R]Jg~j.>ƕ;!'YGB ({I -҄OaeZ}yx2r -EQQ_ry<\y< s<&c~a?|K\\%.<'p4Z:طCp˓ 6A4'~v4nz0O*[0vYyx+pOШcݤUa149 x ݊O?R0>F7Jc1KI?ik3.[YDzF|'lza"BzjONbmx%pN~A -(rɮwqNLzJE-+x1lQg=053p/ 5 ,JNatKn+/wNW2/~`^~G QDlrw"D&IED GB -W\#.s?tvd2#b#r! Mpi cmzőJёqQ词%\n -J>?Xh=ܥԸ-*;_\x WH'[J,>NeO]M.]%X -}feXI%TʦG;&ڠ$sw!` 1,DlҰU@9Tq2q@p:lj .YDgr1@{nP%Ӥ#j&qxS,|t+HU:+ƨ4*"eS@\^0JI7_ۉrK |2gAԨ1F;ch9 ˵G©]p3xZ>~1tЀ2+WRpUdGךƦ 6_פĺu_>Ld\p,:4"Ϯ ] an DDC{- -4( rqLŮEʜ02rS"]6nԶ[PrF"2t+EhxU=ɕkASKL,kh Rn:T h |{U5< taSWԟ2nZZx$^A?Pjaȿ֘ -Qk+گw+·pA /CIP Ĉ~Tp ]|ǚwI1|:>14S!`Ρ/ qLhh\}+Ok־ԗ22אU -m^ʿ(^q.]ѽϬ.DT$=B ^#W=&s{ĊœcuEߠbZ'F2V}ϺpY0_,N -aaK8XfɾR/ ^7zU-{ ].[uĖam/;3<j T"hIîy>Y_kxl>]65rgΉUk56sF?A4n[xt͠`%lqcNGէm3YH'&isB1G%zFҋhMe&.@#='9=6/c0H˒-{jSl[c^: z]l븶[R:]E.x{ (w'VbtڵEnG?5ChTI yKr>hfcyZ8[&{pә4^w4AYZ*jC.8O"H/}up9mLEEDű#F1%}{YVFS$dV6St}D1NpA$P!]t,_ -n?3;hq!!,dTC4uS`KNi}l%z7`g]K|6L7_iKS.i LzCR㔛ԡ= -F6r0`Í1J4ǜO-q9ctr4JCWP |48*.&OLuH_|UE27pKc]$E4m4h Lyxbv!D{M/K> ͵HvPbd #?Z4cUPjz+c*v-R U3%qW$EGI\ծFbK|a+ '뙌F=tv({W-+W܁`6wBy1T"@K?{dGz0ȼӡ -LA4pSn3*Da,{כʰr g8#[9)OE.||tl\歮;ChYa ϛ87Ql(V}OԸT`?Q'a9Ce16]ƔI^:|נgXy&KʤO w#H\ //~znUi?TovtqL ZjYFAm*CEMbHA~um'$/# dl0M &Vu+xv þHQWW E|D{2$D;e%caa^[-0r)''WAH0] Ȣ}G>XP}p !ڿڔ#8 !X4SY,CmP,Iכ $֡{4Z̲xrtQ!u͒?z0%(tR _{ݔfqr\Y(=qɫ1yVJE%q$!q_zs_z<᷍\ނg؆2v {eqD/&.H9* ̪M;/.ЯPQLzǸX9*yC֍ -NnaIjo &E%WE8}/%!nƓuˆi?~1yI۹^KLZpݷv/r`v ;ViZJF%iWwv]aCuǶfs`b-qs|!Zih ^P}(D7Ӭ:҈F6F_"YZS1p]+vOb6岷{ TsAS0gvT2촕/Ov]Q)HU %]g.S)jezI=-h4F|^BێΥ LԄ )#IDu&. vd] 8;|l 3 }̐a~LfqK21̜ _&>/h0= hl MyA h:4&8Ҩ뾶\iZs)]VJCzlIi[2ĐG؈8T_䝛_Ǟ?ض(dή.;ֲ_[k Z*&tl;wVšF2C ٠}T;x+'nwvut -ҝUV -g6h&; Jq#GIpuk֣;~[_f Ёd -.CFkcLp{vn -Vu˸iHZ-T?Ҁ"( q>mzL7?PKϡ46Ei,{,Jab(*SJiԠ1VAة@#ϭƚO4MkΧ4T9҈<J"3L&3idFi$d%we]J^/<^/hZeHvR-lC{AP[~mLj7;e\epe.k,iqS⫑AH,a760¬ܮ 43OOjpcpV,})J,(tEfa?Kf\%Hk" pB )iP!_V4; -¦205:w䨭ȨH Dig(}G>!szPKoHc:ZkSa6 P@{겿Z u͒7`\QXO\(Мbdr]P%KxE:7=7 BpPAjWBBE~0a8:a>+_FW@#{J yli ֆ2,9ɞTHv妾.)<**Jd,NbISԩI0־ &CM<&r\ꇾW|9˸zW|7FT:ojfY+DW>+mm̩y[np'vVX:oP qw;Ӑ.b?R0 endstream endobj 200 0 obj <>stream -HWvJ?A(&gA8!j8D3iԈ*TL:v<UPg O3+([BeưY3`q -'ͶS|\m;WVl}"u"b[?l UII7ٻ790쯓bؐ6 7G6=ŨV.`RcJL@H둬wfy,@TL)5yP81k1Gcs@u^ mJ[ۦF-o4[t~^O[{F#G \IY-KfX9 :o8;nAI%I bf&Y-ʔD#mĕDg2FL,jYzhDZHWH`b&qbb#U-lGz,=kY v^kq/.$f7gSb7 _8p)Y5iEf\fwCIv0bjdbU"-駁g9ڂja?UK̴܄e쨽m^|3IhhSe6:ԫ5/8jQ]Lշ{-6[IW/U0+;Q@̕C9 Lz}Hy`{>ҳrOhkA&|gwhS4FN@NB_AC9BG,az V6wczRZ ' 鱩hVX䔾Q+PSj=n7ĥ Ő`u)<4(9$LSuתa6eȵpMk! r9 ᯎk&'C_ut,5Kv5ܕ"^X -Vpx<6Y:>7q9Y”| -"W"SDv8S2II wkح[c%qt5!G_qC@l5X,fB]Tքf^wlj3%O؟4 +}f9+",*bGsGSHW=7!.N恸̕SG׎v'D>s#ѓGüsK-u?#[~ dï}|IgiٳMB{d { -M X_Cny铍_ߒ%8HW 3qL - OH)qKs)SrE k(j# \ܿj?w_*oQ -5K ɹ'π$ ;n߼ :(1\hFDE 2%;%߈ۿ"mY%>rw xh;m*̦@'/8jQ]L.۽Pĭ*[ `ܟAw'FXym嵋y/1-)X=v*Cs-p ɼРPqY#0NSkqa=N+ֻQ;Ay<!yzTkx䔾Q+P2p"%Vq\!./oKaAB -I`BI&v:d#uryЊm jO&K ~ p\8ًjm҈ !w"3+"?K@$o$uUD ȄPfEDQL8/׺%Kvծυ`"vo:oftq!{Q_So'6_X\B]5# [jw XQ,!S }\Ўxmgхq_\>[Sq}!u@w`$5I3Sӝ]ܴEUe2sF 52*]= Y#@}[#}_I{#3f#SHP$3Ɉ(^P#3S"22Cli=2CXڌ -2CՁ;u:ՇIA<΋b;^=+6[596}&. NJ j`C{W{/vUXJY) Cx.8s Ρm dFKlTX [YDfIpOKwDWSg /pvJF -ډ7bA 5oIҥ`\xSJ99 -{$H[xrtouTvn$ÒjúVXQ\!&~n;ǷXD 嫑<^19(R%[V<dlRhvu2Q%Cׅ5)*#s 1 -Ygq|+v`2AƂPҞh<[B-'d(5J:a6PCrzB7@b -f6Qp P"N(|$\\ Es"|K>Z}O%({X#\{oB!!hqV 69+l-tm!@ghfol>s&2`{_:+\wޜ@uw<߭9) kw?vQRv4hSd95/@SQ :¢ɚ<7u 9"iJaS59ş0x鲊gqҖV&pSA&i]5j$ W2e`qVkNg#_ s66q mZ}H@[GPq 0Z` -E4'\%܋%hZ|7wEwATK&.=)krCEօJWEPBA@i !Q$!G~oaA23) 5ĺDZ_R290p@kGciuGS)_vj.;VdL Gy{,>nUx&AcY*`ThBe8zlͥkhvR ,MzCP*m=8wcVa Q -"?!'3FZ#s{ fh z4zZ-M5fOդ Il (X>i5H|ʓf2*zz)ϼgq;~O0ƾ%ZРc)g5VGhH Իy$-}~:N\;GY)÷?G>P*~,3wSl3wLGWąąCj11%'+3H)]5'eqF97q;A QZ;>xPOa{ NdlE" w=f%3^N.vcqMM$E7&|n7U > xO{l|q cή?$31Dgg&3ٙF*wF2zF f#3A_[2df0l32dȭ"3gYYF 4g@sACs?D./.?ƅ߈V&B9)">Yx&{E@Ѝ\3\ODGA5qWַmP3d=0C,IC c"*%l6U&mQt-vXfEeY4:5ᆞ> VRWB.K0jB_͂č*sHT 5MC<~z*Q @_x '.7=mdp1er'Ej'3N3. -tGTlfo0>W>Ie}j⋗"TқEyBvY|t(̇Pm𥳐ܧ1ΠK^N잊c2R+G!P86R*U$[_ f\[T1d̠Ku)|h$`%D5pS |\W5ѓ(k.*q!{;  [pftS-dk1Р#qQe%N;k֘+Q ?Q]uBņ=7VxmӇ8FJs%=p2SKˇ kيV%޾ݩn#a[aO$?l}*j|O#gvk lt'KXl('L  ޲ yceIy -LNCJL,u!/l✬4N\NNR܎dE̺RȆJ &rkpLT;Go#4yl2} -XP1t*#EF3ϪyKwe;P?ϟ4rUi86o_m./HxYvewa1{ݡW m@:3ćȅHiUrzTÙ46*s|?5n'scޘj,ܴ46q|栻,f؅Ftk+ǝhx2@{0D^,dT^?8*,E]ďH a/+*VUݣ.,ٔ+:qF\ԕ[%`"Rxf#n'vf4kᢵC胇DvZxfh1-kpH׋,j<8ߦt4ɂFn0UumN/󩄲PZUlumUִL1w[ 5?KFRQVKwFqF^JF h7[$[/..rX9Xb1'!]izI]3lj:scIE%a'&C?wHJИF$!p8.ENV}ڈ.]$0L ׼|^T;F7@Mrt=k?RI}1xέ{jJŒ=I.xs;G;c4~Ȅ/~yn6a8J@ HO(("XQyRl7 L{kiS)Ke,]*gUw0'SY A%\|Ai91"lػˎR]d^ -xM!|`2U2HШ)P/#탸/ ^^7l:ًxڴNɶ~IlC=nja=A, 9 -;Y Y1õ !}63a39lfXc`g͌S3b2s1X1~111313 GNv氙aZ!fc9gf@J9gfP9gf>3N.hg"v氙(0432+MZ̖E9393],6sthf_]~./.`tdtQ#k&nMGLdw5uiFdZY&s.Gxi32_+CYhHZ gn d3ZrC9\ y4>. -8i,L9Mh)+"|wԓ - -[ӵI]VdE.`, EMx*%о -# rjR_w/b/_EIl /hu:g0Eh{O-A}ڿÏ-FMK=}ceizYH1K^B{ i_XˉP7UJN;X$V-_ wjlUGӤMF߳/tQ[^ؙ X@ ACڬJX>u$$++M$Ы  6x5NpZU]Կh*A"\>mMb|-dLzka3s3E^Gn֍()m jЄ*.ZIw ч/~*wW偩fb饶 3HV6./1}>vY#s16VmJedF%%,њ{p +RAϼYE+iU,s ->6YX`A#B6lF!Ն=Fcv4bp7N>ډ*3ĝ;ۧ$6_4Afǜ"ކz%]/~E 5.Ki,{-jL:~[Q]!Bf:Cb{O,ZU6_:cMYy Ο:l$6PA>-=aN/nFT -ҥrVuae*u63WrvG#bE$/}2Ә/(dAyT1_j)XX|^Å>cT2zv`7Ir}!1o^^7.tM'{O])6__t=/ "?mI -]9z>9¯aFǹGF/Оy]MKwɳB'A,Е6/zpojזLCf ѽϚ)N~9j3)QE)ğ=UV Orp6vjLe()zә`j?H[D -h5duWo/8f20f2. nI0fA'"u䷡ <a(sQ2Ea(XˎBYW fU -.Tzt.6|x4($/ ѻ^ ,ǘ׺q|d ,q:{Sf-B{WGuT{ UpLWeM[*$c58n9pӱQȘjS*#MmDkZIvP90cm^=&+Lj_Xcbeﳭ0YX80xЈП [ ƌCE -::d`q8fgY윙.3;gf.jΙQ߬M=9gf9gfհΙئ;ݓjVӄ~VoIvr@LDW?f0 έVe}ڞY ?x ?!YCEcgh/|\쬽uߒG8Ig Ro3I]\iۧFl(ׁq ?Nt2CaIjvv=YKJ""ϼZ#?)IS1L@Dh]u{[iXAT4 F -$/W"%Qb&;&ު?-r.[+>28DB3 Mo<㠄BVݒKTKz,ZkYyɽL1RKn&Y_ k1ګ[8KeX3~A/]E0L/ٸ&GrZ pߖ6I"0xCE6!*<xXgA?9!L2)z;HI<i)v wq/ւ]k]sB_Nͨ S9' \P:^ҕ)6@NyrOȫH}<qP5+쏎$Ae!]A:ݾ[Lnsli Öصbm -v~/w~1f.܂h0]$AK—5߆C W 'ϞX>LlmYhJc]~e{G|̸/i&7gҭjqDk3wTֱ a{%b+]xY)We\I QMZwV>즃ڥ\9^.tl5C;[9~ ;PN#!n]mɄt&i -/ -77#$w;ް Gk7y֩XMon.)2Jʦ+y53Aowt ~1l:M# l0F B0{qE8Sݜ1hovHCOW*f-,o{EQp{,:Xk./eg30{H8il˓$gd? nn K1+@PQ x8śʂh{gf'r\Tn}Z-S58瘰_eՋEQMG/FrkٸqktNXCp 1 \Z43N([n{r -hӳ!O8/}D 2a/p#DRl=w+ :)}>S5jiFPax[0#b eErУZ v-/^0-jneIOq-H2 Oy[hS3νmh;/_ oBW]DԬ1QnἧUV N< utfG/o^ʼvfj\Nfg'30܉oJ曲8!3Z9!s}K$7/a^!C"2N;d.N:dL>v!Ïא`>d.g>ݐ̧2?Ґi3wp96a`pvb0[GX`69'y M׆[iϥ[[SW~y]$ \OR'|Yrz5-M%M<|9I>s"s+ 陈ʍP\ih -yYN:\|e( kf̥ f%P${=uUN?SC<(fM&Pӓx$ZՎ~٫ՎԌ겟y ~/KI(yy]3K&?vMdsҳǘg_e[+A "((̈ "Vwf׺׬uKItuw 9]&db: -Pi 0a?.m.%G>gR@rKo^tBg+ɊefU~55 muFeh|f%gztFji}$5[,V?&h~AAc&XFFߡ -Ŭ84Ο`K^B)dsBvMxނ HMD*fH>@aC]~t<_NOhccvOE`@\Hwm3ff=}0&F,=Qԝ:R4EjIyŨ'm3mH\T,'w 2 nk~2`4 -3*=TQ6}!3}?g2 |&3Tc,$xJğI&@8 b2M2_YM2q_yM NC_D&@.Hf|'"ӊP?-2>  d Jg0LH2V -@ Vb9rDiA[\'Jr3_M'$@晘cfmp7ȩ҈"@د>Y{0(W$Oj]>.!w#闋?ï >stream -HWvJ~B#(t"1)h4wjNroNZ03..߮E%d4&TM]Ur70r}w{*iY1Zb*TLע19} - |jv#tI}eT83xks -ք&eՕugL*=MɶM37RUq6FB~J@X>-6|X ¥ -֕ i lv/c0a4vmMɞ -3J,[xFbp{$+C 䇾+ `Q 8Rc*8O 0}%*W8ӊm7oˌg瀋wݢ\ue)j6} !OdcdSL^Pk)eL'>~Õ}|D[PN׺F=iBqq6rXlLi<F]_p3iޛ7q ձ=-;HÑ H#+EG$Ń$ -͎W7g)剺ݿ@\"/.?M6{̀S6aF ҅p-ΙZָv5$o"'VK$hIߤ/ꑸ -@%XPv vŖɫ?奼&Aד fV*c寯%0yMŊ-ltس #gy_pxHpAzXǦSfۦbv]2%2r_,m9km_6Fx݌lqPyUV"I[*&!ƚ 9~xB}d"jYnpR -} \Yt|%|"oHyfn:з7}vh*h$CG6$ >y lT/'rLœ]%}TΔsQ+Ep vNRȗH&'k619+U}r_T.\ 3*g.fH -1 ),sI O&ܑYr b2;x pˉ5,p̅ n2M&N=r5bmDlFu݁L&@'OD'dؠ:gQƐ)+7 7uVcsPl|Pq]| 71oq /SrqiTPYUµ >X38|߄b UgV\ENy~\#>mC}`p)R 4GY t}|ݠиB$CE`^UݝNk+}>d^m< [VHY꩹e;zlF\e] 9P#QsSZ|NZp6&OYZ֪hX-M4mcQ\:"]e!ju^ᩨ$OtV-'B҈p筜řVly[fT-,3^u1y)9=Kb CԖ8Ya~-[fe4^U9`1Ì'd~:]Kux0 'Qw<jCr){H8im(lPV:_$dT<%0R?Yo+/v9>f.*/s Eg+#-&A/b4 x=x.6hv'0qxXZi7Ժ;*_8 -KG@?'&HB-s*7rQ7 Rs%ȤgZ6jk|(( . iZ9ra&7傋V}~}A/@DT5XL4^RhXLҮ^tEj1bn;iՏL*ލaz'5*3Gㅺ]5HV_ț]"f^i#JrCjzJ]x3#4nfv@j척*Ymf;dLG#I:3nUYfw d̙eI&)B] M vElf&rdA̼;tyw&s@̼;f7Ĝ_`3;H;q3#sq3l͌tftYDpx/PEDzV#fJ{FrFg^Bd~XfJϦ42x#'PшmS)ׂ)i)ަPrX2]2T<_*y' nt6>&YHoj>ɢ>rg g1`2t ڵ^nKr(absAC8v EXl`2堞8#_GSE/!%2 6F8h<C&B8-i49୻iS!#U;yLKZMq?T H9@UpНi9,{-q X:o -l<] =V>r#36G՞<{cS<㾭6uP"۴dҷO<;v92|%< ".>ut4 8 ڟuɜr?^ -l$F4!FN -ᇴ -a:F*R/"Q2FTt2+= BKP.yb|N?-}';Ng/XsR#@iB<~9,'$ןr@yA8]9'8z -T廗ʭ - W - -c_6wN/_FLY8Fٴ^,,(7WifICaq^=r4>LI0F+ZO%3$WRKښ<{Et|WۙtwZ*Ak&ܜJE3}[)z5; Q`9FO2V-bj>uWLƦݚ c&{d'7;6ʄ^ߨ uIlAElPv@9zPFH1G,Wꅝf -8Rf&K9խHEj8WVr 0 롏;_[3A |HB ʚ]" ; g̘sIUފ +jg$wg~ Fy":rVg\Pt 1mWo,ث0&hs dboWtYv>@(jyd*N6Q"(r#ξyޞq4^vD -b:UY&E~0|;PÞ~Ldp!ENA2@tȀV!cqi.]WYjI~uc/sI" XbKuEA˝:XKME~zL~ױn|ހkC/N=PG X^'-QhA|xC<d$I~:4!k{p Bg }uM…띗y~ef2Tr;5?"i5JhHږWI-BVo]Frp6QvzWӶkJ]j[ڕ!'lٿ.W'/JaUߡZZÖA>~&(^ӫg=M"ظT~$6K m  .sK1s;og?TD"MCT`-J_ϾGaE m@%&-E6۽R Nj#GRR "B LFɒ؈JERvS7)lR?sutj0_\u)#e-1ko.'^M_;)Oxw ' A$aHj4~S`գ~p@?|C\+,<Ր}*c\0%]ۉVeam^]RL#EF6MuBE3"OC_8@ daϋ&m&6uE&-B{>TFm63L*alڤH]ȹU)]iuET]L-iu94dN& &,YƹI/,$X?L2.O&scFlzf3 9fcNq.-Ờd,`%31Hfͱj-n;4H_mnK_iگW;f/gv1#4=:fastfƎW7ǼK&eNh2bȂ}2NXf#Z=Jthuv~LPÙ -i*z5n26x>KiTnj7*7:r[hc@7lhZ܄FcE h3F&]O(l;leZ e夠H*\vӫ)'E[Ww;AZdqOaf* )&m2Þ~i!NAmp@tti|Mhc^cAgvq>h:̐ 8%,_BsHj,h=J$WrN}B  -( -n nq_f11jVax[d>ݧO Cgb:`-d\IM;7b,UZj/+uV:;ޠT9sk"Vƪp{#RJ:xm%päӋ!JhKJD䮈&J#;xtzV73Hf4~!H o {Ss[bjX DBDfMrTڊg^xe9_,>c'H62 |"tPy%ޡ%2 mɑ&͗_6e -zk38梕D h~NaLMڜ|6Kt'8c~H%=%yp6{PC]X18Si̺_tk,inO4¼l9ⱃ[k.E1v!V cfU2vߗ/^Z7kL@"FݮU'dȍATHVE}6 lJ!<.Z)k5>dU\P%`r*U6];Q~\/ofA%Ghٖø!X)4}7=&%3i:C);re{?v T—;3az~]L*oVL`u&oNpĎt#oYnrObs쏓&0:֔7Δ^گH("-6IJg E$'5$\%DC`ERa~5,4MST>+O=TFEqZ>+εSy[)c\dwɇE @Qw!Fb2H4 $C82O1mZYR)b728*;Ų{ѵXz &Ǽ܇K~{~ڟ~ڟGO3O30'c5ʐuX5N[er:,>~'LJr~nހ>v`!<ײ-;0/)BwP.:U%K_|gw@aR@'c+ otl3ԑxgym0%qNg[Y$-!|WGOtUCĤk9KLZ&HLgmEm:c/]t\o?ϰD!# [Ӳu-k2'[e4YL't.d] љd9fyr[NE29e{ ԋeb')&0{bPfvO1{([3 \{{(O_\9\49|d :s,=$Oer erx(\6. AU2ojf3/fvO1.f>;4׊1O8?4u)!e<-[\ ҹ֨yhՏ\v@ST(*'{%3bbtn]RO;/O/Zm,6e+End9af"BӚ@BݶEǸ*K K'Ga_SnRy}?@bΖ Xw|v.=R̘ɇ[&į_g2ECerx(\6.esh:۟QfhMW}2L7L˞qEWи<ԁdg_DҖp̠[=24q2<{̠^+d؞t<ԁt g2[}%̲"Y4NYfBE B&Ml*)ՓGE'p pm :Uy^ ,qjE`-C{Ze+hǽ \ (*ttyFSDQ]OD/;:)IޘdZf턑GM947H>ܱMcr;IQft+ v"xlWK@( 8iӇVJ8棐;ɐ*F}@<p環;zU #zcDvE%2|}M cMyXTԤ9v6h~U1?J%LAl` i:(paa7&S|?l+q ~ $ a aQ@AEEP8̜/9tWխ^yU9V9쩆U\㒒sIȬq/G l[Q/2{J&XrP^J_I-|,?]U] -'ԋU>!I|!9"\VaXNu/ceNC?/h~@I -W!7oIB 13%k !`. 'j٤Fyˑg;a4F(-VP1B PX."ef.Y>3ӇċcezўQ`h -2>j!œ\e}8&I  Ag[?x8x >p||4򕢇A=v=-7xsc]p;;kʚB:˚z[댞J]4S{12fU 5>yx aQPCJ[J2N9C=f6?6wkßbgȱ^=joe5$_IYXe< 굨mx%vc>qkj$Қ(&~^B6Ã' =xZ]Z׎`:|WUwhD'SĄ"av!(5稇 K~DcF@_neSJWUp7`kS%a `Y [-bdG q񧈿of jg.73ۙc3eeS2薝qOx[˸dD6{Jbү) ˷&t3ǘ=͙c1fˎ3?|C\X<ng.73f=3ifrE!pٸ\4u{E!pٸ\4,PSlNʘY=ƌj1fgLf͘?d eYAipգvZ[r@5dNEV'_쵨mx%vc>qkjn~VQLFCeVdj yyFtP}CKV&?]AOB.-C ;*48>?$hzMǩ̖'$8B y-끄3AvvC}mC jK؝gϥz# -ΤrrBTG^AJ֔C¥8kι/9:T :睖Mdv^h5WN[UsjfATC*|}.Zk 4 p xWf5Mx)!iB&?+Š^?xy&.qq| SqrvH[@xV?L%`Mmsx&ΙtBU2)md"V -;\sp𒙏!|0h̀> )>$^`β(cIAhw E4T*UK]u}έ>3ā ,>36w{AC"aJzs$&6K[6=MCY?Ĝoa{ αO6q/ҵ( ?"!\luPݺQ?s{l=cKF#iJ949Pp-E%o?}yNE}˾#fp3}{bj -v{q41{ |r7?N BFS!W'%I"B;Ă]|R^%)^62:QHjCʴAq3]S -kᴝmSt&E#^,Pir*jRJƤ]pCwdz ,= ܒK^  -Wb<ڛ.|ܡO\+̄4LFw ’3qك-eMrIyKUb2 ZaKJk7a8$/w\oe -ΫkqzIߨcďK*[y÷a7pmB跐E[>w60gkl64tx)1ѥLGs7(:>ݡUuc- N.B"&0D#i r` Rwȁ1 r` q1+ ƶb_t9C]`]P܌/!C`\ 爬G%W7n;{{Iy{0 / @[#4<-A@Z:^W~"82۪RۧJ>ɩEq dtf$Qy| ]Y֯:uգKjr1z8U]{&^DI\ZȝsXj4{ʖ2Tdur(5>stream -HWkwL~C&I)J"CQPR?{& ڻw=ZK$3cڇk3r:Ԅ`[~@t]G煮'0 8DOJ %F -hR -]ٍ.HCí[)JE+г`2)p-,Ǔ3M&.;2ʍ"L}.s0[[:?~PьKmC6Lf@^KBPJl3v'[Gȣ2} Oe݂,7ū+ddbO]Wdu xu< UFE ~ -zު4)ytl#WXͪB]NL=`ICIaSŸEwoͣD)Fwx!L_4*J161{ T^^3ڴ^v f7M: нN_j 4dK -Ա<+yZK0vFѽ[?{]Vtw72MN_xQe1rm qNJF -KlU뚔2]#f;i,}OF!G/lm]prpoURETpw#5#DfX*>V*__".(XSp3Ƀ9eW L %TzWvLxa\̖>/tPz!R0BͣSg}`MjOPL)4Px'hG S5j;.wa:/ھ|hyKlvW76|1; -[tϐ8ekvC0|{(~5`YQ3`Q>X|s.8m~9i prx(64c8m& pP+b̀ӜkW f+-tqc#.F&<鉹xJG!p'b:i4Yeh4&i/qvD3**|z?y=| ^л>kr>\ٵ%cb+T$_l"߆ۧ?03;cf_\/qaĘg=졎3Tg=ƌ c/qB% LGI1Zu18j\Y_.㞫C!GO$&Lrw}*"BIGoZs ^5ՄDM4Xb1v.7Z'N/njs@P_ p%@t`VZ9ﲾV ǖk9)9@6U wwB(i();G *ITQdjsº6I&xɣY$c`;LI#`K -vi0r`> i!Y!@2O4# F[*o/kkp*\9I  Z&ͪN~/a&sW'}Ry,`K2"z+q-,mՇ5JMC١{ԧ^`<F=xm%!E6Ѡud+؅YcE>\|t" -I\7,~hyK8]7n0*mJ[=%.G=mL9,[ۭl,pw^S,<,<`0`QܾSh/S;J1C%fok&ݸ{CV_ހy?Wv}EFq8%I:rvWծ{7#@IG5APA$i Îgtn A]{|?ڿh:oQe02B*\ {j,:JwCc\WEPk捡IN`Ya/1jV2J3]6+Rv@ҥ&P|<%%wjEyZBaojLVY%毂Ɛ]oiaJN4La 1]_`'Me7 s}6x*95slOR+=tb*ѿ2OE -qba\1I5e6$E2?)C-,ˏąC f -,ɀ撇λ(y͊7C~xDԄMm]x^e΀d^bGRf5;) - iGhBW%os{ǒJ]ܦzVP=6bKtHW-ƙ15=0Qu#[Dϕ'sv%*V^e,WUN, -4l#tjfZd`Nd`^IDEa9Ȑ̸ 1́\NFf. -ى vAtvb2\ȃ/.'\B6Gmv5zR1Y;6|%fѱ$&SZ}3/d~@_B(fRk~?VHU֪>wM_o!sUFÔhdcw–75.g Ul(M3-aSiϩKe{Z^҈Upp};uTW\,L7JM(=2Z"i_\/m%hlO*I 5XfY$-xA(`.BViX\0 Fa^3 q}J5u(f&ta#~+ Dz=Pvc(2 $r i(w5)6-[?Go鯿7 7~2~ ʥ85h;>G''|C] )RIg?o,-#RNƐ?y`b\})gvn.,sqyyzEy+ 3 i;p;d;)aXk,H ?B:e:D& _9.*k7{5aٺx,HG!"пmcָ1įx B -w -6R%ۿnntM_ x0#&F6: F%ge҅H1Aˍ; ޕ5Enw`זctyRe-yvǖ\bgFgScqQXѬ̯"ZC_yK -p{H/8ձA艐|F 0\m^5|`_)^2f#nnv85r7pF[FQߵ&Y<&-q?eea0m?!TJ fsQ@4maDPNڜuΛx~6`iV-ƙ15=02 -t(9guH+QqeY Yba_oL8\~gW\?B % @UX98_| m߽sQ]?+H9f4A&o9RHI>-TDDKh+*\E4R ۝17Sb/?"'OKS J~*ժTnhŮ,; -.aÜy{>TkfׇYҹq6q4HeS{EJwGA&**jn"^VrYW9[6(~1[NB"D+D cbcGUX]f~cQ-I8jk~L д*#(޴%my-RZ/6 $,~\NPԺ땲s^E8+܊CrP/ABL4O}Q4ͦDlClcitf3Egf̿!3Iy˧uN淺אꢳ}d#3`3 2`2 5>kLml6!4>fӀ.hߘf/~ 9#3,t6̠K2>2C2 ~i]8&0YеZv'gMT<Zg!_WIt&m.)o=y FZ~q[o<1/aUWP؜Pf;,#k϶e0 W,Q :;ɋDerP udHm: I: {?igYjAjEIYZGU17I65F@!]Ti^ Pb6>^'[7q!Ze{s9 B7u 1XWL Io914jkV'Y؁b<1Y"$Oo>S&-͸qsp` ~܌/B*.Ƌٽ[L >`~6kV4 w-}Dgm=^ܽ  wžTvr%rU]6UᯙVC%wn> &XVTt)V=%>ǥaLP$nSO܏`˲0v[obXdMo#o4e^"{C\^*dgBpX?r aqv~f_ 䈿|aU-$nqpypAГH$6cr R ~%%@w]U$['PcgG!:Ԥ`u$q _Jz͑Xn^Q#W+ tX7c:{=ImWj$O)-ċ xW^Wd^Wf8d<)a!e2E+ѧ[>{)mE+r0"+SMPi57Sb/?(.~¹_%f|SH?b\HW= -[AVzqA L<=n*O5ӹqDÒef#z0qflt# ;͜v -ſE/ſxȱa\}or\}o’Kcŧg2˧wuzA?Iovmd~/~+_<#"_+r}4IWy~AyDl;|1' 6l6XV9 {~OLɟl8Q|SRsw;)‰R>QC;#G.CZ{3;PӥȖb2:w}߂8ѭjY& ~A0ޛ<;ҧ7pn_ƥd1ɴh CB U)~~k0eZ -O3FE ?2BVbVL)jˮ!D9 I֬M!ޗGW.ɓX1FL㠶48i6BiWN$fZ_XE̺_Pl1밬ف~)1êu.z/cG'C t1>2䘍dX̐.t6xa-xClci669lci6vs~1>2C>2#}dFymd%d649ihl!32C54$LsffdŒksxrfG-af/vqiKA$6o]>KdtGnEe&Oduo>a{GvゼOr㚘QMT<%?Om!ay[&Z -v=@ RaXpq]xJG/X`]'<>A|dːΓGRKڢ8ꨰ<[NؖK(Y3&bl%K=$2FfPuTCʠd1gfs {SI8 Nʲ r䘃t}ASm^Bq_x ݭciUE !$yHAeRQGNHp@Ut:{Z{v[5*+2<֖p_AC^OcBqZ$jopŬP]_t'q\krq%F4!'κ-3jZv% l'MGtk+xDc(HziH)^K' aEIq=d')ju&uH琇_48Һ.'5(yJ(a܍᪍c@]-D䓴0/y9~^)9D̚,x0)3"SMQ8׆zmc +/JnlXLech5Ԗ<-~_D}2Wr^=(I$ʥ6J|Ի]B/"h-Bf;. &k5NnG94BI\}uN\B57n߇Y4#|"IE..|F<ᗱrl:i).6W; _tJ - O2D }p}:.`q1F ~{/v6:Qw6&Ma+%R]AĄy K.g\e{y?RN>ZOt -P(@s*r E]$ZTȕ_asdx(rqA#^4XxC9xC9x*f8v\^1>fk3XyDorxC9xC9l_e6 P6G (X7LT#Ca x/Q@ۆQ@c)#ƚMZ%˿o^Kt~}ZM,B$"ZTj'|+(>C99@gsJcT7*8Ӥ"=Heeץ3u1LO/4  N KtZdj]3ˁ0 Q$E,]Vr#lPӄn?Uzr,4\ũ4 {ayoRIto~ !_VO0ulMm86?*.]@p2 yY/kPɵg brz2|Gf֪fE -jx`cJ*=s-O' yFA+'02ɬLݿE"/b9/TыGEQ=]DAIjP/vM߃FT6r -'NP BōVDXFJtrsJ:-!QM9lD\ntB #3oL87Zίc?L6yǔp?^:n)j!&p,ӖIoPlZ1?4M { v ce I6)A$Փ0PJ%M ( y8 cFN^xs_ O^Vyz}yz+9/dHQk#XT$fϜz˹^\EHtAEĎK}C|^F =VFQ2˰n)[تyHD[zi՚;Dx"1`Fk-"6HtbU-ښ/BzwFQ\Z+\2pyK_1wTT\Ij,&L|ѵc(), O* a}s,t -]0tcaMb{/v6:Qw6&Ma+%j=]AW_s30aT|VE  } - kciL2@W&;I0s~yna -r@ --Bh -H w -9XY${yy&/u}?ԥp` ICُc\@'J>x;Y1;A:o~|jCoCቾʖTUO qv֋e:{֑ϱ_j7 -go"XfR?zMZ8h9ڷNk}]=,-wV[s]ÂD?lX}#W?j 6@FiW1iI\.a W+~=غo#8X؏ DԄr )ݾo9] u7 C&?FϲI$/ 0_\E:A5QW-Hb+XS pU:DY[Vi"gZe~1Cm4hxzo΂q^$ͦC4cfV1>b&3ḠLgbN?#Я.ӓ7t %2]Lg3 fDd3L[>hifi4´|4A,#3L6@#3T 6̯.;]z;ib&ȃAb3A 3A _ WyE )7I Ļ!^cg3YGzކS.POFiGsror8U -&+VlU:4@Y Xꞣhb|mo*39ΒB;U@ 'Dc'?TD2>mxl˼ݛaDw[p hh2Xi-#O*c/!b}L,E;"R0C*TA5܄=sIs4fIvCarN3O>żagqE/pfCp}@%_E^uxi+H'c3ftLлm)pcM, ~pˑa]7Aj0G߃LƩ.IDMtW~xYbΣ$OԦJCgէGhЊ?s2m*훻ܬ>G )pSj,.-z[_G%Ò1)jYZ B}y_鷔Q2jqS:,Tm+݆z -cV›6o`C~Q7ϳɁ fv8=9'ɕO'r&P_XrH N*hx_,&TO0iB5zPANC3ڨZV~-5l/QMfm>aGiĶ9a3u{-ԋctxR/u㲍Ht16KD G٩3U]mDVvi~AZa7*<ƫovgVRWUsc$$>\lMj#5{t!0K AJ,4#YW*2%g`PnyHd MϘggHs;14 -:díi**B3!|p%UˎKhjieʤ'/A)pb, -Auo%J/ ( ﭗNR>Al9oQ?jVt] - ʜy٥AԬte?IŻAg]Ʉ/Z>AQ b2}udq+f1+f( 8Q!A>@ӫ,t8M }@^c_R2{}R5u|ioζtg[LCliVp شӝt92mt6ӀG͟f<g[A- 8A_d[aD/h$Ki3nLԧRdvH w=k]){Sh=?;K] ,4a+υD K ?T%~$=MP8O2 d+.^Kr* ;T8+<{c4x.ip -$/xq]+\_wot"Xq2iՇN7 ,zeru<3^Z0 Tȕ {RW ؞ dQ$L-Bπ'+??UWDSӆd/Qp{D9 ޿|G=-z _?-nH(0RE!:"}{q+=΂1x:[aßPMp^aV[*17SzxC|; ~P[B !Z&7Sˠsr kylq-#6.VSMH -$'tS.`G7O=Qf/dM^.1#9%**P]Rv 1ʷZ$F ?\b&ÍѤR8xW)KHGw??A{D7:7-[z3('sf_|Weլ7m~gn7f.:^Yr P{ri(~*WMCn]! {z +S9ct@"99SZ$3p!ϖX Q1P4wdUۿ=B2ohnY}N %mR1PrהƍhhG4A NŖ*P{ q)Gx1^&..&h,:^( IJIbD`LPLʨO%P3SPw+HiG4±ؑܽyqp8왮z<3o[Xvb{8RWX0-GQK3[2\u -xyf7SD뤹/Ռ< RL i:D%֍ g0'%@]d$\ndM2zz0X3M:f&oҲk\w] T65­]&v\z }ig rOыUOvq)Ҩm5?![$; *3M"U$6p^cF)QuC&:~W;q1 wKen-+A+!oZd<L*wY0LD`t:HӅUJ=al_nv!2$y4noU#B[Gފw~Žo\_<&ҝ5Cj\u{a@s^7?'I&o1d{@9ֻ\4޹0|e0sQ\Ԓ)\1x'dk-r,9W߹ȩveb9$}n1@"+v~zW2 -4ZثtfCCC'OM Ltڪq#hO@A?27ԋ]ab=}ӂK(Z ;6uMGNMgrTYTvnqޡy2pe^$ CODç`[dBK, j'3&f Kl%n@O')HmwPm% &[ -taW/-Lp3=v~0H)?3D8wߺcx砥I{%dv}c^':$46(MOvY6sEwqʹ7+v"ǢQ+[}ur˱~P3:C!D\AV叏a2ߗLfVy ~:j]k"٢Ow3_DDH@ B -<{WWwxеj׾KT1{xG>ZC:ɋs2r W؏S'k`;:N1+W߉+'ufbp.[կ[O?u|ɳn Ƴ(V14m ;z_>@C3fn3o6'7)UTWVT/nXhOrϳ]D -$us97{켜_o>Na#!_Z.]S!ۆ)Ga~.vH/dx,o`vDbgҹw 7l.h͛,1twYToƯW?^ƿvr>¶Vo;hAtE e_={i-UWx{jПM]msJGwO;'mU]vUʺN⠝OxY~,95>IGkW qP۴8vȓÌmt^[5+Xz|I=w$'I̭s?;u-\__uUAdž( -)#W(Y64i+raχ[|ۮ4g˄jwYұ 틥&FKnǘ1ޗ>T?Ӌ/PڵvCjEJ.>ʣϿ' w>^/%ş=jb9="ȕ9T"EJ0}SM-${'ʆٛ_j87__z'߆7 Q ;mB4ި1o܌[[ns0woxfëf1~+ퟍ6z ^oý5̤pct6 ZͷȢ WF㋓'s@ ^|&<ПVgM9kbY=_swjpfJx#of_ߞ4aW8Wyet )˔4\ ] 1i"HrkVZ 2Byw/ .L *^ .NyZv2,p gL6;c⒄( &:(Vѷ s]J Y@ MB:-T:E) BQ_0n*99I}fBLlS ܅Ђ!I@a \0Ybs,i/ -T*V&Rmj*T$T&BUդNĬҒ[wQ7@U#h j2HQT˜Bdo)j8O1 t9QŭQNЂSL $̓gUZ!䁖 Ȳ:,ζv ;r1^\mdk4Xf -E'$\$UJzXSPGͰs{?!ȯ8b TM`m p"-)XJZAe/h R;#$qh64b#`i!εCD3i 7 @Hxj1шO#: rKy`,<X/<I $"ޅqK" ŞQ PC Zd/ô{k%d3xqQL@kHUg/YfT}1*l "V$<ֈS&+.G0?- S5KzAI@A2"R咲 JeP[kGT)8 .h' - SRXJ )k9%?^AFf_(kMGtU07LPs~I5GjYd65fsjʻP~ce4"KC,(6s1-p-kR,Q,!ի*1Ux2E!*i(N\I+J$=}1߅>o^% endstream endobj 203 0 obj <>stream -HW͊^}e2kT0C`!dmC쁉ϩ*^-&[oN(/￿?ݏt]||ç~?MLO?7o@pd~{o~{7[:s;~+H\?J=Jzу?J)rB~ڹS˪!Qď\K;RN@ΩH;Jm*L ,.?݀F=u6~$r5|pI03'j!MK_WQ4LZs0mXfm|$ wms)߯#aC#@D36ٙdP}֖[2MQ .cm1ڛl.]r_"{de!k9e=gO):~dWQ';Yo\j%YqAZ1PB*h6l]zQpBi5">@kP+?&R;u2t2t|ofɪ ۘMۦhS` -M6E] Zn -ZM)ŔLh-@{~@hSs˧WP?)B -MЦ@QX s - /k{hBe!x{|&6@9716-MЪZX[Xu[T&Xi *xS9{dP׋Ěd> un_u!6BTYb`0 €hc)e .14Ĥ\xW/l.QU67JX|wA -0b2zFel`FMZ{@q 둽Ji$!j&Jm쐧g*gNxЬ@MZ̄<6%xMJϖӘVk:mj#?NjBEH$MmV*j,Tm1m)8@,xE31H呟]Y~%%fCh,GoF_n-'"W XBD6}_Jԣu$M^F;Ё4^5(=5+fֱ 'Dř8D*^@$IFjRJO);ۀj[ H u~.w'xWMw3/ƠÂЋxBUɛ9%ڹ=əwןmhdYyZiWẍpDyڱ.ij !ly515ٔc^gB\zPX{BB,+F-elAv.=˂9RiLQ2=}٩1NRlx(:%Εϔd|YzNU':5j@f?Ψ*ΌVR|A=)8mܶo%pKMՇG5&g 2 wwlZ<58(ajo;yN,SvICo=Հѩ7ޢ 5 -*]W5hn@ !h \k{Qk-҃1@`}2BNV{'TC=uO^1=T]u摘 !!v<Μa(dYB8{1o0ib# 4<6΢),^|ytVcK=V57Q6S3vWUCYIJѸ@SNajQ9)&U%Sn7bgan%n8W kƸU87ʛm"|"C,Z9g`LtBd/Z(a 1gHXU93V*4I"Ԧe_˵0t HVg8:5vrIYy:!<NǮz(?\ĕ8, -'F#W/Fj[?;;jt! ŤA[(h@AD,?dR'^E 5,HM\<&a<4)e} AMK!Y'\KX>#h%)&\fDӨ@xWV1ǝNg[;r*<\4_dCAO9 2F ӗ*(KxTz'%aRLANhBoˋ e#,ZZZ+{ⱇ 8rcmA(hU46SJ -hDu:Pp+Jߴ2.\ڒR7>qSz;Dq U/Q -e=5©=! h%n:RWVquEڕP[8պ!E> -9K;;CRn@̒M@Jܕ ) ngrE`vTL6+N:Mv5Z( TWnR{AfOiSvꥎTg\usNiL=\,}xtGmK6E)g(ڦ{#7DXIdBg?m-/:oBvNd$5! ܥ$Nk"TciSl 9s^Aa%^x5Vr~ÖJ -!BMTw` 7돧iF#UYZ7}>KR)B]Ia*u>86+LE$@"`GSG [ԏDJ!@ #s "cTB%ﻛ]̵n9bqO@Y<Ne2U1_)Pמm٤UP*ߝ1rki9ߘSI׀އ=rITL0Vw[̫nd Y!PΞ: ݼLWER.]$<{BMdBXt 7B.Q JeH*6JTl(+H9je])AT"A}#g`6L7$"O2BkU#P5q͟y[8;V2! -,WBJ`Qɾyǻik:lZPaV s,w&\2"TyvNdlTR.ت;`|wʋ[[m791lA@n@[@B4ůݽ2R;(F|C6#Џ+d EÓ͈ v #ͨFijmXIT-]V; H  Nx8{@@U7m0n%G̘J0J0!…s2:ݢͳy r=GS+XYqAGm $ڸAFe T _ݶ d˧)QdS(1OV As_2 B.VoSmTq9vr^oQHcteihj7++$oN7ޓz7L\' ?E-#-zߧqw`ǺƦ,.ެ1-{MJksrKr~uͧOƷȒRD}fϐ\ԊH`vV -_}yJ+(ަii~I ]VZm-<E/FN9S^!z["CզL~)dL ?h| G}rO>Ǹo\|k3/oW?w?</c?5o@ -W?;_/``#Y@;~ p|VY -K*Ԧebg: α9r xnc˜?:%l !.5jt fibqzКE",ym <;a g5n7@t.^ 1y[?6x1_ޫeŲ~AC/ma4~+1 -03<Uj1hT̩|E$-)E%Xv:ͶZ:ʊ\e@xfպ{+cl9ufEv4J:z]pz{Z}g{ ńg;2Ok:Emj%J,Kƿpo(_Ii. ߃{:2Ȼ0b0 !?v b@^ @XL Ykfׂn;dw}o/20)=" H=tYoHp,#Di"qHBߡX)ߧBm&j|tS4hd$)hr vʑZr_/JCʣeeA%;hQ]XuyT[yc:.HyY֛x1"Sc;܌q5*I6?nwv)s'<41Bq "_ odB[ze -ވ\"5N9Ψg^r]9d @ځ{ V -^1P9g Q?Z&Hj!"e"7ɦuPS IM%tnDST$@KYg5E~ẐJhOrjJVCRH̝lFRKU pgE Oi0շ)PP_tMޜ oZ=7l@Y7,Fav}M`PU<9G712i1lSKT+qH' -b'rEC؈ۊFn5ؚ%C;~(H>b6/$K m0j#1LʃgA@quZE6eDv5t!> -"ddȘlKC@u4F9A-s]06郴3 ڛTF!qiCR9E+` ~RTEFTzH[)i% KLkMٷP끨A"d:Ib-55UEUnZ(v<'X*KZe},P*JIKf?M ")'VhJugYVm.nA Eاu -pkZR3}%+WU*I L5Okۊ'P[HEɸLfdQ0e爞Ϻ>|f$h[WvTJW[tEӵuqjdCs&f)^30T[Vl!T06iáz7j "s% U[yzYnJd* -Ԥ!d̝hd(lB{~/WoĭeGi!L@87H -/HJo&>֙DB$9h7ShbDRi= h7 I:g@&'y./ W.dJ<yc Q.gGr#et9scnf\k>TStB+E;2[$Ы^)|tt r9Ѫ=,*`dJOZ!zK?keI~!?CѼ 2CuX6뫳ꗚUD:ҿ̿ҕB#HwXBh% M!'2Kt 4Tpa+qB+4 -V^.3Ml.0B -4]*^*#F͗DYmC=Dw_p5{'Wc-p܆P#:`Cf_dufrPҼDPovEX4C[XW~]֚s(WGKݡ)"n\mBuߴ4H/ϊ=eD ӵXXkeEB՗ҦY(]$#N]#BOlY^wDk  w@ܽ{Ř N!NBR2"ʻgޱHJs>ng< :% (Tr -_gۚg[,#A_΀#]%K盗dɌe.Y5,:7ށ|,Y1K@.Y )Na#mqbسrݬrEZ*D' (Q!Nl: ڪVj(fvU[Qa=FrVNn䤃 Ŋ S:5 1\O= o,byrqW?Ϗ~ztw޽kl~? <|Ϳ?O ?{h|@4XA,㐟_88=ܡNIvYXw1z}w fPk4P>IIId04v4Ց6--vz* T,5dFMwc/bu8ˁv޷k`%AhS`KL=<<=#4[9/ nu_Cu.u -:ym=ݧ}q3&͏<|f>GaQ\8<ΨGae =gIA#pu`&ǩ7svҕ |yʼgG~ާpg}RwYqw7sW0񋯥͗WelBxr0iiDdF]!"ڋe/{[&|/&$Ck-u!-3PAr˕c[&ɲv Y>xsBw+$kcX:a_d 25j;UЫ4Ɍ˜HDå{5h Aܯ<1'xWd.a)k:HZ]y orN_\>*~k'[&4;vzGV%k]隔ke]637J6<3^ţ1؞!dt9X^@ЯccsrM ‘%;{.$GKX-d8#xV?c/@ /xȱex0^sx 6G="2x. dw%^2xBX/EœehJ'&Fs!uHXw4͛5fW_;j<.`P郷gGWys22[- dpVC#v0W1~/uHm΋ث}%3_ C$+\z𵙓?jzL5OێJSRwijG貞65\uiǚ^6;pÒ Q3$d -FɈT؏g͸~#eN#C&5ZU@s yc^LfY `)r9\YQ }jҟqބJL{%C轆Da$kye"bN;X#AoP}D([­كh]Cمh$z$-ήpoY[."u[+L[1(+`MZKw탛Y~CL>u;]93jzTΜCB}Va?$qDcRMZwCA'N2I Ʊ^fCgl!!uo4 Oi(" gVo?`(4m5T,*!Jk;16[(LXU$:i xV -̬#f*k*ۛv@VrMТ闩z -S(Qv+S#2B^d^N`heZVT3lfRo1l9AT稆>9ffվqرOER,xE'B-IƮi Kͣm07%xLE+I`wk)mÔ"GMJYrGՖAf Sf=r){q5SGb!ᵈ?P4G:dygBT"DRe҄fBU8ct+DɛY{nO~vAe*ɼ̈́Ws6&;\5 E8jҘ8-5jevl^밿U~{=e6&_)K'e!mI4d4hGclaIL,CDCl?M#\͖DCi4^aH;%m Ĩ] ԮY:}A>^8AhnQqxE-MٝP!Uw:1]cKuPVh1 mR+Q"FI>Yp:3hA.%J୔=U ]F' iq~.:״IΘ*np^oa QHJʦekh_jZ[AzmeI݋_yMG]ht]RiZ0,Zd+L̙Wz4FBl:(pQCJz *|.|4w_%1j O%AȦty&|9*A -cXLFq|А2f~͘#BG9>ʜ'b`g~>c -4T{.pE( C߼W9] \б+](@|R"ԥG^ J \b֥k+漻i^fS{[U﮵c-\ɻͮLX/ hl tk6G?UH"BD?N.7W+?].d ZiICz h0*% "= ˆɍ0GC -cB `6m?q܎76һJd0 bi3E1%p PWը7AK^~#)v:')¶͍joZƧÙ!v35ύͣ #,SJ囔v{Bl1 uZb\Ű@N㱘ċl;c/%yL2ijv::9>M=ᡟݷ=t]S2$<:/!(.\X22a(K̋-3c?+]3X7Q;3Ynbנ_鋉5G_iT?n|Q+ ˪RJ[IU]/kJ@Iό+܍+W,RrkA\k{jMKoBS=ݨRlld瘿C^"LEZ9׆:1YZ`g!*}ۯNRGL =- Euz0v?KҧA_YomWKUk<"S]0vjC-gQFf,`/BjM+hXBk7=fW)F>vZx?+M)_D}r=5ږ4f yC/V0P -6_142*Rbl -!/և˜:1O4"U[?HTľєS1lB=]N›c:s.~;OZYF,=eÖpx5Deضq/z<iH͐-5Ҭz^DZcTi}Ơdvd-:) x7gl*k45R~MiEz1#6.hE["f mv"~p'aݥ:k=v_W>/TboވxY>/N4LT 8 ) VU.7LѰ@\y 6/&1AF,#.y.c4/K6bpuS'7\`Ȁnay2CVJ!@h! -e9T3C yb? ۝!)d2coͧ bk  JY|kؙ!@V< 1atsei:]!_O'b)? !ݚ?b^hȟxc2M%`tMBQgJ.R>No Hyv*;~F}vf@o%@Bӳl @@C@ZVFhXAVb7HVUdp :WVgR \q,LDD;T#DaDzhDx֎FhCIu2&C;BDhDz׌DDDIo֤7ٳɈҐɘʲ>! G:#G眆& *_zb6ՓI1\x LTsTRwg?Ϋe>,~Lܒq Y$& -[XSs98gzV՛'v.ft[wr.v -;57fcgy\|8[t5k9o>̉dN>}agLO. =u-<b.S.1u\bns%~W;k;ay=HJΦ+AWl17%ȍQӷ>\d{%~͗ٱ$ȎQd ;c[<%@^Ղg߼r_yMz|߿w?=_~|Շ~n~w? ,wow~&% -0?Ο<حkCH#mſol VlB;Fjɒ? Dn.& .y%sEtQeSLx7pM{iH٦\2u{{ˑJ=:ȱAvp`]鎔$͑n2?vC| \B`Zj 5JH~}F<6!'N4Gdrr -HLLg\w_uJVEnT]Ҧ胮y]/oH -R) S3~ SL2)kjY%t&bjJ)uYQM)\`2zY$!cŊ#i9{GrM-j>iϘ1O| YG?usuH2o'0IϓC1U"؁)>Z*vhyȑ"ricFma{&ʱb.Eϸy86) 3j*ı̳G"3ҭY*y1*Tm|hݖKLߵ.5$Ո59):.j7O) _p&E:eLG'|PRk|h ~ʤ+;vuJaVZ0}nd0;Z5F4M%PN1K&bK-(Lj\l1<->m}or˜:Q_R\z>'Zpq|ڂbD'قpc}*bh!I64NȶPЙ:yk̚#e ;b €ƛ!}ٺfbXcpc +L#Z@3M<ʘ]gG & )j_CˤYilh}n!4=+XKO/4\z^>~.kkCEU:LF08֚57Fḻ|2dշ q -;Bۊ@7ᅽ82Kjs9Jf)Eb"Ɔ? Fo@T~heY oKKa0{8&3s`)FkPCJ~겋Y҃4pgCN< -Wj -(S؉^Sq:iYm4:e:NJecײ r.#]TsIE~8J=񛮱f;|ٸk9B56Zڵe7 |D43i3bHQ3ju|$ -(S! q w#bh[E!~P%qNG[>C}=:+) -zSxjG#w$-7psIRi6+~,A*C$Z -[)BCT辅' ,zzv:K{|ɷP -RMV% -}C=Ά"\"'!sƐQkz cƚ]g3Pc|4}& ϾQ?Q}む^16IG|9yLt!R&Vkhh nH7)z‹8TRq2JgOybfy/tteh%&w&vDhr9dyF֓/1qo|N76u\>X-=_d߼Y/kǦV,O:&̈V6v57o\X1Q!./"352׋9]7 EW=tɸ]ʙB)p"?E In'0nr&K1o=>1p:ݺ52g8ɉ :RG 0F96nzlq>,HÈ8`֝.bؘKTYu*mG.J%+UܩNs>}eNmN}؝TS Ҙ*`ƺRhQ=5=J:_}M*@ 5)5h(:6Yȴ/6`}֧߳Ot8Q ѻV -s[3Si pY”$ >1(B>Yw!3C<ks{ם"i$gZB&K}ٗ>%~] y9g~Y\dBIVjf,͔LWb:p Rb᥌\xQ -"cA׹דEX$N%5)$-hku'uX؁ﲺu+UĪ+ڐJ aB7Y(lPeCݫTO i8ùqš>tm- \t=Vj#Hs};nīځȠ` ٍeKݦK*xK[d-#dgcÉciLqEeewm6jCc8#6e*@ڣT+ K?6]0A1z35l^"6Vsz6% f$QH ̊#aR,g!u%- -zN@6`~}-ԛ{7;U߇tX.G >nsr1dSq^&#֠{v!V[U3-9Ciixj=uڅW;kaYBdUytw8xtw< -yhZ~jw/Y}ڞ$f̂+Ǧ̨cwfݹH̫lz_eהtW5zoof'C?l;ֲ>Z4 -йY;[pkm1Yà8i8y/QxJv-.3ĉfMd0 \WzVkym*6wZ_#keg\WWWnB+*m3"J3>ոr]g.OQ(8Bm۝Ѹv"Vk1 %BoGO)Xw7+?hd':f2Fz_XMdJi)+H]R4A(R:kތ<{LzȓߣZ 3>._]"~AB&YKZOiaնŒî6w/O -]>Vؖ I֞YĈ3¤&a ]5fO,_IdfV9AL81hu6$.<2&V`Np%?UCm"y]F'R?IM_翿]Q*f\Hd:@$fv}a6۬a[ef6PH9#iw7 -xIB&{tcc[}~ "I:8 -]f:d>.n JxI}HS '9+^yi%2&ٮp1>U.F&{ -tŪI@ KzkU2b}{cJ!LD mfx~_SR4J{AM'O2IDCmU'EICsv+} "ZZoGϑW`Fߌt"挆"58ys%v ϷΕ4xް+ZV3-܏|*LPGxO_27-^ ? xKU[q,lrQcXS3G y^c܌'*OmBzQGY:{FA*02:sK!x*| Ljqtx?/-Go%H6*cUReFjMmBٝXr3#%AX+[B$sIW=m6CFik+#bRTtb٤<`[&3v5uaThRWà \0xOr&9*9[nI')(! ^.voi.D_ /ܩ.X2`9#;Re B{|uT xܘvĮJ0Gt >b4dzedI=U]Cz k79z6;nCfn Ü"srvc}[ \yr_zfK~s2(׹SBUHWktm"]=Oh 6HuNWo=,^YfLbfdg1sEZw]6{RXd\,P$ -CQX`W -W y٪AlؔI&"TpO q _ʳRBlnQ/OQ'G9M yq!32f] bfqjf%""Q)rv3U{aOum gTID-eq>^tOzp fiĦ m=YCH:qvT;.R(Ǚi $f&XOb(BԻ j"7f4Q-g~O2RV"-6>%r%6AdFupFJ:oDj3N귐cL -V jEhg,3"AݠD,k& ,*3US -/~oQ<ۯ)y}lvf=ٱkP!E -[cuwoH;6xA|UXٺ;~'E BTCCĴ ۛO oCvb;?^lnrú=hm^/΋,H~F-Dv ~`\-A{/r:&\jEl|QlwYu͚y&𝃫.ITNGtH{ 6xh1VJ-$jqSB68$fq/rXAvz]DAJ P\@ܧ_B Idqdd&^,FZb)-Yb-^ om8/9lQ e0b%ҁP6il<*mX+yJKQic-JcKǓ/Sid}yOb^*;׎G! 9[uH洗3>4Ob5R˺؇ech/DcL; Z gsʹ[WM*T9/06yeD]Y[Wa:e}Akgbn|_3v9gB©vG~}E=rQ6%"w_u7/3_@7@>)P)h  9=mQ endstream endobj 204 0 obj <>stream -Hdu ++== -C{(/:3#$OAs"?<۟.?dg3IO2 9z1لL%q'٧zl`pfeX}:MF H=(od6{1l)!>Ͻq4B&nsĊufb;MCJ]NHi~HU;5;<,caHܖ-e~ 9OIb+j6R&s x Kp[E4a4+6T9ql3|1~ ;U 2qμ?'ц/4WhtqM-dPVj8H߼$T܀rdj S֚5]rws:N}&rCgW3U*8m]HU }$WrQ2ܓT^2v:l5td!\ltBys.m7ےdѓts,E+A&f--*dT@ -HdA.ں& Yul엥Sߤ7oc8ZrC>Y635{txg0!:hpWfoh A8ȉ1q6xZ{{KosuÛ([uBgIoOi۬{E" 3|}j$>ܺ"!?O$C+ҪQycvϧDqn2s.f"r gEZr% -- 84kxmRbSf/H5jyɦ$Yb$ks(=/~\9ʍFSOОn2 19=1IjxIaCѼr>*bHIOlVo_;Y]ueityw-99fI|VxVQlRT/nțYS\p(']u H#/೎q H3#RIG#i;ljbF%ۥLrVۘbw;II嶀oomso½4T0,%yHRQG~ -N* 6Wa"86@4N ܒ46KF|T/ڞz.dBD/NR4Mk\Iʗk - `4N#ؖ*%6>Zd''J0(D~MJ(;{WPhmb7iC+[03䐚]1"C(h64kt36*zTYG9钴ݬYbid,Pొ9,!y:â.8gG1} XLfK0Ѹ6ҖZ=oNMij?4f+ojd#mRKLjdN6!V&zCB9i|VD':u͞e=Btp;Aזt=N:]Of4ӫu}[\>d͝>1~L5 h֓ȗ&ﱭ -zfY_$`̚ `y`e;geHJl}ӄm/^^K;`S5;sE-?:0mƴ8#2Z!ڗܜPǸVBI!l:eY+DR+J+a`} --Vfêe:q$iԱsNo5Y$Z$5հ5;Hu^"\-۲Ë-Vty־QQv"./q#)3rL,?^..A 7Ha:]sQ3I_};G6myԤ 2/F -e0M4V~ͲwVn㨁NA^}U Nu"*D+Z'B˙f!X.z<6dEݯF)* -vVrFEMHd#M;Ct'._M7P_H/lc_XT zeFos ^¢L!_Y9]r_ֹePq"iDDV:x*u/r? -G1tYui ux5AqUδ4cUWkDPSUj[ڗ4Z,*ltŶ\QwOJi{cWȬoR=AV:>U9ͻezn(XEv QxO-bV)첣x:OQO*Ҍ%OdqǢRD90|.FxLDz~~zOD۷_~y>&%m//֍?~?'ٙ><~xϧ+/oOIf"%g\O 8N߻O:$䶝ƛZE~1Vg1%F,5 -:%%XJ&\:G+>Ph*]h8N'9] gᦤ=h>א~3cgc.;t%5;mߔW5'7`+s ~3wI_Ҩ&ŭz el124TbJJgZTejf#VyHLͤß!Cdy1KHT0бM3HjdvF&JY}}[|'wt!b6ևcY62j9,'Ӿˆq~%pT{0T;".0i`?E[|;߫}*Y㰜De]42 H\Iz\rxlTO!GVLꚏFAp^sn$ey@7wȳ>;"fU;k3% .Ycܹm~]êWN&fosN|doh)$ X q/8wͣ,Kil%D_AG1udA2x׈4GƳb2:_HFv+dT:}ٟ'pT6_$6a4Ne~;j5KuV^ (GV,v`RsrN9 LT\Oǡ~ k7NC_6;`Uu;خs&Ĵtބ;;<)=iJr\f$<ѫ> -1zP[1iEo_183і% jNYVƂ qA$.e +1RJi*-;jw=CcEʬO-գs{8`|hlK!MSW]~AFﺼ˥af/)w]3׌gǨ1\ UAF@Ͷ=}2K,yh%}\t)u4rPYs<1 VD[ 2g|S9sӫ7FwA#Hr*4{ ҤfW+\HHZqt6ܘƑH1tqd%g3?4\j])NJL|Xje%_~G7v*KB|6E-"miv)O*3WCphv#w>݇7zN}M츬~=DT4;Yĺ7{}6H;-Y`V$1g*E`ήJдVG0O6!:nm)u։0ل=h0"3;,Б0zucO;A=9z~_ܵaZdJ.!)JԶh +Q=|o#BexTT(7f,xhíg\ |Ŧ3R&?gw?3ˏ'O9Nl$ibm7T:8Պ92uXGQ'd/}#JCrkwSwcS o%%RX f hXs/Χ? ,HA mVXXxn֒`Zo63N5AwvU¢_':F( ΋1*5CP ܗD:scԐ2CЏ7rzqNsa9-JF{znذ4][PB=`'ƃ'DrNdHbZ1mbv!J|51T^HE"u*{TO'PTX}g-volґT/(enPa,^hPti04(qBbatM<ܶLBzi2TՑjv @(m@ 8dG$3}0֣0\֜\XcQ# v$B.*W(MԢk s #epv(W򺎲1H'(n7qTP:izd"9u </T'n$~ķ,J&dDJ|Ҵ: XLVdH_ؖ0D"wW7XF.gLB5m!FQ,T["c$Rlk;>W|UiH T-P5.1yM`<ռ-k\ɤب}0x[Hx'HWP3nUNSv{~&D4؍>#k~]\!f.PF_Ӑ1O:I,.1GBGTggVnЈiYKo5ѹiXG|xcR4fʲ@8#,Ĉ8WDB7M4:|_Zsc.3H\9𗫺t"9E *3K5ςTH b׿~mߏ<U!$WdC@r$nxCcTp-:AG7w'xT+B Lѐ:anQB -EVgz$*fzK0!S&4r mVmxIot0 S!%Xtnq!$#bڡ]Ub amVHߪ[1X;QS]6b>OKmg<(c%^/ŰZbU$lq'B!lh͚:>#@ 0* Yi -%LNjh:zxcWIIxMTMj{%ZLaPZ"t(7a7hhB1y c?l|G|cc}q1VX&ڎ4ZV@#٨ZQVeFcv1u-H,ɒʨ W -5f@ FmKb`wG$ ÎL^az< H{>j}By1#liS&VSU0==xp53ep"`F+ղŔglq-du>+ݾs)U -.L\٘>_.1>\@3u7bH1@lh[/êl[c`'(~ Gʶn~u<4]יqmO syW| -4礢6”b se -KH]w4-Ty[Ty,,L -뢚h蒈t#yZ@PeF<*e T:ŗY\`3+߄=ݔ 3mDY"Q۽L 7@ʞuB_R aR1&R${hDY*4Ʉ -v-K&x|:l}8eza'( -bnVﰚIyGjK|c֧:Μ;Ģ\pO+_oonz;73@guU~,i [y`׆16fc|pwFr 77BEP#g?βw} _\Q/!y"Zt@;SRNAe#lD8^ cdފib/kwci2F[vjNgq>SP#]M^GR m!PHo;TdT;j1!m~s6t, [>̧m / ¼>~Ab'}5Q': KѸlE5XI >9K%c6D 7 AlxmsIM|`0Þ"Eֱ[!_X, bH=Z +2le8aSZ«-Flɏ@2q:eӖ(Hցԯ>+W3"6'fdU2t+]A6zR\FJHKFAB4v,NzP@:>Ⱦ gy#8z6?ZH uBjq%OTKJ),XaNUKl0{ ᴨ͏#\-u/f,-]ݏG9.;N+5@em;1:Ηv"kXNM -3٬&YᛵTǕ{G)Ԍɶ-", g^!j / e:Nd1o0 f&3ndjXC`sRCxb&!j -W{zɩD d(U{4-3N]~-^iMu?lFbFv -o14ո۬wAoR( N̖/w],yi8ž>Ko< \RNouV >!ID uU+q o=Msym$ !l@*Sf&͵?ph܇%6gs0q5ch|U@~? v?c/g7կ vthtv  -cP@g4):6"#vo_<{g{](W9Wq%d.蛡3#iBk5a*7*5i3e77S=|s]~ysy&zBG nrBR6HL]Aۏ4YU~fj>D:LU|+l:)s..Ȏsz|N?_Ϥ2ܲ* - Az -YvlZPR2ʄ!MKTiFI}e$:ZqFGv3WjO?ͷsS-6KA]nbnewNsK~GbyeSԱ<@H3"3ǡ!f# -fIeXsh9דAs۲Z$45r$? Ua_Lծ3qTqs _ws x"@˙O7%Mv{6%کsSKا宪˫4ʩEJ"Q"fl1VUN˶l*Qx,I$wmKnGP:fr]$p2} - j{\>csu BV̖:|A;sHO~ϵ<"_?|Ţz3UUQ=*sOqd_N7nn?>Fƭk6@4|A۳Ok($yfT)r$6nYzR*+VAt--L͋} $OQJ^1kii{Mr{> Ӭxo6HĎ ىwMYsy0!&cr]y%7!e_ ?~ym?}{%ƞwt`zV>lB6'Kw,ֳC|`f O$Ƶsbh%uHcTZ975u08'ބI2YmkEgZh Q5֔sp҇|9l3uF}wwVq|zeE2FL?kԙG~mQahCNp56 3mJu[Vi-٥M[ɍ[MÊEM3PqRdWXzk^%ɢi{MqO,@W8VIOƕ%Ue-1ȬiyL6F"SgAJ3ra&HZG=`V2fd(xwsSsQF5 -S)_,N0{hUPt1k:䴬U|"{̩5GW-_LJ$2ݥ '%|ⰔPf$*JJO }۬H$_uWEz&Ճ̵o֦i_HgcAVa7zc}:mm g'c6u\v@@,,lz^?T)J(1,J? B^-m[WM\3)ǃå -&\J -GdM5 Ћ. 2w;4̼%uzx;DOB%m>;kU4x=*64^Wy)_ВXWHcVIG(}ʁReaE\ SлV,4;W|2 ^{yQ ;abK22' 2HL4HGVu[g"2>ݻz_׀@g`aYK9˕0AۚBW'Qc0ۨy~T|СEGD`S;Br?d^E`WX\XQqyƺpH$&IG^df !->!t+/ --5k,o-ys/6Bgݟ}ak[c>l`#ѭܹL[}GQڹH c9" 8 1 8Y:r٬Hmfzb|Ku_& f'!Sн=`^1vr';RO/c;!S{*?[>##<*cգ ;r ؙ`%!:F{Ϟa) - bl,x2k@: 뮩ݡA=B57e1Ͻg1vr'c!6b5UkWLU/SACW1UWd\u°q Z]wm7.}&e6j^N^^{6Eƹ܇ F~QoBzo$V֬'T Jި$%AxFt -+Vr3J)WV$*V:vR eJYoR&1!=JJ{[e͍F\d<18-؈v,:^{OkpH{*!_:0]B dqCUT,j -W(RpSQwe*bBF%$X99M /&"4E4yM4 -j.`z=dN}uÆ`-P&٧,ԚbC =r?(#+3棴{9 8sR=śIO$I,mKmΚY.'h5'Bjp&xZeXTGvNnr1s};y"o1/v))\ ]m5=^_)HG#ס -T$Ad -Tci;f@m{Wg,}Abj׳}?D0i|bBs<9<, 21ó糇99o#y&Z -hKE69.9(9䘘~B[Hpyn9q#xXrĬAJdeA64jKb,elm+yAٕ# eEu1Bg)SΙ ( R_? JI%ntL5tL>;S[Տ 40*&?҉yK%X.ϛyFF<9D|*JU<^ɍqjUW m{ek1o}jL39|ؓr_iZ-.m5E`t0u#MkJU6oY nx쵃M -*L9N!>kETo)$qaO[" -Қ C^׾W껵9Drձ+e.uΗH!!Jmy4V -^f]JO}睿~~}K֗H=S9מ9 -iwH0ab]NQ^ Eru؝ޅNpU"J˄c X뷤9!)վi^R>JīI{sN>ٯo?/LMکhdBy#[GBP8VQ^Ǹ ՞e+5 -uGB.۱+VIVN=$t~Ey%w_K={JM;wE%!HƏll/*[xYz/ݛMsu.oGSUƉNL @!s\]_ X/ ̓ b! `r%eS,IAR%2,G{}RvY0Z/A+Y{jݎZExs o3UM)hBWkYHqa9V!ھ(laFH:E1fQS]aKϽ)氡ݐ;g> (FYK ѧ~<ѡ -5^+mUj|4Q׾0!69%R ,Wf+U^\emĐE"ihgzCV $LFjj֜ s #֌`]eKfҎyj1Zz곚EE2]u7g]z=# -贯`'s)/"#e($|?~a Z3X!jSɜ2Ly y:.CP‘}nH_䰀=/JFJ;8 A -i"N+iL 䓇BZcʲD"O >vEҕMJd]h{ֵnws2]<0Z1w(`@.筃C [&dN[W{N[re8AJj<%Urj\|/\" >/6f,AD m{[ t[y[b T(Ś9T r4 jܮxv Q%?5zE^DEӌnͷrC -?S{X˵ffg٫"w5lJ1^t ӻYe<`-"[+ȴL1u!h5u|͑58nMlfߗXr,RHeߗ;0u=,"2W87Q|u5 P:Cn&vӉ{'??O6UmIއZlɐsyֈ@/$dJͰj:ZʸKAOd3J@d1x{Ɩ"jzlO2OR (p5#j,&[i-]KQGSTݠY| )I4 t N;lnLʺE!(vSi7pW%hg O~ڳCR= -Us}Vx5dtgGmyv9Yb~(S -m;}koWK,&**]YdF`ɪae 0?|Kt>qJHRCM9-so&+:-&XiӽKk$YJhuzTڝ `d+U7,&3kZf-ml('qA`N %֪fNHm]Y; $U$sд %mD$CB}qe2:IJe<̚fG?_Ң~ hض.5DH =M}-#41G265#Pcܱ! k YY!ZA؍^CU0% PWIVL_OEeGchE~f|eZ 2WL!$5<cFw5%/f=־2|UB_xdjz"fߓD03mj]\ĮYʽh1ګYˋyy=iü1k"2T)nh ez]L|7iRDq^xIE"_fV [k E\bu(I iXA,c( P.ubS5q+?k#h*RU1-tR9hcccYW;12W)mݐ'̷H0(R+9 Wk%$m[)1 24n@.0!ZӆfvLMȅ`T1dDLW CXg1Pi:eБٺW&B[Qjh+ -֧I k8CAvLDU03 Y7yWپ8D~pGn Ő\^2Ar7kDSZ#}} OrұKd LX1>X#4"k\!v<85'P/LDk,3 q)57kPY"kNED~p]ikZhk+FCkoTok_t endstream endobj 205 0 obj <>stream -HWB}<K H(aD8~2ydݝ:2IxXgj~ḍ_ͬUY;|y3v0RI/Nt\n|hM7UM2Z&վNkUNVp_+P^n1UG_Jo_"s *x҈#'" h9y]Sg{n g5`bÀ6f5U5fɶrD1WrR\ҍG.458.IaKiΥdfn~b;u3ojLWt>=AuI1J -SS.~ںtYyٍRe 24I,^ZP7JV.iٟO{SOԜӠ!7t6ԫ%Rۗtr=rr7%h -۩U816cxzڙ5vO!Gؓᐊm -?6'0A:1a֑e740aѽC˕zmOhp&G%Yy\Mj9U|Wyw}) Fԅ> N Z@^h6OmI.AFHאH62҃lf'1+UFBǵK|XnN]9.9%ܯ/w]yuhL0WA\I~/ִܚ4C >Sܜ -"S8?9Vn]+:hjN"eOKʆdK=[sҤx㸄& ۩sCҤ=3_f})?ĔO]xtb/C%C$UdWa쵠6|!,vB+~`R@hǨr"?YyL;k7"'nxzB 1%˅%\e0N9U7Kv⯮uNW ֆv(miBA І /V2b&XAaIB/7/0=`'q]nKX~O[~u:^ƎCܕ]0p -Xa]Ir=|%A!&&g4ᣀѽ8Kór>P.`qPe-Wl_W@+We@ RuɘGt<PP9ЖNab] ΀^ -2엦f#[:{INZGMDFNhJ$j쇵x3ܹF}ʴ?e-s_ j3._:aXHbq'|VQS'\2|/XNMĻ3TV]U>1d֞LZ|tE3*Q,;%IbF_$)Ơ鿻N9n4?Fk5b9f-]ѣ8&,cQ,-VdtemƘF#^u7 ɓUؚid}{wh_ŦAWg[G3]V%oNu۪YKv -yyjGNPha=pٻ{A(&nRB1-Ҋ&qoPuBiّ!y2NÓ ʓ˒ScOޥWp}Iv K /PO*?>!5Wy1>N'RA۝tE{<]!oϰ02ާ^Ŵi@LmnwٝcOFq]nݬa&  pFQnhƠ<NH_e@U%!Jhejzri isT;erWbȅNV6A?ս*D@ETTh;ؿbˍ75.Htv9sƨBD%]1ۣWݰ -*A٢" - BCUM=4|&8a ]/HŮqLJɐ1">M'K/ř`#R" -RVŤ)V-dv2V/xHGN]Nj.Ը)Z:WKQ뷢 --61t ƌSČ~1ceLa؂ylŐ1>eL0Q?KnY>e4M  (gT:p8></mbh[0LRMW+R}&EYVxhɄ;Y).~,C[o:AZuR'sا%#i i!em*ņ:> NhqTF=VO5W'z +0֐ҭdka,?n˴6 >v;ZdmҐ2T#i2?̓Aq5y %^)R\Kobt58z8٭S6Y戶-eҟ^r=ns&C494Y7n- fE @ -a?='CpqВcq{GErbAx7Q-ڱ6::~dzէ4` -`!Lզ憴@]9sfg]uY7VF˴w&uhʸY]`d*`Esƀlv:2lF"| Zԅ]C3niT;85:Բ?IS@zqP2| 24q1E#k5fU'[vЩz0l~,NlkG::deJVdfwrA>}1veυ7aןy@ٛLhX@YȔ|3.:LdUlE4г=r\i!3 -5"aeJ.PF@j p <{afaњ" -LDf%! mK`X<ݵ @$z?D껴#91l;2qLH14Na1:SkD}[60g04Ca(j~tvM0tcDvN|C|Î= ]m`@<XdFƊO麽1)ƱVÀ362.6&P2BĽq(t,7G{B:`,u^[ϙEK;)@,7Yys31LP]SzHw3ﮢ㒵—Zṷ5{"D@O c?`xdAH1 И%b-Mc%*p露d -|-G˭ -*}n2ܵ~gllqW_O\`f~OK@EYI: -ùt, * giHbeO* -<~'r) aJKF`X|E  یb,&KMARÔb.Jʱ\#s`5t&.;>0xHy<2pZ)[n՘x^6]"$Z}*E=i9a?d;E!f%!--xkv'U/T`/= -=lL&Qvƃ E.RE*~{/Sd7DGdx%C3H^4PVb-Jm}޺r>>)_J?iJm*4`bV退,/>D[eEb (c#{E{/#/V3I(Za9D3m_2{*ѧ"gz}*yӖut\QBME3J[F'Filĝ zf_j>MrދjH )?bt/*oNٳr -UE-2q^A_#R,?rW7d)g\粩 3X6^Ņ?[3{x!t/E^hף[*5 ;1z59y.p[hMӟ;I aWҊvE?qM@bg \ҾcxA_dqx-A n)ůK1|KxZVOJig/xܲ8T/r!?-3Fg9KN5% -әÇtWSu^g8} )Vݖuh\g~a"ZJzI2]L\n? ƿ ->kV!G4Py"s)56wH(!ܴb813pWnN҅d -7,k6@*Lqa?ip -Vvꖛ7LSt}S};+)F3=ugī`3]"=m'> M5K%Wΐӳ ޴8S_-wF~oe -v^Ǚ 4Thi:MO8Ȩa"XȠk6g(Uj9YcgaqhxNd,jaS_/$ۆH, N^"I -JR z9e.RwfEҹwf\qCZXY TVr,n#H.K,t YM<鄻6|A*su [BIG`RfEE-}NGT|U&}~u-np+02կ-bVZBAr{ ᝨe#[2 [Jl0Yf5<حTE`YǮM;Yhk&d ~̈́{Pah]* /T -%m)NՂٳ L dOdZ:Է4U+E;7[{ŀsyj}\^$ؐ,]ZzJTr."RA!:֣RȀ"`3Zj?h}"[1 -DgXX^@(^Td<H`MRn^NQXq;AY9 +}F@v/HA>w7l:F%9}s=F>qV2#އbJ%'f# Mޝ;ƄyV.`ZbSK>*v.TGݣ!T - \>*@B$u9CrATR!TBm\yU5P[<*WaB@k{T5PTru\yU TFFLQp 6;l Sv^][CO2Y{Hy$P"W J+¨~m@]8Jt6/yp - -cD&R?rqM*ed<%vɰ.{cV?M4g+6+tvX0ݕwr!p'poչhva[_2$ ǻ/AJ:Gͪ2bY={I~r(2d2 |,R>Hd@$ؿ0U"Nc`lx[6ڛVn|jbQǮMbK sLcDrz靶T 3_q;snL'* -L\F L: -חqDZλ P "Ang%v~}P#w"*3[uMAZ`d -β0HQSXiO"ZXi k.k -JJ%ȟzO,B1nJA"PS[PRd=vp4G,edD@Pl?2<{#V|"є~OD[ a.LH3H\LQf:LE`Iׂ6d)9vAz%J*:r G0!'7$*U^M0+*38vy2tz52E;8Πr -^ pT޾ -X^)=;DhF*9j$dmFOn.ݟctH ulokqy+V1[gБ$6Ki1HOuThjַ&-/EFyj|@g ǁuW!F,WK6hbpg!,w2rY7"_ZJk -*2 P0XvnZqVR`KޕL\LW_,ll(de\ g<9J< UrwveɂK;:*MfQQڂL9U@4l\r`jlUq$,bA:٪z ,Bhwd ,B.ޞ"BcdoK~n:dE?a"n^ܕwN܅ o$\rgl-mW;*omrLKv)!]vt>y;#)Y Һg޽U}uy)OoQ叺rႿl z %_ɱM^.yQ}Ȍ;wH.WtqnLߦ[0Sa.N];v^ty,޿h*+CʫSwȴltp|ek4, X5bD\@1GaE*4bAn_ 3ƈK#5*{1 x^]KwA -] -Mv!^BA x([t-ܸb1jb^, f̜sb˕R~ 2sɓosՑYbpDa}l笍L썍#g;Wr2^j4A1FA2o -m7m: z[D:J*=_8 - 6A5,_: QF?r--蛠oX,olFɆ}K2Vym}9(ֲ -5G1cp!;3^pc||dKOaDI# ()9CQDSD$R@bpHRt՚Y w]լ[vu_d}K -av> 5TJk>I -KT g-|+TI'QHo3Ob -=b>D2{ba~E?rHpDuaJtD'CJ:a LE &>KNrC׮1 *Ey)+aC=fq/'+svޞ?'2 X MxîO,7'Ч|ȦuybɌ"j_LuŐ5 !bWAS[_#NL:xaq|8Ey.pȮy 9wIg8қR+ +7+#iaMoZ%Lu~҃kOSsFNJ˛5A- {Iyl꘰5-""T#'fOlO kǰ]1-/ XݫV2?,O~[,[s -[# >`<KjHIhѾD?j3e#Uc -P /w3h|˽+5-pM4xb6ד5`l t |+`l endstream endobj 206 0 obj <>stream -Hl[k\7؆hnR -CP)ځ4wn:{6V3榍F;F * -ۇӁ^#银 $?FH{/U6ca ƸS[na~4qA( 䣡Nx0G'.Dk6D҂Rɠ ̸RUf(t.+.xm|Cr& ٞmg> ~aGfZc#EǡyaG-rc. SF2<\푍3]w<~|jͯ߿<|~OϏ^g؛߿|}q/_~/Lmw'~q_#o緓E70OxqQ㡝S$31/rG2mQA3_J KO:sg= ͫ@]L H%6ej 9&AdbX'9sϽ1Ǣ`K)Eƒ(;NFodL kъbT?$li;'甕ԁFɇ;,,!Fc[pQ3͞r8cv[Qʉ RЮQ~۴VlIvkN4[u/Y&4 JbAzR˻ FD af_Gq]N?D)jc}pN nڃX*m?:l-]qE~WV:@ 2gɅ?eo1vrSqC5QG0BfH>zdv[xu`D,eT=ײ;E u6PR#:x`dM0 AsYH*oJm+r<5ޭL22RSZKXR,Y;1X[ e ̞IEEd 2k!Ljpɵ%`Z I#cV5+TvR(A @5! h\%sA8 X5U)0$^ܥsPؼLcGN3F E⫈nPr3G^*,rs;Zyڤ-%=CHKÛV^*SS&WY3IeoPrh s5 591Aފe: Cb-Uc7Peh{>j>"5:aCW Yokd*3sdGzSArbi"# gW-+RפbO4@Y4.ubbrek ~ĕI~Pp*xT:N sn1o9REJWr\Bm_fgwӋUrDjVX] "굝>|iu,'e1K\E-Ru1~R{ ]thB5z,# -풕"|0gʑkZm#~kVp"{YͳAb]/C$gGU&ۡ;eO=!MIL~T W@{%ZvpC.b>^4H2ךK>KW>{^i~c,]16_Z 8LU@rB"y^K8Xb,pp2= >W㊠Fb kt8$JS -[$Po9jظw^b22 R#ۄ7ߑ$ /fЕ >huL1k0ǵ#..g1ܪ5Խ\8Wmh̗dh["c;v^J/,̊Qɉb/ڣ?kx;HV< -fz/Td1gJ99I]5S{ VuD>c^u7o<[ʱ+qqqF5!if)q:ָ$啜2qYoH $;(7YPWwމ2ϒgD[@.OEǛ%GWzU#$JW@tǽ NO@A>4.y~IޛD濿 ƴ6m Ւ^'A XxxY @9vr8$ -V C~}UZP,S#AΥ UAJ)~_3VS•"HtlOH5WbdV#3v*0;{;ʒȶrGzhjxHmM -5 2l%<Ŀʋ>5O췊'?dղohn`x^Buj/c]BIͲ;lբ2T(wB e&H %Dsxa%l527Ap!1FԌ?:#OmGeylZ},q.<С(eli(BBeNa$I3lۀvZ]T 9:SAeR xQZJP2T1m77P\=PzQAqLJdi}^ܿ;ھPj`)]ʦA`Ppm0rC MhE05}9r`9aY_k]SmGnk"G9a}2X9Y4~W%wzUf؂9H.ѿ+;TVcsU6HT3dpXt٦}s%['3q6L]J:yTeO-wV.{hB*=q+GO-aV1vϵw1jTE@pu%{#~떠_QDbWd['.Sn嚺~DdJ$ۯ@6tekаd'@ zG}nϳHћrc{IfJ{vE@DpٿʋT~tBИ|}2d>VpjN{#h.hZ;WjN͖F[qgZl<qS5nJuXPK8'9j}#֤gwQnCD⌀jSF~z -vt8i}j(7IE6jvΞ;=|C{Fw;_R >SK  bEM1j;2(ekӍ Gl|NSFB\"ObQEe͖rhf%AǺZ",; œS j}s>nL;oO:2oaλ,nJmo2=dA8ȣJTYGejmSÉR0 cNr~2c>gJ:dLd:2@Ne[SS͍qA"51|!02FFx}}b3^IdUEe+"%䆆'TXi+Κ2U9+PGąOXB9B9+C= gAȶQQeޫۮ@{Pdqݡ^q@8<ɉ8r@zHӭ~~/估&/G xMQ_;3ݙ ȅ9?rDc6LǤ"^4urMg$jaD8F+@i;Qgzo%^ !x~[+!Wa'mhD2["=@x^7$BIL?@}/1.]G}Qo2i^-#f]QshW=ԆͲ4֞~Jt.lf'dYX|6 LQiRx^@_;+ie*jzÙT7dz"T3ڔO$}H*ٸWw'w.<,4٘-?Ԟx? ,N=fQS>PA'8`ZԪ&^ByE`-p?'9$0$NI܄t@+@:)xAY9-$Ɖq0$͡Xuzak -PM goa>1KwYᅓl-FLYz7}ݓƸfcoβn }^f~s{HoNx] )'%i{NH7>%h_~)̧`#wv`>}~zg4N'ח??8RKB`6t|c%40S,:+Dn> 9] m -`B,11uŰO n چsms6&9|sP6nY>7>܇\e?$|%_z!J{^c(%P*>=Z9,F Je7jKU|*E ʦ#+)O(U]1IJjz[e @lin= aM|l]wAMdw'@6]gϲ".J;)׮8fa4xA^⾦&틸pUFbW0}Mh{()xlLTH~*4&nv&oצ S\Z*/s`d&}`y󷋙hL}V2TI]Ղ  xNPcߎfiV5Ř޵)n3o dEzS3GSc 5kY^3ޞ(0@ֵE(MߨJ1EMu":l|Ʈ~[T>/'Rkl >P TW|2v5.ɡ^،<߄ Z1d;(q2,#䍿g`Qڠ/ jb8Q+Ts<:/@VB|c{" Nr"py-=zTSQ濍|>֤Eg\G=7*W@^yC>k`9@% -P">}O躎nle6!T2Zra"G%.Ij6HJ "W;ם7BIkL X]/0tc$DBpj&'(d}VbQ@(T|ud(d7t2#h[M3ʖy>"7T{O]. C?RsĬCit -3_ ީǬit\HIEEy]ZMRu/&n[H]RP2# )-A52MB -4 ?y13}')*O`^y@.P k*hi7'UPmI@Rd7ZΊbdIh4"*&4# a(@`t7}^@/~Z$[T_Vtַnh7,śwK4]tڞ/YPA0``,l8[ff.ѯp nh-5h$4%/ZiٕJGN]=koeFJ_ysśFɢ}8dKZl>Vڙ ,T mF3!]ROvXv/p03*{%$ /l2ȈsZDWVee#bQe ˆnD'.]rP աw/LjŞe(?,Tli铒oڃH6 z'3SiAiF`\P=8i~D?;% %!AO$}m#!(&BI2Ǖ%L}*}re;9y.zJH(IEcT ,2"2)8lN^Q ΢p۸ڌuY$X]\&Ve"BmRr!IEזZsJK{EܨLP<ض\8=#.pHFe{U "eh GT6/]67v n@"#M EN@B~{zrV.%|2]U]tSV,:F2R56%p{_iYY>3Q ~x·t'FE`CM6 jUAB̠=-IȎ;i[%H&GWڊRp8[o^$#AٙK[j8)_&ӊYLqg@aqo ho-!;d%~ iསy?cn9^NB翝i>*,|MsZڏ 7I|IEaЬqHx:N˗*;>wŅ9QǎY>M/?>>} I姟|_~减Oz4=?|/k0P:~WHq|k^6nY1f`C򹠁w{Sa\S,:571$|.}6v 5Kڥ8Qu6AG 8}ɦ/a{mq@rqsoh~:د]}HA)"'j.DrSuH.($I -sNjHSHm.yd^p5Չu@}zjRRZZÌJc N(9z{%Y6ҷ5cptˋKs8㨻* -ʁ\~3h=j 79In7M*nDsuiN9oT¥ Zdj;580Nd SްMf$4J/!ouDZ -7HrAH{4K6j0ٰX+EARIHHR+@\ɨ8gC^c -hqh!B209atV?;]rW%2\喀 '_$fpO.jU_x5fr_p7`%KzGN۲m87RjY95]k.arP-% 4ޘEÎJ54aPsj0MC=)0)heYu'P6d]FeE $`Y+\Цh HN.xzt+gw%Ӯ͸ա -h,ƦYךQ+{8ba$6My'-bbu 9%v>Ʈ%>[\M{:H'@C. -&dH=.< -c bF*Ѳ~ף u?^P׸z٥v;6D\D7:PNJk7IJå#KzgFE -j/b>o9VW3F۬UJ6+nYS`#?"4с1;gg) kk, )(In# -%U ruE.g&zmc,$CP -u¨ZY@%N[j:MR-z@.-%]O PXf!67%-.RAƑM }O־ dVYrr_~і;,__WS'~JW1[O9_5i0wU]žo:z?C|J -}^QTդLCAGNUSΜ w.G"n KVJ"3sbU;͗#1VDA$g<_e iu -;q3V I16$luL}:Lj>gl{F#ЕmYe=};CVl@Mw \=*W=s`s8Ve=Fo&97Ԧ(7eY,2_-X2^΍X[ ZK5-} -#R+ mF|>n-5v~k3[LgDzAjV_Bdbk&*T&b0T}pq,*,F1d+WX&(I(}:ե>R9DvUZ(P7?y Mo:g=ۭ {5؆蹜>'}ih`KT,*=UZ}ɦ%|k$|CgoVFG -94 -^Y -K \ A{{gsfTW@,|zk`MWA8fuJyIy'̙Y@|@!j9U@VXB.("yh%C설 # uyy~)zj )ƴr~}P\S8V1EB7ּl/ 2m^^A.{)ma' PHjpw^bgsZ)85TWs[@ʏO)7hF@̋Pˎk~q; 1KFͯw? -1C-!`ՍF\HR*AH$噥J,`CUt|6W^ _2$r L5pYLPJܟ9=6yw^c8 !On:Mܫ+ZP??.1͐y@%^UlsyTԽX+UpBSWE[v҇|u\uH{}tH???7 Z-e? gT 9$mj .`V ->`DDZF]!ÙA;>,pxZX@oKlZ,i.W!2f?rkSodxԘGg=l V=^rb j[`S -; -)WS"};쳊LSI^xrE9lо~lrLn ym$?W="Z b:G3QǵEfP=V_7HA|w{'r˸%Ǣ:UӍ~qw- 3g%;+hogvm1b4gJ5 {޹̮wۆc\ėmVC?O4Dh:Z;,>Sve5{=aE $xaH1wDR:A(9L V/)#+ ` sTB\0kmc~m/8.,?3.̀*mp$rHH1AEl+Hz!^~{(8)}/zp@|`X;Nrg% ݀;UAPH)v0_ꜸNL1 ڿkWU&>)1hVo݉bJ&+_eH:@ۿ:Ic{{l#'| .=T 2HG+2cr7f7Ksj6 b@<_\t.x1j"ɍogVKߦ+<'JU!c/S@;gwNuB`>j}.] gf;U'ʮrVnfcn?8>Tj;MomX{rM8wlJ\>3hKL%jv;|D,g   Yytu5g[l%9d=[k :|fD8Klc2$V2; \5D_\3j+n)SC6yv!{[7Q'Inΰ>?8zݧϿ%V~w~v_Zno?<~{o='sYĭf?wm͓,}섢CtTZo]sh,a頌}L -'lDV>A:D@h\+y99€_ݠWj ~oY$yMnq^C yZC٢)d m.,~ Ǜ^eUQ bAfR'pAM[ Rcᰓ?4G7X;t@K F!5jk_:P&&vU҂BD`+c =x+$0czǜPzwE=7f+'@ -(J{15R'[g' =*Jɐ®ʖl'P b )5؂rV мVnÆѷ -2V/zѶtVPfh*ׄPW4[LH;0j;ޯ=-V|&{7yO;szkoyȋЏ0=208v*!H^ܤzCry$a—͇2 SپEUWFAMmg#f74 \ƬܥRܷmStd<3RHg.q'5fީ+HD]i#47g%KJwx DU<9[jPFe0l粋bHI4?ղbmE [R<2CCIOwmp:}C:Vϒ b+I`CD"=hl^B?@?W2CX[g_-#雽,DOFz0Wml18Mt*S, [At=[/Z,H2DZ}jSC/;5rww~S_Xi&ա^uKoNү tE< %lpdGqT.ΆH'7UZBiBG -ܠh`W;Rn-aI)|ݼĆIԀH)aKR`bQmsǶv+ 3)l7ܒ,rc4D­bi}ؚ=Lʈcr&{f'm8o溮AGoLrD Opo,uV6 ۧGO{(0U`dqN4nv ~OH&AFvs3zf)sZJ`;B tHi>R=[`eܙVCSWlW$VsL@&yb mŠv[eStm~6FE͚ʰv;L~$mЩy5 -L&ҬUjˋ/sT MşKݑM9u8yxCm'ǑrL]7,NtK W!O8׍glMѹq888Vr\0҅Vuh} p3 *SX(u"z@OyMsX7 KG:XgqӤcu(3ŴTk ->SثLqO:,OS" uvL'K[h6ԁv,Ae-scC-Ty3v[_DɊ݁I +TZ'F(P -ee_άZ_jB'bSr+9hL3k 6i?YR -rȹc -%#lIZP{z`npb,7?go)FʶZBWw'!uVx/V$l|Eev{R U .Tlp\V@*61 zL3%F\DzH@ -QEI-ϥ(YV$ Y%Z)\j.ÆZ؈xLM՚ -PiBLPihRilzF#\Ls6%[+P׼{bF+8#p=FN}R0w0 V]+_ٰ[tѻrSpX U ~rۑEZ)\SM;$Ys#OU©s]5-Ow͵zqp9P N2nVod Bpz2 {tEva1pL!ȶ#/@Mad@R)݌^\C[B-0)+펙K|7҄3jyQXjAkbC;gr XuO]B,S?vfen,CDa!4%w>Hw4k^-@ -3 -(y"aN*zY=l<ƞyJ֬º -@jcw:d [ʒuҒW2$)t/h}pQTO:Qm-{G,@'9SI!Yd@\ǡbk\$^~ӛ~o/}y#͟}y_`>x vw_~>? [O?7/O('YpDgfw@\ӟZ/0LۺH %IϘSOh{ڽm -;TDo=tC߄XN&?'jeϾ51Z:g-=ZV:ab"gd: 2HL4R+,Zktk2hkKuɊ&+mqz3%sסVci>&2lѢZ[W8H6Pmjh6w/z -26馡ߧDlm_A֩e9ޙ0OD)#!d-PtH=BIXKd w|=}<9 B!bu͊ݘLh<.Q'䢄m6 Ҥ?`QXԗ=UϹ DH5`Cv&ϙt%vJ&1.Q=l֐m < J5t"s\ LeG^A -aR`$XLjpCF/~- 'KG) hQdX^BTZRӓ&U5m0 a:;\y^tņ;>hx= {H h$jC 2;NCbH䴿}oL䰕4c#f1z--/חh(B؊`F-rԜkbEkѺS+$jLfZ΁UmYbkyƵj&ܑ3'ƌՐmX*JQ~{xV~7}/ _npXG? ɍ 5 ޼Uu+ӂy1jI2Zg( -dWK16/M)3@˾*-徊6<-WC'VKNDҒѬ]ii$!٘伂q䫽BH&Ӥذ-,]+ۣ/(e+qqr~ !ӳ(-vD; -4*7 ؊rUXw"?TIP]]4p8F,+v 3/EU_@V +S*SוLӞo䙑'+efZ?ޖkWOx^?,{b\?T.yRS$}A[AL]QH5YY$M^]](1}ElD 9^mnjChjSl|4X8uujK[*i^5uٲbYpRؕu)8>k &9ebQ $|Ӑ\`\,2 wr1)ιtv -ie[a6 -?#BQ8ϗ\tI7m^92wmf -|*`z:bq1#KDU4OMZf9B欞P9vc^HXSojoU -CـmmC 53F[n ~b@ǡcY 64T_D pz@exK<ʹw.u}.>p@rZ=p# - ȸ'mߜP7_]|Nvv90v[8y޿}SS3 4 9ݻ"Hd3QI>ym1ٛ  ZwB$LĦ>\H̼y֨\]Ͳ0]"aϨmHyJx˶i9x"VUEXP>֮eo -̗+AV:!} [~~% S0ImSvcm+ O/у4re 4茖(+:wY\:84I;dF15 -^80|38wnkRJ2]r]4Dg"8-D@B0;@ p3/^A >9,!hq;LppJB'1$N▯em@YeEmՑ~vZJTDV{Y7<%ZbѴ|QyGyZg8bSIސ53[Yo7BfH%'k:J>!-$0KzW -Ʉ}|)~6سԽFd`<8h2Z9%CIm(8خU,~ -7}j|" endstream endobj 207 0 obj <>stream -Hˮe7v\v]`!E:iDwHk/LAg\D7nwټx?=yCvw۰{$0jto,Nq݉6Mg5]L -S|rNc#ϿBDoxis5ʸ}i{Cv^TZwkFMc*D蜠kmrj;qqu Mmx0r8w"?[;@nk>$Gϟc(3h&/x71Š؄ 9@5QO(V+xMpҐs&0m'[‰(PN=N@`\rS7='r+夑ayHn8]-rw#L+cffޅʩ&kӞȺӹg^e. `PZ-IWզ1q%wՐx;բE- -`/T Tsԗ_JNhc&iCPE[q*Ustg\UhBDJi)w9nRiS2)Ҥseɘ B#F)Z?2e$n fE@n kT@D;Pe6~[F_,j#;/MU`MJ[甾F]։bIW7BfF}ڲyṬ#eEZ_͟~zyo_>|M7O>H|?>? ['ۿ=}/oߟP>IGAGPq#P8ȳ6HQI)rGCt1$2H6tf("D%yI"3wsPUH^HRE:\j^g2.IDU]Chm !AyY%]rOo\OѶaE+32AfI&j"w[#t@NW"Sm _']h-I3r 2;Y#8D59=@F [S,Ïs1=ӘpMͿ91ewrʖ3`sXܴ= 25Bذ= Mr F<:=U!^Ǟ pj;~xQUsPiJ&RehM(<{uTrȹwGϪ Wc9eXgw457^y:Yj1Ƽ+myb\ GK5,zb^dJy4HIѕqt@Cb3aԖ"fzWpY#Ɗf-d_VYDsX}$iuna2]#1+hV bj=7p! -< ˙kNp+2z[BF_DBa"JiA?޺ -|߈bZ8 /1ʖ݃|uNG`VB/g{pJ+K5- UXa Lj5cÛIFHOɪ 5ShE5gȰ}LVT3ձtڼ>zrUX r+W6=nкT?̎q($iQ׍=~xh)hmND)$H\e|k&ʼIxDaY2l`IS)Zwv`xUFx] $WlcbԺxL}\N"`>pwfπװ[osD24iNI4TDo)d6NRJJ0n݉Xjb)s0{fEySr,?OC9*  -B,PiBJp #$r3y`?tr!{e֡:tSZ՘cҦ![;cԔb]P\0gѨPBښNi8t#ItۼP8Ldr1}2eZ~,L͛3ؼ^H stV fB֬8َ>-)0"J4F9,4ɮ2˕vRJkɋ%{!L%`6f:Py>ۼ\KaJk)N*q0+F2v8kM m\ߣb&-Mr$#! 93ynOQSG#,1-dJ3i,"W6M Wm!v#5 q;;Ro&za ms! R?葉^KY˙ۀmjeK=ag5aamnXLr͂8|0Q+ra;1w 㸦 -PNDHHo~5SqDij޴vxiF%'EFϒDŽ%XgbÇm]k}z@jSkWjV{a-c@Oqj9֖$X@aJ~ 6/&5J -gUN5fnnBnB6vzCڍpMPFjfpZq)wjр??>ܾ|go_˷O߽{<_\$ݞͯ}x7/{g_=ȫCۋ?|D%"I p_UCj#\E clM2A" Oʶ V`B!g%K!NA*v-F+'vPN`/ɚ4- -T0i>L^1@{0ָ=^YCs"B u4fP$e[YQU H5'XfAvJ&gVTYx% vnPӋ-q!7PޚgraA.޻U:+Q,Wp!ia^ts$ウbo⣲U3 ʮX#/X']!X U* -҄r&=I4Jn)m𽜰RԶN).䚼QZȾc $s?f|,r6]L{ERl!^boO= 2T~Uv19ov;Rv.VH@q`QEn;94 h[-wL# ;4}-DuGMW:B0-SrTqπ"+([/mܰ%ERz$KIϞTQ|4̢ b:'PLNպA,&(U0GP @|$\&u"mZjѡOMʊL'4"VCf5˝9LArZ?;+a-C6*eSj&C=sN?Ӹ~^tF -=x{d;u~Si` -e1XGo%JgttƓَRFW!Swr^-<D+jdNRJZ})Π>ςst.q*F[!II/륒JxTs>R⼽zVn{)Po) (ɀٕ>RPɒ&v/B!"5V#1UP r}.,/nhvkH?VMGјa DLg17ִDrvR)y"A˳{iIYb5[k["qŕ;\ 9Pĕ0gr-ݴCfxƒ t\Y -ZA'p}uv́|?v?2sތ-L}RaCSs*dV-C2Nzm&k 9r戸n$?Gv#"u>;&9☎WP[~3 R- -Kr91*H``ɖshQ - kڌL!7iARD*}BNE!h]n:YOjM5>vڒBld,}]$]^m۵2Y[˷k[+dHӿE?n R@c/r3H-piЗn v%,Jd#ղI-eޕ&>/O@'2_ȕDT%- #[,gS!J$& ZǙB(HJJZ~֪1Tⱔt -^~CN`=M6 Y4Uʦ~JQz|x!IKiG}׉՜MoʎdIJ]P} v7*Wf4Mm{ވD&d5_; .Z'BXt& >!c ? Rd9/Z}ƙ9 js"e"֬ DAYl.-xciMMȜG֪&يMԷYqbTQa` &\ -d,N5GlWd Қ/Wwq/n0|j8D穕 IHrs Q}Ƅ"]تTY$ -- }cXLi0o:HJ\]ٽ>+ܓDU7N*Mos%u+EiZv4-,ߞ2g;+tðn_>S[xf=Qc1W3qsԄ2rW'V'v'E:Ws \7,С{^H~}rKϷ0zUQ{v -Z~e2k V6b[z^[gq-hu\˝wE(QqP ɲHဵ5R s9xVE\#IO˅MʅХbtMdsEDz./^sЏtX}IJu!0 >Zn<ވ>> Lg̹dY -e48!!-KC6l37yf\d7 o>)#%RFh]H KQNJ r9K$UU-UբhY)52R[32]R$A7 - -rssuV$e#d#Qr+EF=EiSmɝG_33ͽ|%J"j.L|X)yUjߟFiHmyB .}3XP[!u0ޕdݑ1C xp<'axlscs)5{XM-q=qm<^Hy[ّx` o '˾ ʪfWT|N3wA {W= Y6^6ktU0& %$n{VG1`EvӢfL6zӒlY|oWJKק"/u<d͋Q.5ƃ{""bi7L؃I|}_cQ'Q+)Qa\ -0$cl-.+G|zEL{Nj3Q/{V'&5hNIpJx89eL;SqF'닊~[QAP]%eȻvДQB=j s@j òXKjJ'R%0݌' LF R:!Jk+J -?g$bq}nW$A#c #F&" 1@eSZ TW(؎³ѥB"y{$Vs5RkHo`EdocV:VyM͓qa5@`rj:v0&>SUGhUU}wL*Mo+_oOY}^Z:/Fʋ[SQmYCʟczqX@ؙݕPlaKU_8d>eL;6E*1kn\K.f\ͽh7}Sf[@TkQ5紆S׽-`-u/dT ?B̜8}6k[F 3}bR̓TJ!cqӨsRnb3R>a3+MFZuqfiEɧAߎq6>Rx"p5Zzobyo>`d kPo;z{{ourl&"N -]g~(D@4^w9PP Lf$;+mUnMUa?@"G- -0"|4.G0OOB]v?bqfjT9]eG㋌EKI;H6U@s%Qk>r"F< -s)#^C|G ]L=HS}fe6P9Fam=̓ `!@"@BdiqX?JȓYЛ[:*N6_8Fր}Vu6#N ٵn$RQ$4ǎVgћ& H?evEMD? -vlFciƶ<,Vvzb\4 δyjJ8ߨOAldnyMN(屡3 -9{#]!2D0h% ^HtOԌ5m'*6;81VSGw@G:=)6,Du -:NAwԩJs0(qb_4Sg;sI(i0>b?EJZ6:ɵ(ڼv )X'0QM.72e5I۬nz:f3QgcD1fz<(W^ۮOUW&c:xոLR{UXP>׻dOy"!/)dfYofsAAFv޾i~Azįθ*OLM$?W>GRz!b?"RA"#I&nԑ '?%W-(o}_Ϋu9gE -l1>++kzU"OХM}u4CŞpI/=G V`3YOTIcN8K,F'Zsu7[T0~Fd3@n~ϡ:GƂ0OF['PrË4TVFax3K?g<~b /pj4<d|ܲHPN: 7n&&7[՘;z[>v.0&m,NY)_/-|8^V5U_?NLwSa vfV5`f\>c?7΀S=B?.l^=E/RˁjohsvĮb9˃&uk^׳x>ͻGQl{VlgWFKЇֵq}==CN*Zzi".ŧoAࡔ8gx.0/^`W" I:T4iaa[%g2iULl%- 􏎕,Qf~<3#׳\hQݧu׬CO^kʤ)d 3X9\1P~;4HiKCu0ٙ{NbuJ*Ѡv֛o/IAݞ^E@[>4Iݳ;إڝNd@< KJ}u»Hr$I#aeG h "O?"+TvMt~8Jخ>4iuh@S>.YnƎ7|bhO LCFa~Q@AGp) Sno*Sf|gKsr(Xh@&ҍJT iK=n%'ezYCwez8|4}vKo&@gw("鵔 *݃*Utzp){2fAٞ#=W,,i\kOS^'tw}I1#c"gRYL lw1|ݸ;bboYJH,} (acin;y̞(:_}QNz:Z7ݞxB -HզˤarlrhҮ+% OD;YmI4u޽#go1 -lz5yk[S)#"RwCa@SԎj;>[A@&+T/WuGL4C39OX|>n -)"ݗH=z!U9O8np6F7 ȯBejPû[.r,6sR<R@[^ȭ]|̀J-9b4! P]-:ǩ$hkt+$Av` ZE Ihř&6C~j3hH y4 ICJ$`K-Dl2|N^۔} ֯m cB -I }ų=d -V$vTOtH>k4Ip5IRc;5fH<ѐ&\%h4_:T7UO ǑF6"fMix1H</6ϒ=sݵޞˤ=@cv+Ԓ&2x攪OC 4͙X8F6Y -9ͮU<8Ya3{&MyS ;I(C'꬇MhzwPaZa~X{ m!"*֌APdA,1{dkZ8`@WTn9O/'# +H3JA**pe*ͨh_yjP/T1x֘v$A|gZ/2 )kl@kR7i͂r2۷`thLy.@OO@9<+j}7x;~dN;@NLm ]hZ,7Q;lh-~x9n{} Z0*Xgi8w,i1|' ? 2ށ6^g> fksȰt|T Yi{2| YK`pœEUg=&,[mǕF]21c’d<_i :I}3n5d+8;9ᦄNz5NhoA{=i\(iՉgT $6H(u ną;Gb$~n; {dZI; sLڈ)(zeG1 -r**EoJSn2=0$ZsЄNR׶a`'%1LTcZnWՎ_ϱOkR)j"T 0Ҕe3EрR',V12A)N1 -06%;AS]iJija,G*nHƠ=h=ڶV22N٤Y&?ۖ m$'j@i ?vϦ0v.e+JwҭH6".Fں4\!+zy"3KKȵۡArM+~w?5Fmq$ >oYWLf?ߌ3(kUiN"5^`0$d7.&Dox ~@h&{/ƴhVlxgZ9фst94G|YDeFad:V?&P푙0^ -.(uع J;~v"Ë=/'B<8"!HN ҩhzfs'|j(y JJFdaГ½PJ6LNK͖.6rgAW2wД 6O޽Aw5ݒI'M9ܸUS_~25g_К -RwLCJbkҪC۱]Qr<_rP'ԑ͠WH>\b5K%{-)ٹ{v2wٹ}"hx9u+t+Y}qȸl#x@% ө:&A~4 b޺أb`Y}~9"lP -P]0hvw[0E{\i <~osXϿ;7y.gV4}n6{[i#k :C^7}<,_s(s&8B[}#[H`#KL `B1hZf% !ԭ߀7\`߄'AkH-h]p;D+`_bgƓ,k]}[֩~nwt3 k.̛U/:2 mY>q"W0ll~݌1oֱ~?w@_"Ū}=;a(HV~<)I*}!s57:!T N}UCШ0No9hѹcݲ;?&i6KyGD4g?!^ if#^v q@T@0Vgfk!Xk)w(r -f=`2@Ť%%iw%Z|:o"uy9O녟7LcsySZIXbîkA.0b]ծ]3N^|#7a#W9vRȼ,`#Z?ZIC*āѾʪ2u=m7Ngg-J .N2sEmȗ؛ -WڽHyw?Qe`Gzl#IBHFl3Of̧<Ó(*ꃝ ={r|;>b9p]lN67o1[ {#K6vC*fM̜d"[_MPgYbա5YSV&gZ% ռ֊ } jɊҕӚ櫙OzuVVq cРEZK7c& ˎjWԎ|Wݾ͝]+Qw6~p9w cnߗbM_Bȭ/Bi*CUduL2xy$\BS6i"5/K*ύ&^;9Y}LEe@,] Yse2 6ÆH1CܻV9p˻XnDnݕ4gyz/ )e|}S Ϸ_U߶I+a7 &laB㓖Ht:?lQIuę`u)6"%U%ũ`AQA j$Z?P)8uug encs5SBWawtjk4KGJ}d`@5LCl:vVrG]S@I+.{$IvI(iݳ[8v}yPP ,\w,(kIQH[Lj~].<_-\2-Νlf 9LyӻNu%^|t-m#{ ?@,TYa=* E\g*λ|&q!̀$ȹ:"}wQ)HVkLKk@S}^=,;KV6usCOGM=#@kiVg-`vu~vb~S]{ey,ڑ) -%(5S1`vu~vҼV |cO؎LH'ӑļgflucкVO؎QxchGb1;yv?P`YoRf/- r ɢ24A?@)_b>a8 x}S'c_wv{b?a;0ΗUk=.=6vܡk ;2?i]`̃Y*{y6͉dA0ư(X#" P7ipRLln6d:fܧiiJP&Vk;0L -1|s)vZX4y%Ȥ_TLIҳG1hwC:ey+_${%ZcΙϹÇndH,acxȥ/+߻7rػ]Dglތ۷xsٻ珓]+]v5ncUmI=>1\3p(C7v#"EIH^OQH\T"'Æ Vٰ M&(n=g OƋx&ψ -B^;gǎ}RIdeMrS!Ɋ hM)Cf-4|gGfJOa`Tq*as, ծQӱ\YAB-ʬs{jVH"uQ̱j䥖WRhV7"H@fJa0,G673 -&F$KsbykkߕӭMTOJfZ/̑W|3_GJ4Vל%@&)3e^ rqo~,eFԧLj$HÚ5j?%ڹ4GVm$I54]ec{5i'r*H|J8bQSE&ɃqY[tmjr"dEkkUg TIQFfNA[ kR|W:S'k1]ĭ׊SqbqDҞ+ dn-L>XWA@xsWuK4KO(k4g3{mؙ_oXg|NQXEoW--ԯ+4,cBܯ[3lnV܈}czam1yήx΀n#6o:<)ތp=WzҸʍ؅~ oLqLqI΄욤:Ewl\ȳy"CrH5s_~/C3fsI-Pyw0EVdsĿm]_ 䲄]ȞV8Lq2iGTR-0xPI <W6gY# -S%356|S1P6YUWP>}YZgz!vv;w),׊ xRQ+Saw6VP"BM0iv U+xR`fʑ1 D" '۽)4Ji!-B -d,lFWէ?^y0bqCc5&6PK,Q6D79%ODdЌV]nXX(r~vdu~5Tټ%E+f΢U5L$-qqdHx$eK>߼nIFc-b1s Ȭ9Vf IM UtkG8LɅJZ܉6l^2k(8;ljPuU~N_L7|"@&NJ]CcB^""|}3}*KYyKEC+`ji$zbCd x$lDT8t6@ML+3$ -CR& DI-NY( -_f b}tZi41#QC)g14x7w6d`2v:BdDFiי!!. *02GİJ#d;Ie4uCv$֡rsru ~`#}zʯ[J1=#ӿ\t&sdYRR#1x$j% XȈ~!x`a _ ~żf$̰N - }wW Vfθ*z3R:R,EIP8DzYI^sO.*m!+=OP{Qݪ,Ÿa~ *Qr\אcDF8@&6@Wl`H\ĸ0)>{Tju<%8=G[MYH^&˜:ސwqu* -+C/l6Kl('ʑeU/wx K[s2zR-Yg7^X, Njwad!m!܈l -iW ȩD %CXdp$wrʄ5y'[ NK{NA6)PiWLE ,Y o,ntIn-IֲGGo - nvb2-|z)&X]<7.<٠j [ -  2bi=mo06TKX3NDs x'9Fb}.{ - SQ4?9Q @ -[b1KX% s; ]퟈,s؞^)FHvIYyDM>fCjD.FXUMIe` .„Ш|G1Z&.+1/6Jȕ CȒVar$d8hF@B\u;sf۱D[E_.IAkSjQ Ջ5.Hm/폂z5K Ag LwɘW4o -"$k!BON Y&p[#cƊXn4Y/5uJWVwiҫ[r!pLVc L=ٽa#b$0eôR`0%#0*Vڒmqh-V% ڑ -LdЕ)K - i&#de#po4XemRΞAΆqV/Z4F lDpUU7SHKE4#JV'$A⪥'R+1!)"ͺH!+N$5H0K!NGao-/YDDjgI G-J,:#zI ϐG"І~[z]*K -2 .dc1IigTd@0Bjӌ,+:TԨM@.o[-se_ -m_6ЪnU4JS|#ʔ`:#mrrOe* ̰J[1#h!k]BB~ W.: WyrNl+&r>LԯӀ@u#mk#.`hUU'٧;.zOE+?0C)9'ҩ>f'}jcc;4Z=W#.`2@vpSH]eZ:xcO-kI>~s)=ù|5fW0 5K~hf:Km8}lfWTO_i*ރ\A=#vgT?4WhwYcm -|KDH3QY9$_/? Vmdo&*¿X&#=>j%XSHe]Lf :N\f-&K) -<CHڋ]uV'NWAFH a788,rBv"˕GijuA' 2wݿ5;)ms2Qboݙ4'$"'jhzii҂>stream -H˪]`&&,$.ɨ&а!7tyuђt'vC$)S9J:!d$A>Ín_b:{xVBYX8cǘ@*ɵbtV{obOТ΍\Vɥfe_UncWzJru ֱ -U9cfI6]wDzS=Sjy,%Vճlq ܯ3'S,7/>FG}fw%qȊrXPR5S_:ȓ.W8]wjgjAB؄KFi yH냐8]$>.mk_dne޹Ӑk|l^u#;{\]WAΑUD(iyZpd3KXn`Ϋ]鸙%EucVfc7JEUZ^uw%U -鯖Zǹ yW`5jӘ%=;fS\%wJ|l;\λs !dΤ,'g;-Y -tE^1e7Ue/}ǟ¯?}z'޽ )Ͽwx}?O Kݭ柷W3‰'jHLpc7oөBB(UI<Ș*/D$5J$BcI4,g!1I@1.Cǵ~vg'DszDiUrTrB&-d -֐3ThkFR2bE(# i-= (46IL=: -z.wB+z$u^ rv~`CY*rjzJ -A㺹St)3dod)!D- $0åu]4Ͷ,-37QVJhTT*m"VA4󫡂k!oECr/e퇁S9)hw-p2æmS\,j]VƝp+}ZSӘVJ8зY&p(K}/MYGevE! y!nd ڇl;_S7}#(QOhT Rm(i?!{ f<2CMyrL٘W%l6+!/ĩSUeI:wފ]~Q1<e }m_{TpgY3rbBttR[!%>QByMD^F(BXl#)U;Ky5Azd& @6Ne@XȼPݕŲ2wАVdOK/Ke۬D,.f77>&HLCGeFL畝<=P!b馌T4w`f ?{_I)m׍89lHB6ƽoƼ&gl &!CL{Aƛh/a DsD)6ь`ͫ ;yz C&YflI3= !l Ѥ|y DL2wV%erdC'B6`l0~w&glڴavX:?n&x5ifÌŴtDlfDu=n7uP# -eLh.zޙN:uy@VC'6V{T&3Jkoͅ1KdTy<˨&?a.qh6 Ԅ&r(F87b¨f#e<>I (>$/CSxnC] 2̍c7czTIzdÍ`f{kmƜ  Ɨ[LT3H՝}kNNI} @ov~K6DBVwKvlB6K1jdYwJ4A`)u<<}>|UyDo[YoO ZPiZ4(APi}^ͪ,i񦎧͕4ҚVu%VXb;i -;YUՠo'gE=(&J@Ѵ*`gF[d!HGbfwtL_=w2̞0 D6d|`EMgDE`h+ݧ$N\ݑ jKta+1 -.)+WRDL*q &IL%ZCsIP+i3y6m]zZ iH@ɐ{cՒ$GN;ơ[} G>7#ު;Q)D 8RyrJ[7soV3Zd  mPex]"nPl@ͤC]kmZ>0?s@17b6wzڄCf~T  Č@8Jd6\pc8x3d\Uc:gӍcb8@DJw2.ӟ/y"&ZЄrUN|P!Q>a~0"i5UM*k3w1)KUt!9hcw>U/VȠO@pU F{9_B/H]| -=[& $x(Ǝ5иGۘPHul4w$ + ~wpR/FgG;`LP#;Z2 zW ֭/X5 fy lr& $0n]hCd -f\?AczC,g;'itI^Ԕ#pٯu{y!$g뛎*hi^f#H87ߊ?Ĵ!?t]Utx:u5tFڤ)5a#c>!=tjQb.Fq4["Aي:擞k4Z09R-w9'삿3XF`*|p' - Is z̚Άy-C?_ @B`tBD7 The>D^b9rIWq&$iիsJ7'}#a^zKJ%#`c&AC GH9z&.O_~8ԣ2;?M~ꦋD*u0ceC grIV"qZVJ3,ul[{ȉ.QzTMN :Z}4LTC]R+ -h]Ώ4Dlhf0ʒAMۄ9;̪>Py&1lRCԯF5~?mŗ}v^vѝA\=*,DrƚBo(N%((Y^|oRvPsB66]o[וiqUkT\ݕ+uMv? ,]NRا9{ -jܾ)S;tQ~y{?Az׿`!)%-49?$~C{)&,v/''`[ !oP1bR8B3~s]/T2=Ur;+ F^H -s <^0sR1ezZbM2L0m@Myk|xIMʵ= q/Qؗrd{ +xY'[N]Y -m Hɍ&N=@jXM,o6 >]2p ݂@չ8|6&F_Q<ޯF֌hOx^ޗ{@! J [ yalzqqu -iwoci,CTxt< mz۳lk>e$˩k7*`uEۚm/"ėdzOoo#3׫ LS2 p7J7FYԮE~35VqZl -(Nb.~NNMO{P3>3*<݃ЬtZ.2ۄ PzCf=+l4gQ6חY\{q?Dw,iOagWVrl*9?#9.6C듵M@X:#`tog2#yY6ܨueTU l70D9Ѽ{wp}~>v Gn79eRT,$6J}UXk'<0ܹ׽uZjgVKrʼnd zEuq:PNS[TGQ af ۗSiCN ImZ CU")N4ڷ''h]ۈ2_vrznK.}|ONHF]vЯRZ~kh ͎m~$ZjPsQ/Sgyf˜\XkZf16/^tfkṫk:?+"k4hF̓(d)ӻ6~gC{ѣR$|n I{p%"ܳGeo&zw=1Con8zj:[8fI9ֵhوj3}ʛ[k%m:߻ pߴPȇ]5_oVVDTewP =ٙ(0tgA"\1I|cߞ͝>[6 -(a6=PqJz2use jC; -SHjO%:*WWBэkqa0w+FXWT5&0} --Iut,x:o)1^ͽ=<{"RQdmO A@=~{sCGٯ;o -Qay]>5XJ\'-hݗ|v?Nލ9D5h XvޮAb* ɼ,̀`}5: 6Rۡy7m#| -{vC_>slZmc G|U-7R:%mlhܽo =/ژt -#fMݲ#nYP|Gp/JIwþ7׼ՒnIܥ/RiR%xE -:ےJSyȯD x4G>@uֵVNuHh@= kY{9vηK34FӺ>Ii{ʪ`ڦeꅴ]_\Psc#>z -=L"ۇl.>XX}{zt =n8\|rߞYq5>cۚҶgŅ)5#x6Q5j@:m }YQ.yDǖF"s3( -u!hr7Aa)-b%i- K{#Nbi, -bHDˑ1J̩kjg7ͼ%Wb +`nu9MC[jˮS-o! qCș:׃N-sk AzDdYǩU5#/Ñn%l$,->l~W&Si Rjˡl -@u#=ŲD&U'rd|Li 5%OJMWVr(jI Z)&5sbyjjаO+NmgRAxM1 ]@>xf;6,0E}|G?a41ڿפ1Mu -`cz;H[B0Qmĝ>1P,3pʱ1K6Eޘ$d lsX?8_Uc4-ˍFelS*9J0UH@C_-zzGV*BDZܨφE}ɁlʌۈLKdʋ[.)~"Rorj=khp@F|CN'2 ϯ:<;zq_QӴ靨~cOgAJj c"HXʡϥ\@Ծ38Z-եY\G,XZ8\!p,x* -*xxbIW*+ݺV~Z( -IU.BɚvpjFzFK<>dMU$tfڨ _C6"Mt 1Zz#i~k^fNC 9)22JDCD2y^E {լ'w XRCnC&oSuJM6d4}Z%խs*oь=!߯s2jdsetw@#I=&Z;͓^͠(T/!kӵ@VFO9obsWF/V.ƹʨ`oʶ3n/83!|:u% UXqQ0CijI9PBZ+Hpz>ifĄkq4ρkr]'@cp8>.a) Hꯞ|BS@R9>D" S.sL wOSĐGVRz``X~br^d7ƌ("zs<L"nH JB$Mc/6>ARSB~1Z=ga'#/y5mό%վgS $aB0V|"8c58UIqH`G q@RqS>AۦbH1^O:JHhpEɖ¥fsKp%ehp#yjZT'$N>[;|C6XoQG|w ZQȑ  sJ;r~KISs$ET*FKORE]):.Z@.ofŝ>uYnzG]ᔔ-:#iij+*itzUgo!|W4VWi&yXx(ucC) ð`Mv2.H65B.NLc&9|Q6h. -SɩPQ,G){ k(5JhGE Sa"ǼԵV2b]<4vꪺ6 -A(f |E*! zBWANN~jWiǘTP(AeFĖЛ >&Y.)Q_8['e/ *aL}h-9 -ZŪV^Tz 3Ҕ2ٿȈB.!¸)FUJ(8 -Uʯϰ9ڍ@E"s P ]Y{ -n/me'YKta0''Tl.n!#|xzO9?>?ۗ__^7˯^Hy5}_?뷟 S{z/ ?/O *U -~Aa~>~ӚX;^8~=v sDR`+Lo ]/Gf*} P@ZnŒl")mעZI5Gzցhyokdl!sE9GbJXpT߬{@VZWSc_Ϻ46Q0M^+R@ 8U9H'ǘbcy5y$pR*&L՜ae7Iy8!m!@v ۔<)Ӌ!ﶸ$i9vb^ڞ_eǯ;KsE*U+=]eםggF9EGcOĚwi4ij:lH+"_eG>&Bl\Wv囌g%`J&uX7Xpޑ߄= DgWP qy}@n -a'*iq,NyA=hdJl+uHc.Bh.$SEXk?FUРhʄ- b&WtCj9l4d!r9SvU@=wdU;pE ʾJդ(:SB+"%%"m9 s/BԟVG|<, #9 22q_pGoē5wԷ]\F йJm"eN/v$5E("jLAF{3deNVn*ྕ{(<Xw]{P\b1 gnQisYd!} F*yA(HǓҽ`r&Jus=A$ /$$Hi aCl;OaUFwnT5^+2Wh]ݓ#֭U) Kիip^MP,X%Y}Mޤgض;Nծ\5B^%3դFįyjBͭ6B&n -4ğqU֮{C~x /bxTwX+}+@:܈N]́ ́}ѵB\ٺcB;#;@Gs.8_LjkqQgghY~cGQ13<'߫E7˔GD6P]沸ʖ.6V?IKtڵ;tD"R>& m.?5<_61xWrÚ4몈M􍸶)6觋w,7?ӫaZ[sLot!NSV/3Rs]Ӥ*B>Rn[{Iݤ;+T E&bK٭Ԯ7 -\8`ˈR$k1^)n,%?w!@s~ "s 2©22Σz4V;٩ "s6zAd{9ozD&"[d@%u0&H3&lc+\qpfбߒm-K4-5 ͑%"z[Gu7L~!߉!PtF; -9 y*ڷ9ď#C<yW(껧7_?OO_~|{÷kgy/?ߍ7_>w@O?vhf!>gwOMht27B si@NJ[[$vG@U[` 4HhMK`>MPvjik'L42͝Ɋ= HLt#sQA=pїkC% -XMS|8<=/w$ 1F>V抉;*5{ڗ{"p1!~ i(׺oWVt4-j(%TFPt<=2}SMbڈ\~K惼\jٵ(_p!BUQJ Sv%HHYUwc3 '>˻jmH1툂XlavRZLy8d1-'[Zݶ2JVL2iZI"uJ4,hKHMM\\f#gr42D'DFeM穼s%ۈs|>Nq^X&H,@@V3usYtG`d9'd[g"3UpDUTƴIS(Cq/3Up Ŗq ?fP){~fdW!~κ,.%Mvy eSX*τZYŵ={YP'%4$8!<ZeJk^%FSnèoUb͗5 (nB&u0Ҝ] Q[SH07-$ ":d y06Sk,_l,ǹn2ba]=(V4q>s4dqVad7W~!Uf40Nǫ Gz*H!~q| )ch~+sd45I {p }T_Q+ ܠx/或B|#:/60wJif BLE;)w-. p2LWUG:4oH -Cr} -2o K+*==88mvXш GkGikچ]n曌3\ Ѹ[);sqxȸL\MSk'g9\]%sCw_u7?<xJϯ?|zzΰ_?R_o?}ço~Oȟ/Oh~o9LjeE%Z~vk=co 󶷝m%_ 1,2dޞlbR8u^j6,rKi)7Ŷ7y!<5Ʌ<`zX2t$;>;kHQpWm,VVVh6䊉qVV[,Z>4`A14 fcƌĀΕ˖?&n_!v*Uuä9ivGI~w#:tfSǎW=+rCRGZNē6I69_[X$him=3mv tviȎ1! RCA2-B̗yԜjxsʜsI14e44|zwru=B PBgy7s;k\๚R`&lO,s$+ _{9'Ǥ!#ckT9Ʋct).S+Cؒn8) 16(J4n.d*Q*RYtsjHdrMvXr`'$2*+S~0m,H94X`TusDoDXu -AVp2š]"=6eMػఘX-c8#p;yĄq=\/yu__vۅUeWfnqcsuNtwov"\è#a{|ՑQu5^ CV! d{}`R#s#f-fgwGJ%_L)CB!! R<z۵v#۠m{[ۯz|*I~tKZ62xքYjc{Hm*.0$ qqQ) -[:Vioɪ4ej@p^Vx22) Ѱ6`͛iM} ]ab$Ǫjl$,#߿E "j 2✈Vw&ѹ0;cKU##:WjD 6ੌ:jYebַ0CLIMSY0e칒=ɩrBx -*:ϛPt{#1zʌ.h+L򄛥SX933e 1 n qʳ}w0]#(!"^sDm9IKjȵdlTx(&"`#(홛7|#Oǂ}jPmrwv^7#H_k[(\6Bmzv_sXjo7Է Q_MxZuEUܐFQmLrqB#y:SW"GAL/UlGN;ns's?@"-G2PHnQV}4V%)S7ol{LO^%αۜ0 xݍemqџI#=w/:B;>la%˦@jF/20+u~V H1u -b LBLkF!+x:$G =L*K"9#0ݵJgYkpDG FG0^d9ZFOԸ$bղvm.uMrPW4Jc`F~XkLUqKh̤BMIM'>v5з[,1|~}%S Hp,Kv5l1DZI>Qۆ 6YgA+Z^ՋJc'5 "fcC,aYMސTnBjAJ "t2I.Ot9:oNH^۞9G +8| -z9V[߃1m"z4L"E6>|BŢOK`$֝BZ"r`'M B\nI]o]Bq(E~׷/73vKlJhdk]3p5#[$/Ӡ6]#A3tCRܦm] -nJpFsH(CNBnO^-qo.mÊ*4J-abhWa* -J T%!ERQ!/TONP0cZ]jkP,-_BƵg)Zdkͷch_"crc̺bJ.0O}/ʵӵ/-['jG镛N_{ݘoRM=`Vf&B/Eq` j(LbWCpr԰-ð&nFm+Ct(|L>zk Sv ; -1Vh"ϣ''bw*/X=Z#xRU6sv z9ƃ()`PeǓ]KnwIZnEtg~NXײ9۟%ex,zð ~@!i?Wk#X n@9&IVd-XXTp_6^죍І=y -s[?olc\ޤs>aعܭ47@@^q;"Gخ#DCz6^)zOz̹Iσa'|1^jsӄo'oX/KL@eCS%{h $ W°YcVQ>}2ϫSb"=$\m}.3o"̓HRz}5VMyﯟ/3 fo-j0aVN*kDLvn -Q #kRVAl*%90Ml$R}}5W]3kN~fP$Ai5tO2tM3]~jtJ^ʆ:OfmӤ8n;&7, l Ury#F~N2'F~h{VMYXb}l Q X\|ޘ2ƻT'Duȓ{yn٣{1.Rc**#i tEQhYfܪF>ڧ;8 rVӶHxwm>n⬱$iRϰi,I9Ww} 7Y:wg-z3Jp7i(1ed -}z*~@.kwS, K `m&L oǮdp*t'| ,aM?Z~>ll.Xܐ#lT鳭hng 2RN48%րvCh C-jl&M)4ƸJ ܊\ f+4(6~6A&*l:mΒKpA5& 9 8'rɖB22ξ5|s}+R )QoCvYo[\Zi!^wO0힐^NH<'irޥXybt#2 2e$6~&'^C=O:Y)^yn,3HqvmݺE]IN=N3(ف MW bヴԞC,lb)%/غ(|G tR!RIw ,+ dD#)R:X=<&GEp%KPV -Taiek&^Kw|默$,;bȆҦR^NS =-HàEhN"aRRJa'%Ml8"Nh[>ô9)riTKE$pP FwFcMAȖ-X[.%#[etZ6ɠ;wU֪J#3@^ 7ꑦd `1kFk㜷Hf{@fj6"=E)k\yj<*i#ڤCh٪UQ;0ޖ-*0ֵyjS cR,]#r\%RTLYd~8r;]-ŸO,o\>jQUqo1nbfAPsBC7jj"zl_Ku}5q_]Ɉ՛qQ@0<[Q8" -U1lM%qͦW2D#Zcrao؜@NBy(QGzscf|яS~O=´jq85#$)28~d)[c}jĶmLlցյP}>B>4rqfwRke-Ӎ^]xiOo{%\o~~=>~o_|z#_>}xǻ??>}3]w|r=hrĊ_D:EqqջCɀqΫlfV,#0,7;!}?t\fTFML1|Pbm|/3(l+s fbz,՚6gH̃C - +sUR ¾Hir`9d3|+]7q;P[[( w>'st~7f4 Z&Q8kBF&MEHKFjV qx҆± us6 -xf#MG懠Zw[Y˸dd#^ެD Y|aY!5 -$4obn!,Hgd!ZXsŻ K^w{`@[ endstream endobj 209 0 obj <>stream -Hˊ_Ɵ`,9vVF&`"1V (}\"m@BԽ^MPZS|}{oE[^f樍Ԧu`M}{M⨤kz?v#U?E4v -qK-).*} TY󐺫Ee Bεe/iҖC^޽߈W/Z@Wݧ?>~;3mo=oo?Av$N+t-4BM3$&tDt*ik,@ -hM۳:n&wqp7D$0[Bb>PjMbMٓ#r`D *4m) 5X ]+@lyZL@-TRbE(n~N|MX2Dz`r. PQv =}_E:ý/ -I+^ڞ5  t ֆTט[j6ZN"R&mpsmD[$_̶0oYoC:KVZ+%4Б bi;h|]=qdկ⚔`1#{e&3 Ә7=ڻ,Zi5]FQV+x(X7y<$6ƒSQv --S";uY]x($۾xl‹wTi'E(q5xRGdSnX5H:rye&5lnSN&u :> ]f\xU++v[X3:&GK}zA%^=ojRh&Q<hF#XB9qM)H!5{Ey]oimriY(/@ũ[#WA\fxڍC(3&{ee`Y#f^}=GL&1[ZbPƶ{Od[ Tݳp*IQ! >LG o](PBl͓z2 h:?%{;!/jPFDД.l r)%HsXek@@:(Cg6xI$}`Wu39 ^@Ku8v FL҇x)K8: ^Ekۊ -jF^=2x/9{g]f : |gSM(؄6N/LxY3]'Q0F&2 \̺u5?ʁ>"nt8ȕJ7g+v5ĔϘ*D=q,/r=cN)`$59PSn?zK0$Lɾ9Rr VJ+{o d|GxyzFAc.BeXN7Yv}Bf7T#.i%.::t*Fr[GY>dWATB/Lڰ.a&66Ƌ`)VI.6ǼáB8~/=𾼄xӡbQS{ci(b?av"nG:I4RH:u3kgq$.}=n;D?-*-aǼ!#j>Ibz *rv]rhCB%.5qp3Ӎ-~iZ퐑WWsO_e/E<δN`X~tGrgST!k4\#E؍K7:Ås V ,r"oNCB\߹kj=82w=Zd#8 v8,TSS~|frH0YDez*$>ץ}\lN 5!ssZC;dQ;`ƤwI+)fMK|ʍ}l(`&Z|vu=|X -cW6L+$G h%^I$χ#3cȘJ`)1BL8|ebzPwq]l+|+)D7I7I -<ćck, Φ<͞#Zp{ĺݘx9v[SH-N]vnD_76KR2Kr!ɺo?kHi԰.XӤjȌ1ğd>K1I5J?,IdͫOJ>j p}^fꞴ-KaO"0/5"15ޓDʊ~5\&ܝ|=XIR-Dr_[ i{ 'RiGБnyÆk׺'+1WYV$;ô)XwHM[^ >ua9P%/f4]|g *uykuh`(Z~ݥbQjXBVq6 +v)Sh|sbJW,w*?[<9*ұȋ\nN!r&i>L>!)K ?Pn뉃ut%]j#9= -בΉ=?p'Isr'1N?a:4OU^wxVavE,ʲ0m#dnz!qxސ(p%-oX/׻M%5q;b[v_O]$y vH19*ALx^VN֜y%Hk^{&vp@~ד=u{GTf|{c*JOy[VΨsj'9{eCikIėK2R3͙f!v\dR -IL7|w -Cw ^w[;CB|*$%vNÛlٛ,Iױ7“7QMLoיײ3Y"`? 0' {MdkhXɛ6cd$ʼl>DO›q3y>CL/Yo5(j#ڊrZdcFVtg^zRq ;L=$l~Qə>Gr&RMR7 +XuR홬ԥ-dkeypwlߋ:ywN~3] S MnS]üWOs2Ͳ9 v=ۓ4ٜMp'VɝHrɞ'M4 -[=wz]wT+CC3T'u}/x@yBsqm^e T3? i,*D`n$݉L_(cigQuHⱴ>4дaY0$gП_ +atS@?d[n'fQ!dFB=be?jNpN!rag”]eQl{e9!X^K,3*^3Tt8'^6u]0Rz"5{iss=W-Hk|NdӃ~bߙ'-Z h*k).Oi;JBM1z=UTAB(BЦ7btݘ;ANs]#Z۾n6d 6@ sl'Su@6'BVAzhD0XDyQ Jt*:ү(Np-! lHApZq(2hɛGk\WHa=V{S0^l2L؍1^6M{Q$Jط%LǺ`˺7Mm # GĊ}K'[+RO2<,(jNv_B댞V :";S+wO'`b-UOɝ=A%3[5#5➫H3ˤRmen)쥉XF ޣ͖xTH*Ŧb4Օ m\ WB4HS%j\3YVUnQm%/3T@n@'n* sR8e202z\6A_6+~F~^&CURIJV!0АE2[c;āԇtu۝ŬH:uR pA\4{X}+crf:U]k/Koc>η>ڭau4`K;٥~tQ c5j乴&zLJS܅fXڍ7F]sX浖FhmIP9ǰ c\$q6+W pX%év ,*Uv?ێz]nިM HP'Y ɢzsK$-֋|Wke#q3MO w#;>)g/qQ==ܼİ7zJWu 6!!C dATFt~»^>fvH3'I/`?Prge*.^f.9g~&?2~/vl5-onZCzW<"lNF՜o_9=ukx՛lj%X\QJՒI\36>iR=+b}WY[ s'YvdֹR\)Zc^nb7i[9<򎮅}]w|7a9&0sseyjR4[Xς|_?7ӧ|w| ~/_? }?>`fy|Aw{8G3cQht{p:H&8g?BofK+Hh_Yм右Qݪ{+fWﺢ d%I >VA}9fDۅа3Q4gʋyλȇ6+u)9SWP{T:w -VӜďu% Z15ȕt̍Th{5AY HZ$>Qw/0¾PӒcsw^a+~2YOkF{'r#ssy`ӫAŻ("+ -EO60vLI77`{Rj%Mh@=b<68?3b9 xSIK`T}#zHӫ,u -drMV (e*a+_kmNSmDfjլ`(aR6KFecp~rJ\UݚVsZ 9Az4ꅞNԷٻ.5 =CuI7N$~1^̚Wlnetkc9Z$}Ɇk bs􃄍itt5w]NiN8J_obf@'sC\"U 10N  u,#AҥrZflu^S~a7ȝbjDUo!B| %{ܨ0O|:A5p: ǰА2N7 ևY]_LtR7,N`%jXDQσ4+bƊ}eaq`|HFugB ^zDݷ6U,$V.1A\<&>z# %n_;ch 2#ي.|OWYuPjlonZjnKw0"=τEdsCbɫXŲ;k㜉\ϵ ze\Z?r#bڅd9)^6YռJ[;HRz_(&: ;ořWbyˋW@[^aY)'!o0HKЄC=w_ Kb,Hy%/UlmO;V  U9Oh3|U -dk_FcUI1z$"'n71q$ڑ<' zs_<[C:2V}hgV*ӳs[L9G?B1EqGElEcL9X}*rDȩ}/FK׻I m!4"499}?.T}9{ŏi# -R]^`@Mwp. k+Pdo Z4WW *iL9>ndSBi0YSv~h!RIô+K2Rr1W]۰Kg`I[ll_774y):/_ fd q"?X>«x1`/9NJW 횻(ƒ_ޟa_-7okF`MHZtkp.8hnigrw`9rnIpd K"nyrq KӏʑvG\OuE蒟3G}g~'@M9=gؖp{tBh2bQ L.L#wQ Q }Am=c腙'7=s}/!: ymf˭ y-MzpxzfmC'H -7f3r.DVɶD,P˶G jƾcapk7g\ҹ`[ I`AhaD0kY2Cˡw$sYMb:]%%S>Mx:91<vZ hi_OOaIZy8;;eaO'ٳe|9GiH ``C<ǪlC)gg%~R~S i.*ǒQL?hٵ <ZyJU|=LQvf;c@)1f5,Uq{շf1-*@-|=?6̢cIng;>N' g$qpFDڲ :*BΓvgDY4n*(xol'|)knkxX ~T#;m ϋU߮'w5Eb&j/ąx?Ȇ3$`ayPuax|Zz Hc6x[|θ dZM]cs,2'5Ts%BIYa0!shEMjHM MD0ؐ\o5+G^VTlV^k2F4"/ECL<8"k'VT YbHvAb.j#?7[K]S^IȩW 덼I^^ڹs`Z~858p}k45re6è4݊;X^qpߪ>0U5ZtVc*,C0 x/d8g9ZrBHTITfE"ΰOpWk[U1diUE:X(' a[۵Ϊ__/#$uSezDgqOO䕂C)!lyٴuapm(DhQ -BBmh&vKv M gtti9F 9&Ad"7 2_rPbYiT(:i[ю {^}x UhK%^ַ쥉}ͺNą`zw*FVD<:`f \|G#晋d뼘9<49#]kX3JyM5˪%S Uk8+u1kPO1t0K3j! RqiL%>&4lv2wHb)m,%\>v;U]3I"[;X)ǚY>mÚ -5Qw}h~{]`fvX- -Z *fp:aKÔ;fhe.0B21.Յ"Y 9dܛ)h5lӞe:]EV}8/mVw.:IkvZV.1HZM^c'Boң"pu,KĨ|!-L ޅ/./3fN)Сoq4h)zL5b#4p i@"X55C-う3Z z9~A}&o磨 4 ;j@ctZtӊÚ[tk 5ːTa:{ -ӱ'@6K$S1]>"-]Ĺb(+NvXzᵮqj36U11F -H`S&WKk=ZT Y}!>fzkm;~C G+Z3VjV"Kn dGcϬ:2{tthGhbGx{h*ǺKM*h 1]:LD=]q5TBbqZ LMRAкZ,,4mp -Q2K &Rnj *j& c:&tʼnT! aU}??xlMkDj+-]Wd 3&ae?/i:S,%YS:9Ė%2jֱΥk|liv}?6=[i wI7!B8F=P\ g.DWӥ O-$]Y gn:\׷m!cOxolx=뤎qbVyiv˧>?qM#3p3x7ͨ>qە!ۻW&khnx /Y"i~~˗_}S>_Ço?|zW- -?'A{ ûJ/w/_//E;msU -Q9\{CCuߋ*xѡckMJL4D^F{$VK$-:3S .$j[j\(dd+7ev?z^A DAV"gҡ -,YU>"Oe :tq| !P# ml(tV&ŌZ - cK~ѸJ-.bXPi:z2S -K>; K : ,tdqJte*`ἁ BoEi٥gz]zms]($̼y}-'+x`Lt06d+g%kԧHdfTI58cô@5Q(` (Tw(@Fe0;*y= VDq"z8$I^e:=WsVXSicT<6g N%\V%8LLrFRIHL203gۧRx,}~n}է0t0{6!iՅiAڽHY )rAUfA"3/n""7xFt2M~< Ѭ:$r[:.GykH5fףSvZeע:?5~ %1DZl[aEI`؍3j[f,cP->=&-d0_٪D:``u˕a,c2zՌf?:Q~SF_ŔsV:`vˆl~20"ҙﺪ^Zj=)RqO)?+W.2=R*1L UjFqe: ;82Xp͉4AO 8-[`.AӰ}ڹVJȹ\> b* -c9ZkɪEz"Q*z"ZD8Jz,ҥvr?5fh7.-ZGC4 幎.8tF)6eL:{n)xA2PUOcDuzsL~i58UIަnH^}S asRQrHIn՞&0hj>UT-]Y4zZzK@OP9WuPK2&RW,(J۞v)C4B\e]02AhOyEtHZd[>jy=ۏWJI`PxZ#_TR6#hbz_o꾳?V[RYsLohHVU1v95M凐*k&_MaooXuCzB6C;~z gmaF;mD8m&,D!Tޮ3jmx@ ?=oQ̼CCNC]%į>!VÐ+JfuC6Mt9_A隫܎PvPWa>ԺEϞ9w~_?[?~O_>~_o:/_~?O>}?dݾ7?ߨF];fc{EM_ܖ܄I TU"[ BMD5>>ЂK EvW0@m٤JpvV=7򾶡>6&s~o8l)*xUuKI/QjW$%R=`'/)z}V2@f(:`*`!=aaS%xZd a s@ў -K٦<1f1}$|vա^26xa+Bz)!nlu@gr- $<ڥPxs>-줎*q9%UqAUt)]P@0Γ#\AȺ϶bBn$ WdC  -և2%0+"DG c,?W!!nh@*|ɝ&̓ޜ=o.--Aѷy&IzjMnlc$vtAiڏ %{4a@Bd5c -'Q@Zw!A۔H7H:v ZlEٶJ GoB>Bӣ 뛑)˙'w1ǂ3f;kUSjW$@4Z pk(vtԶãt"$g&Tc>mDӚZ"L* -I$L3 adfV{3C9Լ񗌊uS8#MIr$8k94 7rϯȴ0Sj1ķJNS!^b'!i<=R<~8oٖRJ*QAwK#!tTãzᝍuڶd'w+`u q(/]ˇ`|:!$Ð%Tt I1^23k԰K+$;H[&\__ՉVi(CnUYfk&cmXbMyEq9V%A/ecICrA`Hڿ/ER"UF9e4P8znp XgONMECzySdƍS8A+x/_ڙ聲īLV.вTPqY)ZQ\>51.mWOw@Qo` :!c'(f6r82T08$ԓIܘyoQ1_ü9_ - ,BcP]h`4 ͑\6Q- :'S]cC,H+h/OJ JF㊩qyqǥ>3~Qɟb/bAKh.^ -N48cV )& JgӦ&XG0NS JIm@ - hn"G\ۀV`F+?xR\peXGNqû']7.v\IStn \J_>볐 -8ݏ.#㈑:lĨa9JNA#;%gحnZ-^uyJ)YW@d}lҮ&Ly++6JRn^.YQOA0o^ypE^@)0e;F,䛬 -/O÷BYi-25.J H>6yW>SGu[s_ ~S- R/5" u#PC^ޜpA^@)~5;3~Ngt-B:Φ}^dոfN@zcw5as\1uTM50'vVvp q~BʷjY'W/Зè'*(.2pf2Z.}y%HgD$ѢLπ7AUB A4؊<-B&4{$<'Si=[zIB5&uw]+1ย/ |V,cc1:-WN? qE[wHN3o_ 0*)5&Fkca2c]@vFmO7Dr` P2?qH,Jd CU+R< 0>1j2XeԘSDT:+xfc: _^n2\V#TT1hX'|A?oJyޡW ֫jZ{TDSʪ --y -Ih|zPsT%ݪ]*ۥ*S hBJ@ސb=n:+b\FQku.]A6T=;J D.kXu>s&:Y%=JYY -5{Y@zg 3KUSRU@]UMlu:UūW B w^pzJZO,+e)l#M깠tyߞlOw\;~E?oJyV]=4cdѢ9Z f7|q٢H[:j_VsF*Z upe; ,8'Qf9~|m|gƕmh%h!L׾W*PC[~hZl^}d?=_>p"Y !O<'@>%"B!0Zic$q[`t\(繟 -DlC1|\Jm8fJNN@E''A1*a7 .OǦjC+~/lNs1ΧY?&* ϋFWzsX8\}D ֘TZU< h1T%dSv-c:?p+-g>)4&6|>FjxbDrdE?0s^םZOYEǝwR/M%;$Ea6_trʲǔ\){L^**nD j7j!Uy2 e-g~P\ je׉vڒ:IV`,]DdI0`kC?NՏz^-ꆲB-+j& Y-L~_rST֟qǘB҆OW^k]@kQ'@B _=? #8{ ʀĪcK/[a,JҴ"ɺ' E@R|J $1Z>LLb{eܯ+c5~v+@1sB4%/,P ɹi%qt"%r}ބOowoל, I1cr"5.XeZhD,4 01, (OȀ`B4)u.RXF1搇b_gXֲA:"ԋ!w{8y0F'Aؙ5ϿbI `2b߄.wPWcA1K(84P%;aRDW]FP#1N~Y<4'ßrE*ԜQlvK֦1~B*qA|#FM܌`?6a#y&XiDGEIO$GyƲXr;z&p`c2Ho;7k.&0pNZAYRߥe(\6D$[>\ﺆHkbS˭e_-A46 _&96Z򬔪-U@l CitaltzjUݠcjjgcy;mW _l6_<܎ġMȷf.m=_} X5r~,4#oXWd -=} 1PFתqv)GUx\>Q6)o@r :g -/iOzwFR?YQ⫝Jr2V#zF8|M;WUZ6rj7:}`=&$ AB+R֨\0"Z7kDs/5µ|%bv}m'=!~돎fri 3X0wG3i'Qf]O. YzF(F*r szVz6m/–̳FV+ *{fZ~4oبJ]zGg{+97ք'(x]nj~BoJ?Z `( endstream endobj 210 0 obj <>stream -HtjGY&&#u׵;YEb ep<\Bj -|p@X7"Lo-Bac2cl}T^Z o j iLڔ`8,lY_Nb bDS!6E];+-Ny Dj_)Ɉ y\7\ 6h&M  -ͫo^;ܾ~3o_>?ϟ=?|<~x|~W8n_O?=iYA|{F~_Þ_C?0y?bnn O15 Rnp*%\ BY#SYC C EjV-RceW!GP.SŁ&s-ijX.4몑(OqٖsHlAmj^v21b4bQd!Ea[T(^}N?F&/OB݅Qtrɻ.+\ˎtq#0tfe3 i r U#Ff c,qX1K*/`/af 5NĠőɊ]A5 %ba~HH5- >suvUqIPbԧUY.zğn3"} ʊu}B)wF/Pp m@r4dƫO0yP?:8qDQ{5M JC!ot^Fh-Q_b'Hߩ2i"3lg BIQU*tGT(˭4WY,q#8y假R>͵QCym1 uu1xݮ|eW+_oi-ۢ -+-5UDbQ5{O[N qy.u2T4ktYR9{Bb>I +\! -ZKlaDP]GDBҝi>/BMAOqWOȠ_2c915 H_I,6gyRu b,!$J=.d v1hz4Li1QffFѪ-/&ziCĵeyl9V9k,B9k#ԪUQtC}bMqd7 Q{oqS/[Zj=GLyJ-1V/nu+'h`I䈲z[c ~uDe:0e'U/AYym#|HxKdL9\A\aaUKvTcn7%((z*94LNbmU%B8B%G.3FRМ -:WJpFYA ب7TGE.Me&he@'0uGgS8ehk)iBY 2ZWO%~M -h=fSiYeh^2pMIUžz%kpUmj5ϭ(2-}MJU#{$J.3$g#[sVrd$,T2˒=.TpJ TۖDݏ;Yך}똌]E-ҮD ^^;ܾ~3o_>?ϟ=?|<~x|~O4~tO`xp7~__v!#;`ڻx?wم|afT9mBnCt'#7 9c٥|vB1Uw91!Wc+D ֒xNSKpP$e]rjIFŏf Zauӕs فfXFF1ط+`\,3,MDs7s*6lRϐ=E^9s%t:L2o 0H=kVղ q$kDޟv}NMQq.&.`(Twj3%Nr7+T6q2 @Uk6`h)_*.fיK6%b9^D%bJ 88ۏK)D {׽TG6<9X)lztebypEVVߪ }'<ʂ`ksw*#$E\+D ܧV1;фScB - jcǡ)T9_Kx`]HpzA< \NF0x$.2G;kl*Rkch-uς%x&.ԺQh%N4=ڤx,R^| z~k wHz,Dl{BAMHCZinBDz\a-+5(e*!.IStHx9rdE*xq^5z6 wh-"%ꭑ8dѷ/CMҌ"NfBn4g|ӱ/ 2V8kesI.Aڼxo̧e1rlX vJk -Fgp]{0B5u Z!MaZNE -Uo,=5hr,]KVmW7~~y^4OY/wful -}p 4'=9y4znGvFI:H[h`dj}eneƸ@/G Ssc#lLR 3UǹsI/ղ .#Z/p`hi #z2wJc/"m0~"֌h>> &a -?`H(`N@A{ -4 A cRu jcg - kYEÓGW<tHPC $YABrOS@Eѐg]̔80DъxH04ҽIcX.wͷ -raa^J$,lrX1J' Y,>@q@!$CBu'Hl+@vVz4ηV˕mپl!wu]R8Gq M*i9w]wyIhAҢI#A)# -ĸd򿕡ѺT_$Ü##IM5 j0jqHѿ\M3Zvf%gR s=.9347ʆkӦbQ5^sG'Rc({ոv6PGBټ!v:+yDِ~;x}y֡ GIHNsdqՆ[6%R {+Oa "6g.nFND `[IOpqb* K9?|K^ MD7&iT!R9k\#O:ÎCHm϶TU[с7P~86COofbFA4X6bhndlQT'F K |Xaf-`}Ӈ}O_i7߿Ǜ7pocn`HCT|0V0A_6e1qqwf  c舸/D@*^\aCI0wś.E 29lAA@}i{6]K(ZFKvшX -e0hvV3{έ2[$Cm@E!.K3{!> 470ߓ -1hz:fW܋\b jbCMJxx:bf6d-+F8A$#q9T6Yj A+ZWѸɹ֗$7I-IPCn5^ and qvSIg_Ζ'1_/P|^ԧ[tgو!{Pf~;mΩ l u2:?A q!"]/7zeCӑB5h#A`EUY8e`L+iRTgF$yI:x8z퓭l4gVtPXGuI)zPQ(="b=As" s>mʍȱNL"xVOIh,22[@KȹiBܨ$WO/%#$:PwwkP/?"dQɾ!ܙ}"ސ>Jx $"xݝBFvqRDsY\7f: kp@#C7mc'6IH0r⑃5D[nyik2K=;9cgB>h'cKaZ z"ͫs MhjiN8 َ4n}U>&ˋDk[~Z'.&諗s8V*Z0ac+Ir'#?kļnZѱyJ]b,Y=Ǩ^F>Ӻh|M9*N8א՛>ʑ=~ طyӪJΰ:ڎ^8?ҫeGb ~AC/ީVXlG1Kf̌:4baATGdD^Y9.T]쯜>9s/XbQbP8E}Ps⺧jz6"L`.Hz|ƲQlͫdZH#Ts@e5Jm(rls]tQPjk+^$dMF@."D):Byܳ߯;_rҫG7r&il(647;t$UqqiV >_zD-JҀcm&.-#Lf^#d=Vf\2Pydoя42cg\3dRBK4Y?QSY)Sޜ"YI""DK(<]bXj&sL ՝4ݔF(朆P|)lUB3hӧx~z3BDt9l\?|8ݼ}__ߟ/?ï_巄旗_v otǻ?||]N3oOͷNoSP'BŬU#Dr*An3"'OW`*t:{gV/J/'Э h^MXt@E[Uxbƺ D1d.4QUaL֌{ -sҤb`D5oDRXJ3{+%3)qkDDѹԄ)&摂={,s,u;T2y.nTN]T -I exH -gf c+%B~bjHcA"d{X~cuN!:Gc]fs_[68"[n*V*l-[5Cت,gVTm8ydRľdnCF! 0'JAsf -vC[$`Z:sR'[9~Z湃0 fkFi汍caLTgQ lTTKub<-uqA]z -av(\7p5k93ler5YXL1 T#9Wb -uJk,I -*xc89!+3W2Hfb`XpvZ=$>%CF@Zꌸv$A``+Edaq)b+2#K 'Ӵ8Œ(;u[Դ6l$D^vt9W3Z@Y'9A(ED5rSk*s:u*t[oV/}ksƳ\uy Rk6 lm6 o#VR&_؅X< i!{sڰL'Yu}i FW锼t_¸A$ų$ڽYB|QZb&6gOifYyO{> ;7WwP8+:Vj;8fvjNcWt[71WQěn%Iu0R Q4bKUlLzio4BB1[%{h›Z:2B7f0$ ZTSU_GD݀RWS<&,DdL'+"n(Le!X4noAJ5, -RcC5w:"ڬԮ1D+:T|B7/LN)D$ -)t*4Zm̖]TH͂9Ebx9j!MKt}6O8k[$Й.yg76iKT^"y:]\x}WQq,Gf H"ӜPTk{ @6%yBpu0ZEw6Ri}r7?}yx|~==*]o~yoF7}~y$;|{/A~> Ms jƪLV!NAtm5L2{: 4 -ժVz%hVptUy\_mmg\WʧAjo^EW-V湪_Hoyrxm˫іk u7@-? t[]@Ҷ\7*}n=^Nx -{yxFMh_Mz:.Iǝkb-/0gM (ȳJg|1&o-i&/A]fJDd5s;^!ݸ*ӎ_X׋Xn-iOn yvb"O4GXWWCtG'l;XӍ|mJL(j2(_'(mI<%>? -\݉PϕMrqi=@D.| ʖ`6m!y+wNFU%*39/ Jy>ŘڀAyO2B:y^^S)꽊&I(Đ.\9H@M['*6BPȩVr*ߜ -C20ɪldL3`@T"ÜA!as*eNTo?— ߯A92ֶ1uP/=Жbb -)f}@b&l塂.vbUkŻ4jL> 55NCB덉 PM^B]T 9:M: RWy̅h`~S?.r\ AC^88m,PvGp@m/^8wV΀za,faN60?.Ǵ&Vl&ےX#;=ȓF-%\[^6mȲpcmN:IO[bCǕHT;:Q*ȚTg:Ig8=G'L-Mn [<姰k]Pu@/d[ %db%cQB^}zO`]7"4!*5_J',!41uN -)*=]TK -B4( lY|HxRN=ȶ|)rN1Ѥ-l򩽸 oĢIu)8{t514K_K1H` -PMj_Jh -+q^?Q~WFʴk M+.iyD\biea+ ^*aZXA7< +eze5j(.*ز!˪7QݬRTa_dCnyibcV,RTTOf`BƖ#ʧ)a[ 11IQ20)V/Mi'c"MĘ3j:kd*¯R!9 mK?wf{1]8H@sfL;3831^LU3Sēn39AuBpO~/iw]$JsÐF70nWaC0aWqs \ zfϠ{v.{/=1?q&&IcPfNg-,A-Q0FQw -#Hp ' I[34\䬞勯'p#v6cC2FTb)1+ r3ru1B -V)0iz$p YDLYX)>)N9}|(>1GOL[*q!/~yW!/?ݏ?>"t{ -ۻˏ?_?)_dv滗zoٞ{ɿ;TMo!y y"|;񠜐X͆#C?k%KJVhL~@B=>_ӞȘHo{i@e*fk|E=0Ϻq"חjDAr/h,E|Vb4ܶ\ -g1;~\D%h$KN4xr '!`S-YWjl1F1('6$x&?:)ieS$pMZӎ\~K1Nڑksλzp Y׎-FzxNpu34\)vi,u  cw t-~q/NoTA}qKNr՚ "Pߊrky@etZb0CVC~թ \wcBざmв Z^J)1hNȯAأ+`v`{{ -.3v {K٣k ,"F%iQEڙ{,rv))N '7eHPfeJD z\CKy,z=ˣ< ɤL .C41IӸu1BM&Iդ4el&͠9mqNTDY -kxXj(*B7h9DyAZcܖVWZ9KhY ѝ7ʩ˂Ӻ[@櫔IZ4E D:HB3 @"Y*NQk)Rŀ\ )ut=4?o LgVv9'0=*m_(rB5w}ȤX č=T  e!+{\#gbAjfҲZ B3<m/O@4u?= yU>^4&rVs.6-8,4ÿ=b $yuZPᶹ{Rpu%Au(9纐{Jݗb!bBVX*+Ă8f+)Q lίo`BƓdG9;4[7f*%Rs2[5XDVp9,LT3g@, lQg+{,L\,LFitӤ%fKy}<ݼ^?ׯ_?<<~߁7~|3y}'T?x_@~;Azj ?#~%'7`G\+ 4plS 1߂!XNez@D˲O`-Z;wgYzdt -Fׄz8@9־9MK"KΑ@y~WqmA4d/#V|(yBJߠ<> -˴lyZV{hU5}HOBwDElԳc3ENcœsEZ -s|xs)#CbҗK#CP"+A& >j UU!a|/䘃͑!аStSRڠ4XAGJҒ)o-Q'=M7a#31G~Ll2ٓ {9h|_ꃑ:BS}ڞ ^%vuJ,KXUɪNL+7_P9mPw( 聩3p@B": W # ԹR"˖ q#<+8SF t\4 sm}!ocůwdp6:"w⹐3]bfN[܈]i؇LPk|y̱@/I<$SBI`ASuT{ Z -0b2ĽTp- L}*zq:uR言m x[ ӳV35\Pu4eN+(I8:,/s*Q̈c!y@͸p f8S#FPn۲rejrM#9[u9x^-iqGjp<'zy(But/j @Hg0)Qw`ɑ^&0MA'9]ІZi>'O6g.AY~9(clN0(GX(:fQAs|̾9/uG^Gzelq@g1hVqt]T[]YAo7Y= 4òAгxY<+V0l]4G ze'z2Dn2ŸhOGEf5&(E4QqM}:\93֝S - WNU|>VNtu!l1. *IS6Y [92SClSFrSæFlBKdžWNQ5&(E4QqM}:\9Q"VNG\+>- -n'n2-b*/z3,h)%Qgh TsJĄTRrJ -jf 8O |tCKc%4BFuٖ޲z ~>xy?>ͯ_?<|9??~xyx~?f|t?O/ Né|ݿv8 >. dddBRp.~ca@(i.f" 2 #$Li4YW;y L2;߄fa@:Bߡ rt4jñ+f%5I8$eF6Sb)48A!x \`mOmBU>-W efzz{?X>*aKHk2@iJۖp!ꙥDeRTӂTu }1x/\ g5BmM_SK}r{%v:IӽiO0 w,g-LR޳Kr\;e{TҳO*kς?= ղt(ӳߠõi# P{Wo6g֦Mڴau&TK&@imlvKRzݚ&'6[Rfֶ51i6%$甪RD*̗|h{HִLvפڐ\)HA-H7w!9Ez&\!fC9&R+={ӡ{K,%6.@۸ž7. Sa~ư7.,> kfeuo)K/oPh^&+v%G~zU΃jh k+RC[̈SgB QNNLE|Wn΁[^_P`fp3g"z@PY>.`6p1/xXX54MnCjҊT1so&X`aiMY5.K;|D6|w,ͨ.;$3M&B5@DEg;w5hyN4:Rc z2="@=;QTb֣ދ&2لf4[X#֍x5exͦd{Eou գ=Tr\C(HƳjnԼ?I*JTB8H[I!p;OHMPs?K -=:+) ~ +)VRsnoϟrO?s_~w?> /OXno?x{ϧ ''X?#:~iBF*xݸs'``wCV -<5PCO"RXjGUaY@KVD,S e&;LQ!2' z^AI\.v^>%N\&A(e^Y1Gs3lCX*Tsdd0l$ag- z\츆/wwEƿ&>&Ēoݸc.ɸWu@޵x[ &m3.`6Թ׷`+o=07[ l[\e->]5ƺvM;۵@ΟHs>T@֛(~Nh<kcik[vߴ@kljPq-PdNLߪs>o36紜 LFRJ0HM%Cn +4+B#*ʼ2%ʻV6W.r*!\1)!̒!f#5\ ]Cse}_츆ƿ:-O;328+/meLtܕXsUΝizvmUAU؆_{VhsV:_pu6N˯u\CZkWخ]dV%ڕvhftVFpeM-NZc+k-JVlmJ6*X;HF*k83f\"*-q t"m_9#0~_3u<>L@BCl cD|Fnu.FbR;{s+%e d4&$6ooi|wr!:!&6Z,L  %fx4|&^}B^9*9GSMɫ.oq|UQm"lei4L;t'yKkAm - f69Zٰ͈ Ar[ymsRJh8E>{YW{uYK֐QYSLj;y!=.e-3ϊCDCJV5tS<4؏Lvwq_qCQ^e.X`1$߹oɐ+ɢj'<^rr#:>,x~GF"Nqy\Œ -+͋cg]Ej~G - 5#%Y㰈AS@ <õ/PHDI|"&ڄ47HlIcasZiPbj\EN#@%uSf1Dg[D -%DWiwܪr3Iw؁ $#?Lfo&7ش H-ub頳troCS" oԚ;UA v>u\>+i%?חWX:4a`R(arjJ?z\*ԚT9xJ4ץ}+'̱c\)HQZ LT *ncj| ~@4b0 v -)un[|p/ZW1i1EG$j,ZJy J zuckd\pqq*4a;ChjySRӝ@vAN/}P@ -ЮYCEp!R"\xbex&oHxH^bvgbԧ,d") Tac:_@sd7fL)Niff:ÿ jNf,$d2jCX%zYyaK_*(cB9Y(E&gkM40ԣYHv9?x+sa]v҆h(S-X` /O.,&Gh{3 K"sY; +q@9$kwlhMimf\-_o -|ml;GPar/)Rj~OPChozs˅]ϝ~v_lǯ?G|{G4xEj Qǖ5.0'9 -2a^AP32a`Gd@UEATr d(ǀ-L]r|m8Ѷ^3m9߹lŐڣGdw.hc|͏؆h<_V-q_5.ŗʭ7rTcA,1D/՘dPIbM]YrmS76+{[wNN'ąy"t*.(/9L0WTxeaMb-c1..cyEܱI^c< DiH;h k!U퀴n4Ft@ -iQZPt@q;u_;IND0fM4R|AR}q@]J~(dЖnG&wff;<@n&Y ~}+4?vFx@\dZNq-F_7ٳnɈY(UۺН)_M4ȣ .#Fo#B1j˨OSPF Mf} 8$Hq -H+=J@Y3[ZT@ -## JU3XtDT0( )uDZХTgVm+U\zr3H$#᪏hcZe#/۔)ܐƏu  `Ji}rU94=ū=;hcAپ|D;>stream -HˎC/!iX,^ dVɁHp>]>hX3f ڹn.2mi=jtsH{nԱP'v4JcۚwkYޟ?^x{Dz//۟wNm{Ͽluw>xoӿAzִyw7Qz/IH-y :78s>cR睇ƹc`xSSv沞sl[QIdOdGMv^24jeu;avY>ax;N}^d<蝷ceOZ i M؁{_.?.Dm[V!WŶQ CKr-1y:ڹ~Z{T -]K{JwP@mAeJ`q[{/ܯ )ef藏M,B:m -OM.<{zP#|̫#Rg}O(/'됡H|ࣉsp%==2o ='%|u"< BZIpTȜg4jlBx:4g"k'C㪨8#єv{\h)b-PQkU$> 0.$ >,gN$j`&?u"뫡zW]%WtLY<4o:#AO\p× |cs׸ Rޠ됄MXQ=> FjT6FTG׬i$W@TThAB6"&aUGDPn;a1x[!yN+T,z JUZq*:Eb}{6#J1 -˔^iRdZdXf f0^"6"nm9%Ebr-Ezç ˴9%Z5X\/j߫\<$\wl"m4/)wo͞C-TLgXUi| ҮTCx9*뙨5UME-kcqWEZ(Ÿ{@<=|ܟ/XC,1yi[~w)Ips,xYVR82/^[6#Gu~^.@jΖ?, u6!_VTf$Ӿm]{μ9->9sT5{ O_z{"}I-^]\CR(k- -ƉP(rBh#⍸Swh(0GG2g{V9(XPx(uRcy9c:Zn3ƣj9_;'Q@<|.SPT$<5ǀ՜U 3b>:6j>%{RfRKzh;73T7pU'3V[o$*u/_;2O}zN˲0}e4tTiCk"C)7EmJ Yt$RXjXbMc":ҭSSc[L1E2x%vOB]$J^#9.gۙ}B0l(IGQ#8|c'-m"AW#NglWjn?ZId[8] -]{ZB1ϡ:ǂ#7}sD4`vjG8ə-84 Ce>KAȐDz7iˇ@lP,T͚NSGnRj‚VCcdu9HlXZ(' 삆BXhd[GQ&Jyku֬Ue[>*E:!]_{ ҷVGjO|wS(4w5q#Y6Wt癆vlE-Ϗ(3lv1wmԉuB8WCG! k7B4S0Fp lN.:̓R[1}ӼC%#iKRԢHe| I"v"%!jsjZ@%&8^RThQ0jԮ+klybյc ekŽj;&ӓk44}Z؛󜳬? }L}= +I\G;1#;#k}\g:  qmj^製I'?[6Έk@R6\<z)GSP -6:PBUbvU$Ìsy -TΚG Yn˓PENow؃5Kv_*W S5o&mv+*IAs&1V)3e M;O wRatvQޣMg$-u\tSl?)>"z`֤yP .Ru8SZ3ڴ$HIxh-7XSTjerf\vI>*TݺlE/Ӑ,蔆nq  }&#I٧tT31->̻R3? -b$qz,|wuƟ}_㯿]yy?~zǯ;姟H}y_Ç?B˷߿/˷x|+Nn)]^ _Ao?]~| -0VWv8Et}8yyɋt I:@Ttw$™ Z8RnSo*;rEI5q߈HNeSHiڌzP!kiH68X6,:1>m=/1X|7tqI`%= ]8]cNИ:";۫ AYL%ϰ o1uO=@fQ$T`#!P'P" -V-Ih{eőȋMi;3٬9GrG'բʍ/ h,':YB.Bk)&sM>wy30(ńCv: XȞZfEQ Cؖ\@(L34U7 5_߀2ݏXw -Ds?L7!e_j͗ Q"W}|Q*ǿ#W tj?!],j1`hd&P1Ӓ]2hbCx[P]`!F[eXԌ-̱de+&gj>RF2hPrkO- -K|duC8iZgi=C9[V)J]dej+vsaT}Zgl5^P' C%L2IH0) ʁO*5 !YA-FdnbGfX^~(7iļvZv-eJjQc *;8*w3m};{ܾQ_Z")tL֔I{ EjЭ',k<.btrz-U -9hi402;&7@K>lvFf@sxjV;P]XZ5jy $K:[,lvz F6iA=] HHarׄ&Ғ[NJRz`-; ITwLiPrP$zJ/滇ûǴ!N -#Uk*ֶI +Zh5ܩN5B&Ȇ\.u9ұbA*SY<ݶN) ^Z<|񡮡۹^Ӎ`{ȗP$y!PIs rvu+B+Mw`JտDZ/b+YKw2dXM|Mk q^[FSkܖ窚QɔV]"h V)_#wGs5H%y9]V[[1L g8#0SM+RшZf"SøU簞9;9 7FZ0ۍΫӾLo>k%J) 8 %kA`۸1Tį(aܖl3  -i7#`ۓ7*]'g]}'ʐkxI*c5Tl(&Cb6wu*Ds)ՕA\ːA[⁽WQ/C?cYWR AׯIѲ]w7uszo>޾)~r|xy|ztytQqw~o(|o_^z~O?O~7@?PVE -HJ+*.ןGǏ5EtiYWPx1{ -QRd͋?LukQ4R40ֺJB!LTdxqtK܌6eSŒ6@fl긑V߲~p[-6vֻ@Yi Rx'hicqꜲ).RVj%>! HitV]ӌa -$bIBW>64ÈO=NI LqIKfB nkOɭDz*% PH쿐:#1|x!D*tsRL|:"9k;5g/,[ܜ&`?%DnfJnQs|$MJ*4*&Nw;tD[#ʍuRzu#fZjR4%[QX+@HAsu/;L8`EZIˀNlk5u3V❵(5vQݠTrQhC3Ĝ3$wHwB?(хy"M["6Zޙľ xs_Ga( |Y8~ U(f2:ltYx5,fHxsf_L,I\Kx0Ҳ߹!D*{i.ڝ.c/8{T5+vɔbvM:D[zo=2_ݷ(x(6hQx+ n6D%_*t6[03- -D6B[紖zmF_o_m;5.9 -&jYŔK4\CRHݸ-*(m5ut Dt`}%Glz `dO+Ndd8"\>sæ$9rޞRKKFDE=*rP[Ҕ`ArԔ#4p݂ H 2B:I)cs²L^EQ) 7!)lJ$yB2S@TH=Mmq5PCFt)zMd/%fxYBYˏ2TKPM|FbDqrEloG7_J̈́\ipJo0*ˆ0 ߙ&]Zͯ^{٤1 G|vȉiIPP>_.5I Srh&lMUpQX_έLi.IG_-ܨ-tp3lB{{eiJL4j!%ct*]Utz""55#t?%'mh^{˯Wb ,:ytc;a swFDȖ:4 v>5uln -?\ - -; -oO8DJbdv!4&EFMhQ-B#s;B&Dl3EzrBM[̳W-P!j-gUK%jZW:c:Aok=)jJaaZn-FY)e4ab-Zy=-y)4;!p^Mk ~ppSl-T8txn"+HB2O[A#E -2OaWkefk^}]0òW͝!* "|wCI>d`!hq/8׊)hl~ewFJB2ӹnKb_$8S=ۗ|9%ʁ]mi蠾uMM}vTuu..] -y^.UWu ?Y?)t½H.4=6+e z 5Xf\nCZ@}KЖ_JpIC`*g+P fU!+6VWiVLoEP.sf^kYrOτ BXNSV4M164fDD+RܴIz6FSY4;\I0'V -Җkk]:j:&cRK+·sPd+ B|)~*C} -2ݰ6-_fm x+C4)FRNvn)Hk4Z9ę[sرvCr\ ȋD^F@(Iׅ?wۛ/=ý bkh*hO"sYzNFnG^8b)4\T!2]SPxZc4]#oRWa65wo~SfcPaHEխ* -@mocUimg@zWym +ڣચ+`TI)f-[E 4MCM!6[|ங[]Ѐ|>>iwaĊiӇ$c#HJUfvЯ;#i-AKc7_Wump J69݆ZWr0 ɌJLEjgFN$ҶP_d;tն߶krG *wG){=xtʕh9UNfc`1 n P7!NJ!"eK6!dxuh1+01`v+{ZTGZDb7"O?_jmHh!lG=s?"P1NńsH!$"CW2tW*k%ۼ}54ot -CTx - Gtv(uڬgu{[LFvN̓oe}b~GQ߱dXC^,sEi?t -JV٢'tQq_7aUc!;\>IYE1!;1oJww8/Gn`o){⠮Jȷ*E^(qNGx/nUZv545/'֛IV݌qjbc>@ dMDbI?{=앿={}Sgd"Tw$m ԁ8[YzܜTsgjȣWAg.f. uh)O*$;)r\s)lbPQ 3Qf:l_3 Pe,vE~ }[cmrA$vN_G,C\.R˿TB{z9ELl4`Ĉٳ!OaZdN]!}ZdY.LIhuI*כcIy֫Il+$1t1P'P!n -D;$^^bkVMB+JgQDM6$ !HNc?o~39Юdq0H@90">ب\ y1) 8Q YCB~'CM#f7SGn x!b UM0'TbB)j2`C*^b:`כsՂoΥcs>M@n-b^OZLGA;B܋2:NpP-sa@AԨ_%4cPVOZRaǺbN06H0H7VbQcl rfe܏9 -;$8m]#Qq#CR_f9=X s2NY1**znYbYaO2dMq2Z"2Z^u[zVrΨ<>bё:`/ yLzA4 -*C&RkXNhR h\1id|T˃jV#):xG@wo Tue-I;-o);/)޼7r;b 4kwN_OFR^ -eub )g4 -B#ӳ<Ќ6KhF|$EK)%;wUJU9K'Q!. u OFaOї l -e=Ir),_Fzw؋gH?&]%}B3J=j n!oQ_ބݯk" ~t8'# $Iq(zC^`-Ҭwu/ w<:6c6xҗsWG3m4eQFFa9;Λf=֖?ЗY`d}|}qvC}4xB{+;L!c&3_Ů _:z~_4zkȯק8Ƶơ\IwZ :u@d."Ga@TپWYq٠xePjDuf-јm8¶u#$!{7 -0PAQt6/ --DOݔyz=˪^ ߟFOWl<^j=w~3;r %r\_+/Vφ8Ho WkA&mޛ}ǧ= a{|=ysM^O>8^6zR;QC>?-nD0j4ka"|^GVD̜)g T65+vO$A,= ŠD7Jܹ00edoia{ ݺ_uuN/>>kO!y]s!^áJ.J|gEܚɔ=PXc2oi)㗎|-΋/Q?{D@vvya6Tvͥ -C,vXLZ8U޶d-#DQtÌ#bhۑ얼; \~0fYdp)ËX*&]FcCpN؈re],nFĮ,yyIZeYk"rg<E+]:#)Q掹>u=]%t;g辽YV ,Sي7:1>ulI n2<]E-v?oYDgN'}}($fI0YoDchwuޯ!Ky(-"7R!Rj¹ڞ,E}Wg_ʡ1S(mOYX'Z:H:yfs>O -$^.=ʕIf+&B9yH3\c v @M$zDWJeqg3YDIdw8UMmCEo!4r,IWWЉUG!S$Fc?֒=Df/:hlՑ4̽!;-A{7d'"PSs@3R'zĻ]u{ -YsUe̷$#&m!eGUۜ] -bjf@rcY'{>ҒUC¬! ;TwQ^ } VN~D-Q",x7JZ7JF_#K32M)ƣb^htT>S_(g* - f=@UV.5ZZ ׼hh\v߯7h-C#$hnaJKĺ'\"rh,D+߿TVLP9&xGQjOhC-OXrH='уf(D籗k}fVJUq7+對yl'B8裎9,Kj rZK^Cd]%IJ&EfL,꫗qGL+=$C6*`#0#܍?E3;2~{Fe-k7h ag]2o%>_ROcZ*B$uuؿZi$:%H+ (? dXAZanTgu'eas?1AEzX1޼r0pQv U -f=am=z'}cE1'IZJgE|]9tad*{/6@J %Q'^^xAeOw8 dL4 ۧZUDk 꺬";i:#x+-w:`:žPeNi9yڮ B*#&`>ϱr񄼡8 IbNnoiaڭ3 -ziA<KK]NRPTI9E)'ZI;=hfGz Y['҈ ۩*'R$"{Ұ0B}r u|[Ztȥ'cWQQ:-\Umw,fCvZ{Q.S܎dg]lË _NXϜɳg5<=. z -5ⷍ」WLH͎&I9aC(fCom쩻lhGlϐv13'lg* bXl|-=Waٹ ڋ5fx9]|ݿuڿ7F(Qb#2! C%'U0Q@LYy+BGs1 -3Ro6i~sNFئ*@;w[EW?#vbK4gy*o6Q.]6n65 -6?m֤b㉫*nڏ݄=!鎄cG-?]BVW=pI2f> -eqN;"z( 3£TArzD8)P _e?O? 2:H?HaW=8|:xO$9`?Լ)Mƿ - ]Zh,]N\t]kاX|:X<L]g#8x*jjQVwᓱK|cpUm}֌vnVA^iGyr>z2 [U`R˷Jȼd\П+p#jMU'c]tf- 5YyVD+q:ҽnц:a'PL]RoYzog{v{JP^⤝@zvYpǤwa9Ѯj HiekA95I>I( ZU;yۼWpŒ^r_ۖhgǟ|\z_>|zz~IkX~Oݿ>}?rë?>Uo;U'ת۟^a*ƟXA ENClLIs5$n$+f|&x`1-1(Xc@BZ=beY!hE-d,uGg>C/_e4<2%w)cveRPʼnޑ{gS*%JPD 1B{s$}z}#/vHz2͝L{qHs:(-]n,`7xy`ޞ -n;;, K{;<3='U!H7.HV[Y@M}7h'm*%˾R]-Y ,=`"^W#M%'ƈ"Pm^Nx{.Zu{/*^XvD>j^) $ -P$}!2&}jv^FY6лgo^G IM ހx75WrI 6p x2+ֱ̎ΓGC4J$Q7BDUG~˔K]iZaZ#ݪ>i[7fƳ߫" Zqڑ@KdV fOM4R|" 'M/MDrqXEH< X) >{,z0\U3dea yaasm\lv ^m!θ| Rٱ Bpykޠ܎ڂUuń?d-krujeXSvZk+B*DY t9SɏE|-3JOzsO<ԄᵆEvMY IE*6 {:l¶!F.t6ŝ7 QҀv8/s1&P&Y"؅8:3S93Ok.rݼpb8N SoE~2d9ˉ]5TgE&2wGo(;Y- rtВBϯ_, |%";2ٙa\D$Eu2{v9,vZ=M_ @2ѫߣխuRz/,S;|c4faٻdCJervtZl./Of݊~2>hedEn.ufғ@mZǜ)MytAbtUKYBZ!G $KH{L( -`Gy2iY8s"1.t< -,s{ŔTkt"IJg\8 endstream endobj 212 0 obj <>stream -Hlݎ\5 `\BEg \UEH*qޮU[==sҋ|;6 vI4:dbqW"A^ܽx×wWw~ӿEp3*ᢢm{2o~y/:O/?' n7_Pm+hY(PGPH3W &mN5]h\ uZ_?k pر c ;ԉ0$X8j+ashm|W4%3L8z,kkDk;FہvQ!A~6A,HC5CB -WG@#h}Ӂb^S;!?My D'SZK-lG4E焓{3G{.ꐒv0'gQWp‰~޽:ۏH%1kSviP<3Y>W]"@(MtP6:$ -)W`&Xτ}h''fO*S:>S6)Va2FVEP+]wCi[=;Spf(Z=Bu-W KyJY RlJO5Jn~abcdP{@Bj ]KB AGD,1,IOpP]B$CFJ<|X7JĈVj4uFB+rWOGg1%{9"Od'*GDYJm񜔞rOԥ2Z nɀa-e54SV4qI@UR"8cKLSFA6l[}G%̧*Z7 6lj=tn05 ZrWiom>e4C%och)eJޠeN!Z#bL6mUȭl0+_{]o~}yҶ>=<]|Z~ӿEp3*ᢢm{2o~yE b('+_uRDͽn@\6ˡ bxvqkR%+tMI -|PhE(e2]ЭB ({[M5ޔE -E:-~/MƏ=avۋ'ݔYp"^_) vFG z9~NiG8XB0#ӿx>ƮNP؇y3mVkA\[^Q$ח' m/plI{tQ@:_75-7EzU\lE&%=TLJQޥHk 3uIJ4^lgI1@j(1P[J!H -)(7C9\t`5z4LXƵՃ}3Q١ߢe5u6 GE%QzjmN3a -w+\3x*_SSWJ{K 4S"dC"OOylh%:˧QӬ'NV'oL-LiHf },}G %T7W($A 28*=Al=A|PGf9B#C*m@h;IUqDz/Zm #ҚR?eŮ# ~qa xakX=Fn'2#NYVGGd޸8Mީ"뎤¦E_!*FP ٛ5%7%hcVU B pH$ɼZLF|Y1ٞUC~7Jeto3)@c)r`7yBmZ@&vn"H.%!d)i\CX$fK\MIX(eՊU?AUӆA6piKhei@.}%uX6I9Y\6|<8MJbE&s]IY.\s$tV3 P>Z`d'ޚDJR!d/NOBC'.Gau%=UŚ[=,2׊Rϴ9 %PnC cΣѵ[_$,JmDq Tȳ):)DD%"P ),ed - -b˖4KV`c%I/u -te):kTgIZ+OkI%%]4is뢴.1 5`ʹ"ԟzfd3@.Ҝdi9\JT5JRly# -5L6ҽZV2}Z|bM' 0a:S,lK_AR3=|ڰfm600UBO}Vkk۝Tmr/% "{i8ci]DR#DYG }Dɫ BGeJru Ht`6pv8lQq6pֈ8^mH?yy~_GXz|x O7v?Tń/7LՉ )VFh?=Rt"Rhg4+:.;Twd*Һ-jFvhw XdTH ]YpPdPDAd.j.:DpXO]u|AfGLs˲#GJE![I(|{c ]A-2BBQ!Y~Iזiյ< ;j#a֐Jq]\B -e]e\Aȳu%>LžR7$ҷfvfTw(bK,GPOPGS7=8;^zCIBH5ݚLVa*rxs ɷT(e\;{we/RL,^WBPծBVznP OmB".fFE1~33֯͡tt9wU|/j]OYN[XCS1[A_q*mp44=Ʈo/iisA ț;lbsddjOضUR:spbjg?-p`g;}C¶:=zoO_>ϟ~y={|~z ~G~_GA,_|>L[ 䗛L?22bERЋ߻4(xCn{VɦzuI!2F%ɢ`sH1JSA:"Q7Y3f֣:kB kqPeBâq.B<ϧuCKGTz -js4@8!b:~Ȳ2{B{u"H"4U\}ucұ+{5~zbF @9%Jc -0VzDN-E;R0+U@sU+ZX>µ~E~k!Oh5z&=S)0#Vp|+5YwŠRbTG@{85tݠH-ڑ,q c $mlwOysW`޴#&&#alå@a?2`V. `l5z.+eA\?O ꪗ)HjdlpIt_ȟT׷"0tnS?EmlBaz{=l``{f\bߐJ |"qlWwoz,k*` 2CrJA -\rS*edBwחc7T%u&*Ai Dť${u7MR j}ntId8BeKwKCmwp] -^%ne%С鐍$ʫKgVYԱ%!²t`A,w^ uQ2c]`m6;ra}WCЮ6+C 6Wmꉋʔc7Y7Y4IivS D`I4GbW/2wrxoL^hrY~v#:_xG^ Lo sDkXl3gc~mbkb7F;ʠH$/ꅱoDL"h dAsR^Q6t5M{> -w:7df!\W a,W^>v]y-Dְ`om .׾dwzAa̼|}6RV:G1-ѣf/'NBw#УI -8jU87ZU)jvB~_߃#ŻƿiE?Cj11F VMNQV).^chIxz2ߤAq.sZ|VmRFJ/,{zf;[Yvrٖr{> -9c/^76,vqA_Kyգ\=wqzh~Bze1*py)-OKZeu A{̜' *T bKeԻƵ\h}o}LdS]kOM[@Fph9clag9A"8Q5VHrk]$9O8FTz 1GV;()fg@ClRyH(Qi IvTzЁj13c;eVedech((/Fyh()WO>qeW wMMKP)||ܠLk96wn[X>)bsAcվ) B+B2@QZSo0j!:ɉpKUh0hah'W =5^o:0Zm8i lx Ap^'dbČ:ARm@0WJeA`ls1'i۵Z}*Ee2Uљc3ߡ7{mprf@tn*v4Nwvp!# \e`V-52Wޠ 0Ě>$_י{kh>`ۜ'^S X6 C26qq~ukuduBO_*$C9Wj&a@steMiZ6iA(ͫ;ab1Pu>*L\PԚ[Ɩc@`|4~~I8;3a"=MNjr<\4!NJd\W=a?3A{xiN\R1CW35# $_iyLyJHt}PV^nIm V1u!h9ֿgd>hҀzxCZ ^g,Hlގ7jLpe!6!x3ZStV1,UTF-Ue[>Qۂފd܌MnXBqQsfXڭ`ZxS/؊-ئnȚ%ƿc$5̂iR*E'}:eceJ\t'[M#-&̡: tiV}nHi-u#MX$POҏFt4$DL'T*)l&me̳ml<[:c2ԝ1 -_e:Z9JjDekACZNlJNkXŚ#\myDVexjD̑X4@R[v,Zb -&e?GEr'{^zATM% z1B Ca=g)L !JxXdYI"rD]oKˊlЇ0B+)5~aieА]bgN XH'+1;Nr\ 4|HGwUZv߹m]Iz;Kh*G)xg'|^ `Ҿ5[Ni -؄/ss+Wsh?2fx6uhb;X=^7n(36-aGGQVVMa*Jp pŲڨ+ -z ך4 >x aW̓jGӬ5ÆJаbwS Cf$ Hƞil!#*[8GWideu(DR{w[8/ ӣ)afS'n$Vv~ʈ[v&?b)ɹ{pM3|2B60S8PfzՅosKe.Hq -4?1dj {r13Pxn JN8FzG8ʄ37OTi#ʯFN8y Y:>א(dpiWк PtVxȌ9u{Im ٦Sʱ@'Yƶlͧ-bP,8̶(Mn1GՑ'Đ3t}<}y=*??= =||z+$OI_? J4_}}d-fse^p0Qé} Ǚ|t{jFՠ W6g9_+9LE< .Bܓ݄mFmFQk@ƝuF$^7ؕPoU{di[N?N!xTaCteE iڜGp8NL} խ9|r SsRqǵh !+FEt0>K56j{~p!;(}An@EA1M@1l^5YZ"䑀 [9à-+nk4'cH1HO3$d`4mx{ bh19-JᴭTȓ^rr`R4'9۰32xV^9E"ԪSݮsLqH}[݃.٦#ޑ3["m2;Ca[uվw^制#g,.j!bqj(7l[:q4+Pv,NjU`8G<,M84 ˭Qقx\:*I2툪R oprcqF=ke3lhz;z?nc1S%h~@ c$%Ⱥ,djBvmw30s۔Y:AJs$6 ڨTQhsU\Dia͛ )Р%٩PV㺒?!1 K02mhX2( -?UV>~yBK{}Z'LB5-8ހWOQg)EZȇ3P cwRgfVX,AZQ0vZlFLmmH8B+е1Hm8MSwͥg ) Mj#(Te.<P#C(d: ^'#@Ncp57҈y88)jsV.s -5Wj8sIIJ7j5ퟝ{aMܨTm'h([Oݶ7!pf-sQWϘsWyʒ'ְ$"Fy'"fڥAd.7/򟖩D۠B/'3`!7cjr{DO4%m`nS-AG8ִ8GCKX4hVNMzW6I0̈~C 2M1d 9omy{뗒4ԧA 27MlsHvD -?q6| g#"6ۧ3e1̓|H-g͉5g Z K/  M -qwҬgī71՚0 5ZA$ Jܽ&%bY'ϸrLc/{ $ X% -o(Ql7GMǪ&'5)aUJOZY|sv۩F 8$JVmzWF`? -4Z\7Qw?\On"x:Ep҇w71=~y ߟww?O_I+y|t񣠿dj^#kcEwG_R1RmAKs{#N+Iރj,BH(!Hu\+0jz -d*~[M{UpNiwR5{"֘%$XLeP{ݜa0a,h3{]T#PJOZ1RE"[EXhdB% Ez0 =;K[D&R+:'B~NL-i0܌ >ktr; 1 -CxYySx#"eliR/2J1\h;nPPH Scء$ۈ$UO`k @qJFH:-Q,9eL5)w:NFpfHr5E feV!-d/&M6^S@")x}\T"W PPqNÈe12f1Q^tUSYahPB?b TAXs_8J'CS2 #2%sܺA>pkШ Lٲ@IlX+PY/5#bs%-sg5(؞1`ffo&pB"6[_A/eRK<8Jg*!jtἪ=O1 LkэRV`Ias@7383 -Zӧf:t-MMoHNNK,gaF)5Ejt }6 gZ+J`[{ty({BW@6Cj =KRЁcZR[%wFNo7Ad@TCRa\?8MQ:+"V-_ %lu]Qga;EV:i&>TB4yƯM5BGpM 6-ldS QmݸmK^QdȺW|o6BM#~\M?ց/ -jꔗ0n<مOǻEVWGJg^?>>(;w_kc(e/K -LJ,qK~n;D^sBUP=d$'ȨbSƔ$%)W&0 }H Pڴq J`p"15֐lXL+d6A -dx,>_ ;X"JE-H'АݭS@'`KyVw'`n$E渢>uS/9g%Q2)\869AT+[O^jBm-rZB*j9m5Ku%..gkMow7ǧ޽xۧJ/N,KUH/I,I-(JU(/Iiv endstream endobj 213 0 obj <>stream -HWzL/B#tcdžD,D?c,.(5v9sgBo9`b1yߙ+Ju Cb-ֽ̨8~{'f,,(<,T5p'RZ6RvʁDcb!EuÓWF.NjLz 2}я-T }x p;  -%Ɵp -;O {6D;/bKWNOm \^x'rܙ}Rz6k?AEcŜ{~$pP^yx7E Cw'PZ- ݗ=Iu(Tz.*/nMʊkEm&i3xa͍=>şUO$F17• PK#-m +Wdu2˨9b|5j;8f[ f&s8n{b[!=fP>ч؇6DW+A8/59Ê@_,L+pF3ʻɎߚW_NVCv WVjcbF׊1;GxsQ6 5s; -\d'=>/ -|${/.B_0X0/ Z0rڂ0(f^5?;yp<(/Q$ 0-1zAFP0MwZ!lb:(ClřFSKKEbR4:қh:s!@p,r*(/[p:Dzq0O6}HJy] OD\ FcuyIf4>Zi - PTV[qfL% UnlAX7ŒkI{var0Բ;r_b/3b/:\)-0}W5KDk7> -_`9>EQ7Ic" NemU"@䨩1m1JAd#,NteLc*7IۼhD=U$\[Mz:W֚bhߞ0VHϿԝy)Eߦ^x>^q`^/_jRy0b#'~8Yb{dypkA{cb?-B_g^?/V?/^c{/A|E.Z |Q/g/Dƙ TQB?vv?kj/gɃO`'y@|*i#\~->֙.čԬ>DryD4tC --":⪀TP'Q8H?u{p3a)s2ij@.V}o #`>Sw՘s募.*hGP5JXOM.f#ۺ#0HZec i)/T쇓.s ^#NlوsF\48A/+m4z.6q^/6D/x-/QP[ϐ{x2!:iu-8>XE)#E̬$i%A"鳥)6 D/ҿM5!Ū/~A= *';YS&ɍ` wbɶ$efmTQ7$1 __=/ -EX^_u0 -|p`0Vؙ_'N?}5`ï^1k/ob~M؆_u0`?lT}HދND~a5a)Hїv ^x]~S3$۪SϰIjӑ[/+MPkd~FLGEp^fxv8;[vkۨ9xQaǏ]yP ->s2 -v9o4ĆK44^5*|6?œ;{7q5.EŁ&\QP~֤O;~ F>~l1HN?)ym9,(96D>NK4EaJE%\JJFE<]&@pzɯlj?u.]6{P(*O85qzg1֮$U(ǹ9wGić))-\|:yGZw|-c 'U#Xhi )/&/u$|A=iٻDTa+YfJI^IOjDV`{yӠb('7{}uZ^Z^Oˋ|Su~==8]O*B S -Ja)@Uk:CM`@UaU[V?:Urr|A 52+fqq0/YrK\Α.J>ך} vl"/2#]iɦ$ O*Ƈ02P,&yujAR#e}^Y@hկOfbCQ+>lU ʬVw<rn/w*>#F5ȭ+q@(qL;M"3FJEx N%, -٪?Og/b돘2Ɩ@vle9T+Wɍgq/ J1/'x9MD1,|Fq y J|XGj)T CGE}u,,I -`,r½ ȹ"W!NwQ,2nɿj~\Hzc;''SoFiH>#+5)c=M=$KЏNV>3ا(f(P߷$Ij] -E1g|Q&b@^CHC/s<dpŠs^5Nӯ^~0eQf6Km"ƾ -ޓ!Qw6wujR˞bi/lSXz;.qE^%BsdVb_q^tLA1IG.hprMEm0 '&R^-&ɷxPc7`l1J}.EN &z m¯^ W -P5ЈN= RqMC&z61嬩F-#*A F04 ~)sR5 -b"_Gr1ZyA=iٻDTa+﵆YfJ } JRbEK[(t -e+"#7na$'hsYNGf u;'z'ױ{KXo)XK=ϖԭfIY{ua@r +^ˁkJ;mB?m)v _o_Г_X/o%ᅼ~^7kxB?| /VWK/D,.3i2U lS2I{ 3i~$J*x5f Ii7OaR7j26t>}i :xZ}or[bc&/NZc 4Op|-Կ Qwk5gNB){2 @]0I|2 -)93=6jQgˊg+$a^ˇWxJ <#7|bVLҮJYx?*}dCb|dlKR&9@XB ͨ$cM 6emdy^rS8X!ޫAH|/ (48Ph2l%>N -5Dȼ\6(3b[*G~CT1L{Z]'d39wK8~8WhsvZz7#ޖ4j)ڿI|> uL+˖$ZoDjL!x: Hְ4J+)R?]CUT+CmXoWEixKi𢑓y}A-mY +}(L ]"Ӷʁ j)z#eҖ)06ÓidgDqi#O׎t#׎`#׮wG'#''n!;|QcFwH9]uU8양N؟pޮ(F!YQ:>sd9h8jSS_ewyeʙN9-Lt~cㅿɐY alq'B?S_O*+N,qI3}LŻu;z~(Qjףx`&˃ʠJZ->9}Mf$@H'G /3Քxf22]@Xfkr셼v74 8F8t޷Yi1J1[,K!oɵP?H.|;~k":"yN,䫷AпFp6\\u/GQ'VO\sq]}%\!H35h^}[Z&x SWW?xOx9{«Ÿ?o:@| ~V?| /^}8E&6{Y=KX/>};odT<2w~Sc6ǬUOgc$I+S)-yiML} 񿂤l*"5|5L@7qb<8tM>LAxH4 -r,׬RN?A:^]^˞I:; _I=g#N}fz`ًUy(+㯽9_vU=mb^~_|u @X@8ճ.6IC''G]6BkήT2jYr@L{߾)Ţ:Y2{׉|9_g酻o%''w. y[6!ޞQJHo;pm-w'hߏ1lVm0W USM ޶0 LNڋu{_HΕSR%c%Ok&T 4YqV=+]1_|"U:J}VNɪ3PmEZǞd#u/ SFى,Lk _d$uW0ޭVCZ8mX7= bT􄌔\I1B[zE\/sVd줅; _.tH/itN[9pC>|FfҺޣO^1'?2f׀gs*q-wxJ|1:d Z{e5Pjy-0Ǘ֕ӤnPY/)GSw"{ȏAվ D:'s(W)C`%lxYiD $9.[AXYC2re)$VOKNEL~c9w`YUMąoRMmhi5GKuvyIqz*ks{u&.\R'&(ހ!PU]dA#ѫ"9JKAwFx7`& lErEԬ]\-0uWc Wbl 76p76p}eڌshW){apulBJ%x"M7Y.bV8Сzv9 -,E-b}c2eĠ\]*mJ<\Lޟ&yI ZZ)d!,ay+|=$:ɝw )q}=&/|+?!g ]d4TIfTR/[;mg[!ͫu/-1IU:+%޶.򙛂Ȳ]6!Z$"4&WNsUgSzxd<_X49a(gB֠ /?*# U6E`mLf8qFVip1B[A D_N+WޭVC5nY%Ffi&R$Ke'q@q)D!%)LqFj9Pu|k5 -c<ʰEH[ ?s-rmG?`Uͮ,ƈV6.;u)FEf$nY3C^zNIg$Qx?Mtl]QEo@4|_]n6%E,&!aii0E TAEF>d0r3+ +ޖ҉iqzZ9*+\ze/W`#8 BQb+Hz?%مZ>ytm$Z3c|3!\TwGqmbM2oۀhA6 - B@B@[khqU]swqx;(ϨwzWɬg5M9vɉ#waȖ$=r1g$ -v)o0(~u6Z嵴 |L5 -L&c@CXǞI?չD@LB @ -iҤ*JQQGE3{ô=e͚>wIE? -q|XRX^ÿX7 -[lo*WJGލ`v _V5=Tn'_e-kz|(Zu0{&DHPkhg,I=cL۶Qj9@ %}gt˕$t' -;wz`{OFuWSI|\!%_0}U3TJs<߂`.odCcg)dP2/}4 I}7[UOtFI4@p蛔RX+qѳ3bhߋ*q)M #''(_4l[*Mu(#V -Q XW5@g\3-#AE=̇Yw|-XqWBP*JLIp5.af dYao@9_PFnA6.Kͳʞ͉Ԧc;,]tݢ -J(ޥPV79YDf&7M}|D{̉Jx2_p ؕƭʆ9'YuT*w%1{rLo{NG:QuXm0,U.#<eb%~=: i.m0smAfjKFJ4? Ԩy85 NJHr /Ƚ _9uJ|JNioϕ7rMsQ5hAc -Q1Re; *ԁ0= tTf>]5s:C]I0/ڈkI!@cY4ɴ%ˣ,#I󑟔vk5k:w~_hF+d$AĒp0KFbg% yzw-`U4w -B_S@O0/ @rA'o#_b¯^s8Z%}9~$qm/@Л IH|:XE7"5c0t -Y!s^[ToӬ: z6r}!~vj1 ؑ>`  X&`_m"c:j- ZШ=IJ ݍ(j˧ۿN9KN<8 {WfdumA,{E졁Pi&6airCGEP.oL\Au%xФz쟕Ev?TE <(Ox(hGɰEWS[}TT:aA˓>)89C: syqeY *ʷJ;cͤV0ſ@hTz =]I|*O\N,&S ynB*'^!hyLw^ -]2iDGN ]-Wʜ)z]/#lעX> -y-V⳪y _+NMƧ"x|cD8͍l<22?HW/bjKfAa$ *B]<.{TbS<**M)Ysbu7$!'bl<JHdF_iJ59Q3 `A'g!<:a׻Y -e5@>SV + %q!Kسlm{AVr7({!Lo@=K@Xn -oŭh3~kݭلS {iW;ͧCuׯ̴9'6n۷4)N> `#8O9e s8oxc1~_i#-L7֭ -q09zpj0J{Q3^f5~85 +WSҫm.8 -?j~V{5[iKGwG~2/dc -Sv/KNٽ?,v,(v5=Tn'_q|@o_pFzs0* n&p`]^:]^d(p!7~)¯U^8`ʫoo7Pk3fz?r]؉|#f])<~1r$Tk}qf;jf5*.""y^|uY?X4t|F^n@gIO'CtU¯NlGR -sǝ*EvN^<hq -zįu߷ hj[/.s!*T]?;/XZokJG޵M7Nwo6,b!m 0A[ +*Mft;4Y~(9+˗(i0̈́i>*K8 ƚMqØ /s(K9RE@5%ܒp<5֌"^kCA |DBiD0%4)RV]TsK -+ )Ν9s}^Cѯp-'FgcSYe8sW\ŹLjXV_L3Z;2`/k~|hp5Њipsf[)BLʘSQUq"NQ`kYt*3Q55c|a <̒p ]%1hfIb9{Ye>CP];^NBUE)B& eJb}( ^xL;e1:%A4č@O6b3!߶u5ϯ{΂L#hZv36('4]W15+SZaF&c3P4C £k 4cuRyܲf Z˟c%uwLI?kOwBkPF0+Y0VH4$g:rd,4Οg?=o<,j0.d ӞjV&a X4EB쪛ɜJ(%y*y7Bv>WqCBbFV*βƔs,μ\[VV6I?5Ly1̅h (XᜡlbW-W?zK䘆(ZZN5h>F/evw>>F/ev}}܏feʰqUݦLSo%?Kgzr^fz g ~LcďeS1=L~ݍaY/p;7W>m My;yl`E/Touы'=:%̿K]Ǿ?#]Ǿ/+R%!qFt٧?'>aE<'2""z 3"9U[Z?:Z&vsRn|zUU,kL ! 6Vh,HW! A'<-?z٤^d6C$&ZK4`P)q$m|- nBesxEPz^.t+cwXZ Ond~_H#SzqV*²ZRY)iTiGxJqHLCF3HA8Fe|A -Ѯ~X{^B%ŭIku)W2v9KV;e8PQ>wiC 4ҿ)~Ew~o 1Wt% 3bq~/ {{*3vz6}Es =M5׋2Ac Qq3f HUMqR8K WB(|H.(R*c^4qv -|q\@b/ 7O|/o l\[ɡG+/u$)&crP\ -fb?QTyϱҒ&M%gWs 0~O37`J%Eu{ \w2:˖P"$)c ٬8*Ef䙒Ěyܰ,[a1.%Yq|G틡cuRy O-=K?4-0 m!$ D~0䕂}uh}V 0JhI 9f֋޷)D/*MT-Ws#|}AW$xEQ @icj 6c A`rlB`Mg endstream endobj 214 0 obj <>stream -HW^P}!jb.(KZjKZ ?v)ҴIqBx]>ICQ -"h}[\X[^> +=]2{g(zu"J<:$:gvƱ/QyZ\$ -=%~>K}QAQp!Yg8pė欫AIFi!Tp|䊤 |KOct?kS/0*t±ZՅ>NfvTD$%)ZM&K=fF"@0J^o2]4Zqq|ZWˡtvHH/$1h5E o|Uy5TbC@)gm -2.{lmur{o5+?L/0BO;:*E ~MЕ'_t @E,~%< {J`^N9TR=ąjO!d:mYN>fт]rʎ0Y%g TpIfpBjm81L{ɝLҷ$}{Q ߊ_owݠB~7[DB7az)?~؟^oE717sE?|2ޞ !qaa#8%F=xז_,a4=mՠ+a_ɛW+>6v8[yFgX#2oLXt9j5+GDV8hvԃ$*WY6 -uKNݠeW!kG'5|VMZ%Tyu8܀܏Ǭn |Ta)>g@]0~TR~rSBJ k-p7]l -wVy d=U -::A? Fe3^G]0nWtԋpe5A>iS]LsRn~=]ńh$IjF ׏NvD6,:Rk5J{KUc KԻhpЍ8L cc{e!Ll 4Z*Df'Ţ LE ,OĔ983^^۞Y,z`(1f #]-9ݼ <3*ѥB냠"`,1C Z%PSSQ\kBWмaN+nл%Ot}"Vv/P.O.>[\\H,('./PKƅtz!c V~i~z/į遢@ ~Maÿk[qw3+~د(_=P;az _=@@nK!~7ugݠ(mݕ^JwWza̿~دX~CpֺF D3IHuZSXk⍤ -@)`azZd؉\l*F1;AgLqĄ9”͊8fRhkrDJuεVPoŇBB85R~p .ݕ<˜ti6%07J=^/lc1{>ũ|6%~@=('m&(2N D1\*7w& *UgEO8,N1{ɤގE+#1pDvWBJ>4@ (;aQ<="qdӓY_P驩N!km"|B^[^il,ķRr)J)$ds!T -]jj)VLG(PC v?Fb'FWO_=( hPk6 RBY췪ذUT5>n4i)|){rr})rNte.*e"P,g?n҃IRP3XG#GuX"T‘ -ryR'<5b+o`T rBז<^vRgpH{w=<\"l#D|/W2(zCJeCJ9yC -U~__^{ݪc @K,3K =pQgtْ-h캀ӟ{YJ+{WDı= .6Ht?7LKQ|u%A@,f2gL#`ݦ{u[a -KndWH̑ڕMt_a;8đNao/&Mx^^=:vw!Ky7~)c`0t]/[^:xMi~؜aL>H~؜䇍i\ge\6wڵz S'1bsn7zꆱPμ-O•[풔+N-%(= -¼jqV^z5`00e=vQ;ũ[HqABN^ڦ$='%yH0tD߄T) T2oK} /b<8vv<`&<3c텯wv}2E"V<~q)NU!KHն`yb $u=͗21R*g4dz9fVW*x`7r|R5itJ:Eʎ\Wt3 6 o(&%8v-Ay6X(.\lYТ- բ - '$0+i81{-t{_R]D'8rmďۙKQН{P)u#T.Og(yTO-)&=8W&#A͠M㑟e"y5"^;K7S Rf|>qwu{Ax=ֲgx{lE,ȤߩM4b@5 -)Ǻ\~#A_#i2 AޓDQ(qp#RhЭiHFRy,4?+ MPr -{)J;)Dä@ؗa9R{}DiN,oHE+2BJ!HAmD|S-6C\Jd$l.+X>Wl ᚏ`ڒ{|qXO_=Sdr⇺"^+e)L[Ejku˾9 S{#ӔS$,Nӯy?MaoMF荠B#) LGaPq_|`1.K#Cڔے~W [5Iwn[V*Jr1sA徿ivk:sݸ)w>wQǰOWݕ1lC_6GN?;uzro|P~F7.05X6`mO~0jMxY 7up{Mxwx#>Iq̕{&?Pcy&5^ʃ:xiWV]y9=*xA{9H~؜kof/*/f/e!f{sp \ aYz),ǂڋ$;_`)+J!7W˥'uW>7H*"R(ࡿ~!U=͗/I1ʼ3O͌uZW#擪!M#Hw/Rnr"ԬM|FR `Ѷk wBq |V+hi1Zʊ5"OOO4}E֗D D`?(#p :V>QbZ$LO\3]AwϕO'"^;KֵsS·Pk$i?(H, -VnWtlV0ؖ︥O ؟ʼnvaS3ڐ"?Ꞽ߆@$RhЭ_f/U"br;5X<ڮYhYU?qJ18QKH -;W3kĢX"A#J]F?tE Ό~{~k4^ֳ-0N9 R.LͥǶBf/ 1r2XYWZH`k!W~ieAʇejM - Zl|6@Uld:nZf CfꩩrI!D!DR|;$ WM̙3ϠF `3ڧͯ)"͊հ_]$4컁3vz̀s=fBvLĘ 6 & !%V0^q_B/czcs]B2V<lޫWEGŵ4I_fG{@w9"CEdWt#=#>培+{m 6f\W~ڛ,2[qӤ47 ޅ@)z -{e˙ -X -%p^82c$46cNs=Fp@c1%Rsz^s]4+boc4;ii}؀#U\@=4]p7vD w׫J(ٗmiXq2mwyu%N7mƭ-Iwg(gZdpߺFݸdEpF]G8\07W:/L1%۫=y$vo؝^|B]6 8Z]~bbP}_Rk^تV۬Vj/zA1v믕̧1WAVT?Ki=(e<[rqY^8bt$T{HYM)S"+PrE _xnRuIq0T -r,追_Gw 89UK_RQ"#{p+'#և?qyBx*f+ޫWvqʳ.OPk:dt fIc3FfsPֳ ~D(1ܚFZ BCdzPT;Z};:JX? eVyZ¾$w΢V 1J|(([U?Szl'CVF@'jg'W]1n9#tqRW8i#`5GHWIב -2mwư_9)~xz c>Su7{@, -:9$NbـD`MNͣ -MRP+_AʑW\ 1˯AF, DzaP#,bІk0MWHƢ!`8Vl^OH1Ne .!/$@|?@t׷JңNI(VPv"@  -1Z'^4wp"X~ ౗@6t,3\^jb>+aXض|FUF>%nh߫Ph_]ٴ ͒zo"/P,6-[ꗱhR|sސ.Cit9^"dHFK,E.OBwGw1yyؑU (rxU{OgW%9(kc8c8hK2;u281>3UڷxઆJXV=]<ȎK%Rsza;OVh5+bocacivtDk> Tݔ Y-]_rwXCn[Vy\< `۝ X3.IuV0nS4mIR<[`dM\Ă8 }cKqcK)~}}S:(LM/ӫ y=hy)@-ɶ5y,6AJg%s_B//NK襘BI`9q vE k:nOQP-ջ7"DW*l¥n6H7b/N/oKP}$kq}&ekEMjĠ{rmuYctTycB/)D<D<ʢ/3wA w_B/&!~ [awz ??N/v6cCR!phyY j8Z0c3 - Uz)Uz*8co$k%cZLdwK}%RK^v7q_B/tcz1N~.Kջ~ H- ~l'r-?Zvwm9^@m8K$r(AGKS[;|FN"訓TuhנNH0>_@}wٴ~omyd%r:rWsQH҃@vYA7 H&{P9QzzuJL JJ^d 0Mv:įBC]koMT]mR`^CGTuts7?Ҥ,O !W>̿1Xb -w }Z-UY\x -Biە⼻6,,r2N%*o --]bh(y%IvA,)TtSJuZwfTɘs瞻|w -?)y?[:d -KhP|TUYԄ4ޔ2N)ث.fR~kSыRrez>F ثzȗgƪEj~KB/@Ig2x*$*xK'^2V <"LtLrRh}2X Y W\u[2[xlt MD NbȾP65d4cXpьa.g;p^)V%KÎnk;/ C P)mg҃<9-յpQISybʭriM'\Vh yA1bcñ5-Y^ +MuvU4ukHD}dS9OOm8<3{a5ϽMk3%U#ŧ슿$%*|BGn#YlR>G^Ct/E–IYt GUƉH $ˍN ôǢxV_d2L$/ICDo]k(Hlx62mrCRSpIH"1]]m5,WRPtד^E`O6[W|r5(B^>f:}Z//ZK\G f3POU,VS*̻X5'VJ^+%uzjQq] t0k{}˽|)Ejyxp75H`p}dQ}bM*#{PevUyM)Bh\ jQNFa10+r r 3`w7TzYb(=6[e$pl~kDؙ}qv.@;'E&=cNTC3< -YC􊫛'fPAWR-n96n5)\ɥ+fDȚ<[]ҘSz8/WG!8/Q,e6[W_{6S<NBڥ\sp­7Ϙrn2|2-@.TAzI:6Wޯ׌"KUHz62 dG<ʭЉ5!ɑupNM^bĬ -ttd^Jl(g4 aϥr9KlQ>,@z~D'mgh B57B6{CިRZnnJG5YgΜ9c -l B!Re=-go - 'J> %z!rIj ׬)!ّ -K@dB(YE.q/;ekPh%U7U<.tQz? pY !'[$3RqG-j;\B}jujxHd u/ pe遜_Һ&/v,#igq'f| tFWX@Q] ,TN 6J<:"!gB̲%q+t"ir8[I .+E\#Bl;鐸"85!9"sI -$#Kg^3 s yׯJy)iE07~G47}Pܘq;{WE (4}d{LKx#8v2M /6zV: K¸iB95篹A PDOK#=,S ȶs)ӽfwxz.c$Om]N_x;9wP$Amss4yc5ɂm|bW/I}7(6p'vzY0[xO>|5dk1l={O ,-r?À>Tkyf/_N__7s`{sP^c'/a/`~*Ɋpe9܍BMWbU p@Ϥܬ®?+tGQ--6j+wR|k96 I1.e3ER -Tl\[B̗1<*Kk_7BOH]0sдuŤ@HϺ@)a?,NY^wǍ3n˽{ 0g"Uuhqr)4|1J -=epnj -q`-z[l3UHJr*䂣s*dqIe{}>/[5Hyjt#&~Ƌ8}q7eDr;+Pw -of5Y> - Y7H'gJLĆԀ^|ŋM>#4}Ot4eZj,h'?~kRxqr"o,6 jK. Gy8*i1Vի)w:4o A+ -'Nڮ`Wbeb2X@`U8(rokq^dR\JRҫ`drr#@C8;^8d ?m&6{M[/Ğn3n3L>guPݳ-zyL_ s> u.v?MQ ,XW ,?/{uo/y y9mZ kD5{I.v*?m.7k W{{x{;m& HC?Lg,fcS#CAqUUQG{Q xR*iM"(,\ -'IT/kLsK s -;YPaթ1F:XcU94+,f8 |舺Fdw#*S1c?jwvH|aỶ*GtK)c# [q*+&QC{@Ta,'pL -{J.߫ -0.J9+oLs[?̫)yNA ďJx ^kHf]"b[QӴղ)%iQ-+q$qabv2ɨlm5}ɀNJqJjv._m0XzMQ~dLbzqT+YŞ9$ٷJaSVgF-FHEpڧA4#\ӳ瓼cӏdbЈSc]HFUW=8#6b;e S(n8|aw=č/{Vtx~M/7 //~*\Y ʝ:?SXjj A|uڳ>&,M -:AzDek^Z|gؕ:$xpm^`.1ٓ-LORA ֣ڋg/@$TrYmP;&r>'Rg^d by*x:SlQQ *KyGX[+x˟bmy eKs?2z2z)x  _F/ȳ ހހ^p|5D]:zIxJ߽g] JlPc6;Tz?]dBG˝CV{XWC}˾ܟcխ\~=S3.Tu40v=ME0!:`O)y!ua(ýfpެOIyWW,-)iX^rKxWXG:wYy)]V?raax›}?yxM.xJb~ <߯eY|o ro38o2z,P:z*Njހ^ 9bVMD~/ -W~//VK_^bo<@Wr7^yx›t%w~d5hrV{64ֶ -6ݶu%8vwW4ZsajюwNF!Ӿ^fP%j_OKp0U:v+jl#ńT do{oZBqiaLqɩ~^C|9폍 ^ -iDP*OmH -m+UaXĚTX\{DsȚH\܆%-fkɌ*"az`~s˛BwPjӀWKQ&zERϞ%I=:\'"[R nzj2}D4oi\U`SGլdkH+.lgJHq}%VHFeC^+ -YG0za, endstream endobj 215 0 obj <>stream -HWvJ?B# TP8'1CDD'ɷ¦a׮݁+NC|RWrJ$93|P\n,IeyiHN%h$yosuPM6,*=ԈIs@Dn?UG<$wF"^IĩUS%Z^_c"آokIx9 l"]b+%U{*Cl;2Ͽwn;Ҟ#jו!WvI8%k=G ]WJsd9a]|g>?dw$2s#]ۧ1t$7$1l`hN^qz(؀S*i4:.{_Yi^rRiP lbAiT+eT0ca`Шs|x |b/ -H~6~{ywRI:ˎaUo'1BT5QRJ -C*K,3\dfN.V|!=}}NKbQ筨Ca/z!}ؙ"&=+Aj;|=wMoyTߣ `{v=9[H2h0+kqˋ 'hH_zi'g|;@Q@##az=o%ӻb#8A5=?JMЕ b-PI-,ȧ¯^u:PߘuUfDfF -ٺ~o/M8*m.jz`h\eã3Xάb-=8Vg[}(}>߾:mŞ7H٨q#:1߀)D okV~XH=6[AjUj m+`O4fSfmv:e":2s&&cU;~]|9~:ʼn fQS,4ft7 cyigA+R_2 К̏9rOKl(9+𾯺 Y5='7c>[laHpɄQ{fXz"Q[:B[W@Go:\b<&w7#5aG#&5t ;J,f簢g@$n -W3UFc1:v jŁ#\"lg~F_ftΚ@V;*k* =ڗPKXd$yi2v La'p=ΰBx胯nw4ܢGkb5}l%YqH3:=M* -LSc2v2M* -5sT^-aFRcVR_kCC&~_tuN_'ï^#XS⾈LF}deQ6ᨴX遡q͖_x3DX2>ȰⵯsrŮTzDd$ݴ1i\gYdr5@Kht[u-InԊ{pkEq+It}jFĥ6mYm)f/;W. ŧ=58[{w]_0>,.F%E'#M.&4%1i,8?0 AUl9U}?˺hoJ‡l`RSf I1Z]r X!1J*)ɠ;T̙*ߪOߏ\x -Bi;U ,M.rF7+ڨb;TQ4%fU`V^^cSOp<Nᔳ0Kat)K\y@_BQꂠ -j*^ZA 6L9*}_jT?A"H&NZPsw@Zfi>PKX X 'Db?jLgd - 3 v\DM'm{  -%<|HN~D=-PĭpG8ؖ|cC19$z'se?}c -@,쳵H K$iJ0_6XEϯL3~St_~ S|KtYܙI}xʪq@|9%S` Ec?Rיlj(L<^Lx77Lσ=)l$5n|d/h1S /mx-mx&o8!jN1c*lPqL9GCݞ7{cʾ#GY7d5=[YEFsgW>ً^2%-sJ%V7Y/*q1.{!w29RU1b l'N&oXaMI8RUQSLe1, =u;'. /&cR:"mxS /:)"&_~;\wc&uMꋪ9u)~]!oկi9t%q:'B3(g{M Ai9s0|u5Ҧ.9ZTZ>A^޾P{b퓚LLT[s(q@Wk\̔z`@id1IoAP^KgH^`" ts;͸Eq㙈ouG48D, -H -68X0Ƕ p h\IulҢœ%&whp4RSj]T -#O`}05xQee5* -boʅ1nx'Oжt_9%nNыT>b y[^^+T'I34UB4+k΋05Q#XXܚaHڒg=PC3*Kߪ.~#2SkGԓ'3d -jP<%twSxM̯y#(<λ[JyjlcQ5hhk83MRe sOܳơD!Ts9c?9~5K#:bl|¿~/Ʌ̽t/-om|^A <Đ11]D7d'$HDߪYg>F뮪>uHI9IFw7Dyqi? dv| RhFAF̭C8YyjN-LSRM*%'3ӂ#f+j&\$=kNV5Ee/@9$f-ٌj  -t% {r:C!¥kŁ,Udz@ -.yLaa(F ъ@Jq4/D(8Z5%s*Kr",XRZha'܏% ?Th˩E0Ftxa7i,/ -ir)69G[x?n4OLJuX&R|%ꫦO3G[?3 盰p <(X]tFXBPQƕ.Gx_*"Uamm + 5NS t ˁt07bKI.)ӭyo@eﺓkp|r[DFk̙feR  -&GMRP^=-Za(^Jd %],w۾ 2tH n;vST aﷆ^*Go$ - >z)¯^zꇮ.i{xA;l.wFnҿ)B׽ܿmް_6o7ܽRԿYM:HxmAHxmAHxu o`N—5 -ey -ey -eyi.3خ"xgcwk8^9>^_ 6pЋ(ZSolY^oW^`=3[`]A|EAvkv{y兊p.A410ecLо=8 ecXez]\]h6*+76qv&nB.ۙ~w=}&6rq)| ^~4NI Ԝ `+cqtBCvmT~C~wp&mk*?Ɏ(S05 Œæcԅy^ykkr|}ijc Fs(rq1;=F;$$8x^M2ء9sOoќו,ˎ;5u(eUmb[O9S'(4q;k4*i5ss*2. +/&FrY…) e&sz@./=qshc߱J!QBuYӯ"Bj𚁦i]6\TչC,g(&D=%\(iɟ*'^/oO8?4S -! ilB8"C9?İ- 3t~B4̘PΆQ/)AR4BG{y ЄM[ -eA $"$آPp[nyh\>x`^{Yr^V|%xdQ="D^;{[@"O#!71\-w\&xe1J0sA>",}. -H_ TLʿN4B)zj.o5*w IS)rqW,edyaz~F>q?Eūc$#<F"n*eq:;Mƥ#y~ -R]_31 ׭eN;1P %UCFWZzdɇGIZ޾uzskR3e\u >fy fW:R^$1 !2sY$pԆ~9sW95Kr|Lkj|t.e Ed5 -MM5[ 7Uh UR#Nk:vCm_BAH޸Z*xKM.f>ͲNYijl@\޳f͚5Hla9zA16jwE(7Kx]v"~/z Kx*@A \ZȢ/5K_MbG -Q5ًM.״g[ /2h{F<ՠbψ4G{s7 7%_ďy_ܪ<^ȿ yЛ7R55W{#뤾dI})kuR_=_'ջE1L,MaQ,2L|z~o4 Q&ֆg>~GZkIiEt,֦ҙdR~vUM ?_Ζ= -˭I3W}ӰrA'b=*||{'ikK׶mEٺLA+4{7";m -C۩XkuW[¡ŠenA -"#1gI4sHޱxY.Ê Hc]V@9"u^c4׎5X^C+Yڭ,2Q5 >0.-_Nidm TF#":tЃO'szoʮ}] kAϵ?ˊV@XsUAa^/E1J\r* d -YF -vRQ_)w: m(R^,4aRռX_N$%>;NZ@1 \7|P=L\|0BT<&Xa%.`ŸXQOʀy_ʾ<3Ңr>2X6$L棤f[ fU8z.2Ypu^ -Š\aհ\bKl -!T8S6)p(zE.K1Z1;қ`CYqą -k:|wFG/tՠ#M:CGlS{hRaEp3GA% pJc:!4QJit^zWyiu[!ɷ̀gf$NǴu1DnH4 -ߢ8h Ds#DŽ,Rٵ uZN8RH\CBjg%hie6OlVܛ\Ib"G쉖Dq\:gMզgG/JRDհ"W ɦEo~ ˬ'YhP_ǃR̿dul.K;|Sil&OWt0fPr0=짻>D,b[|hSO!~]'.T1t=bqٚycƚ֮#n삣dc:edZ+c`t!a-MR5K1d/Q~kW1bXz($6 -qc롐eXPX~/_K1?Ȑ 'QmZpZ.E \eW0^Z ^zK{fio5_^ȋo5X׽=n|g}AΞq+sՠgq0/d߅^R+ͦ诓<]<_'yw6ËxNR/::fاb]/L|.~[,'"m C? Pj6v85:@* C<@Xa-2iΈ5:2F^ -cP&Û@OYg9ʦ$d!A, -z.Dl8X.%P}8\if$ -96G|IR'ih_>wZd!Thf$hmǘB/2t4m{j~E(-aV=H\&1a[܎%|%al A랃2{B D mofmoD+wز&o7m-x퉝,x퉝'_6OtLyofLn{Qa^ɾd/*_5 _w#jÑC,F2$͝t%k /eW' U%(O/#x.tEL^KxxM \˃6kyxK: X%xNB^{{f(5| /Ⓙ3pJv==g'!АQ[DBZբՍ;ݫLf9sv{f2yArZZy2Z5\ߞ.g.8a{p݃8:4x!}3S aO&ޝТjk0{FGp@Hy%xW$5mPG@6Oe $/rڮTAJZ<"aS6f,6|RK#CF<ΙS2:b/dk3$}["M޷^?(_r CJ_^ M 8@%(Yi6MCWu'1YiշP>;1H!Mn.PTo4mBv,CT%/&bKjUJjUWWh> {*ž&r|nBH@U$jPiNhTϋESrq@s؈&ӏğ.84s WuS V-]B -W|,%_ρdΒ9|dD,xKA4D0M.`r c6oZB1 -Wm5- '"9]4Ut0X18N [S+o٫NY@|ɶB;^˭Wyr{%O}=KߣۻJ|gڃ؛"r;+:&; }y\X"d{*FҼ ->*:+v% -8 J.)4'7x{c:l-cKI.ƽX*CѬkuu7$ 6åEO)abȼqK*ϲwTiB8k HU6*i &B01 Dz>p(SMъc2ULwՀ*mK?qW´Wd}WUNa&WVn&W$ʗxq}q 4H!:V^: ҥ:9i9 - g%M⪃^y -l @tˮ{46?-tJ|z(K{lf-t!G^(k}'®VAT%δiMkLsK^{Q-1Y١t^q:ZիIkWӱ#5CB)r2yfܑWXk^}#6+ @@Csj8*{=-b/0^1/G'cb/ʗSb/rwm*#WyCr*Zu^MN_^,\6 ?lEpxCEM1-ho@MY֒Brm@H'8%y8-E?Ŏ]׃iT$#x`RbXW hޤKj,RRz>$2Bs985$4NM{e S&6AW䍃~38.$'XOZŞIk}< &}?v)m -WQ(!!+iK5TpjRGG{H6L&$0!$y1m߮F̺:@hJЉԒµi du=>][EMmUflzRs-wz.-_b$:erg˺5[<ITXbF+7jrNJE8yB.Rw'(`CG_V%Z:]g~=݆$šX AuWYڽ!9B_ H.χPrv]*&c2U߳Vi [b7}Hs!zDKri*Ƌ {j޷D4jŒd(l/7ci~\cW2kWl5,k6)&%v̝~+C Xc<և-ا_kN/#LS mpx*o*U֝Ȍ"3Ȍɰ*^qUKɯx__`_Q_({ɭm4>JMjgߤKZ}`L endstream endobj 216 0 obj <>stream -HWZ\.% ! "FTHoN ǫOuf͚g6ӧ\_rjs&OmAXL;cy{̋(<̀d%TRToMe%Д\;U%嬙+R1H?qd#٣ sA4|0qBW+z >Xf3HNWg\'Lݿ2qV,:xlGJb!vB0?i}}XC]b %-gk=nfĽv ̭iaCDm덤MΘ UVxb:NLa@ Őf _}f%P*QOת -O[KY7"u zN/M2EHX^x9&%>Kx}ľ@D^  !zBN:uk.rԎ>OydNYJ WI%1 G ND3(s̬m? yK&0Ҟ -o@@ &gC-8>)nѩkr.; -j ec&ֵ`/8=TL ٻ'L(k&kvY1p MBn/~!^z[;I'É2DƢT?Kɴ) x{ph#(6>$h[=vľȖX70"1*uMS7%Sb 8MEq\6Be-4ڍ̲E̦C"ot4XBԢ gW*k!* *e] ث:FRy-7.";L#.iWFdzCy"꫐kA{gb'"z?>HS-P{ O,#If1H"k!d;QFyϛVI!eO99/Ux_x 4'uR/͖Hl|!2G(=:~_ۧ$B-JIl^8@-jɎx؏jsXXE3sԙ O^I)5bV?y)-8`jaV_A -ɜ> -PT1)55~KJ>jSg}nY%BGN%y~P۫T Sg#YbOph3c5K\2rf&f;o}u홄S=pSUb ^ZDtBkk=RHe&?d/{۟o˳gow[M+ZOvV=XI4=ua"}7FFQ2 -N%k_-|i行u|0P9(aK~ȠҠb9c|F^aS~޸O3isNb; gp&E77?v ˲ g;RfM7%tǼKN,Yj5;8p'lVF0[m dc&UMBaIe%I&Ӳ$6z y K$E0A};M -{D=;wKvd@$R礪ºa@a>X!n/5Ey?fʾ!ksC@<'CH=`є4HKrzw:'81{2Z4MI A]<܀W5É=Ù\fMU{(-z[f'-iE;gfmqՕufA"& բsR,>+L(y1$F]ݝHd&?ګ(~BYi#ϰIIyUTTJwjt̙3g4^(o aQPjE: :8 O33 - 퓇NQahC֍x %@Kg kSc\ 9MgLȞbtwN0o' -؍AP#~Q}6_‹L; -b~[GxX -1 ehϬքpJ/P-&U#j~21ux$-N?a 7@86 -iE++ #(0!KfZ錚Y4UG?W9w .ı17 $.¦}nYBX(,10"H >#萡eNf(a2nlUQfX񆘁1Rʌ*ȉHB*@bKPS]^3.N12Kfe]™s !!ϋ/ݳaX%1|"UKNqX$LvPknKY)rW)0U; 1khHqBGTk̐agZ9I1Sj(@Dz/Z ,W[ks+טmw_g]sakn,7!Ѱ_0N]pqøt#TĥV&C?9Cp/wbLg1 DQS/^B^E$@W>[wzR-[K@-ˤ#iT8u􏾜~8L/Y.o6{aױ͚sr -aΩrIrq,1Vrz.Da~ / g]xᖟQ_<gy0kğ{-Bf-kSq+'-E^֌gh?sN&Yxt>\{?Uwe+l76甼<^yejl^5腷LŝL~!RZfVeVC^ESJ.ۘV$B޾sK㲚i3jfѬBH vp"BTW3A/,nW~xCu@kXxa&BXG#qhJ.3q`gicӫ@pN&zm*WĚd 12 +Js/x(Sҟ@>޼2R#iG0`؅N]pøt#aqЯw ]i z cکPfM!;jaKB^Eq+9 rla9KI-nY&eRBJGc0WqBt kgO=P/=LB"/e~d`m͊4L;ka܄8=J~чٻoO$ D/%#C#;7aTyG{'C !&M/DP+Ɇ$I&S]]]}`̖$tѥ;QW&XŒA0ZY:[""}aRZjY{g"~nAC{ SkeGػFǶ<>iBLw"rW<9C#;MD"08xKx\-5;#_/³<_+r@x nrN"W ^j5B(ou[jgu1Y$kkN-bsuuu_77'7@av_k=@]lW؋׭=I}>rhSp@`M;ɯYwpyI;_/ FӱyLHbwn)L*ExEy^_FrT-(`)bLɗeVFS"yՙ)W8ehAYӼ،S^@܈JI6Ќ?c_)(G݃ųQrDb2K/ޠP88VVQ.=q`VU6 %> 3f1:`e!ՠus-$>?&*wk̡2yfp8 ál/FqF6:A%ZR!ǫ볔}mO ʣŵ=YW~j+%bn Tr䥦 R pxD]PkO9KJ |f^i+O!Lȵ12y>TC<1}A-\g5^ߤԇ̛yk"8PݭZvX -|zNBઃK)m?ћ2VAir?Xtft] @(v{PP dt{5&W^&aWPbhcٟO]$HpWpci2eA(5F' oU$j0F#(t)-TKeDӐ͟h&.(H#d!H, v JqF'mF_^Z+A -R78@# $ML:f]68id -bCPIQas²@ -|' r6D8)byGL6 Q/PleG~Q.oﬦFNF:N#y/NL]JYusxZ(|\gVpϺ٧\4`jE\K.^/_) IċZjlRE1خ5C/l9W^_0팿{b/ꕻ^p&]TNϻOϻq9j7zsxM^a%X!{ -gy0ʕYbk³dOa{^K1^[xm-Dj2Յ׊:t|F -Сh*To qߑu̪Ա-T[((֟<;(!]ZQNShŦmRQFjTW#ܺR -1P{D*z_-dAkݮ]N%ԕu>;w|1ْcB2Sg^KxH-\ -javq J݋YS-Tf+n*S\5O9Ǔ`>MG(jInIWj (SQjN"LU 4<-A_^8%lD@ -m9p!*iYQѮV%pln-0*sN3P9?"$S|NaJ=iJ6"<U,3\7׀c Q*C'kf2"f{45KmbamK,Ľٶ`Mprr֞ZVN;_X$ڡ#! l"|9.NU~`15!vhQ(BX-H'@w)':Sw@EWb܇?ţmD1'-ۚa7Izp5wdT)c)1t -!~m ə?S hBQV"ZPh9n+qz oťqP_Y>e!Ibark;&t&3uxdZbhf"iuK \>OGD -4$.<-J)=兌@Oݭw_yR խśp/ x&ki?[0uS<9qz; ' &;~O4o=mk{\ZKjkdG?ػ{]l/ ~ /EwxOx#~!9INy y|O'+7{Tru8䯋Fs`0 <2Y(g)g~[q+_%tbAnD1%(_(pEzQNRq]Ɠ<1h.!N2M DL]Sf >( oߔoK׃ؑV)_+xƟaJ]VYM3w>Xi]w̗i§T~&d6? .܅(${kWϜ=39?dO ^wT\uJܕb6+4JK\FXK$.l'{ o]*ڸ8*VŵaF- h(Dl}C/v~(Q2 7_Fː*3AV4; ţӄOC4Y}""vBz䕨Йu𹁅'wV.eiI4\d5OQdxATrNϿAyޠ8@J}`JD23Q8sZ*?ЯˈPlə`gܥ_؇W>,M@46Zz.+K06~g,`k j޷>HV +oz; -ٕnf1E-;_k2OxdaT¾vz.T*ki\6i+B'{YU]e:̟l(m#mD{0cx;"fOKjhx%&MT&gp]22z0xvKu$Lvqf~Ɏ -=VC+=zxv?- ރ黷MœBß?9==x]n =]YȖidBE/ ף3CnX>[ fiʃe:2wYd0^pN@k)9NtE#KHbHgsP -;a;ҹG5;(kMG"}bnmSd<9Ÿ*}Cᔘ(=/N@NN5K^k_H9\åV#1BM}Z4^^~ )']WhJ d+.?ğgJ@wH} d~y{nS!.s5Yq! (+wVk^qJ!$)8Kj_OrkyMQ:TQk*VH?y.S܉Bs]fiAztG<'pp'ϬYo2\HG,`7PRsft(Q2 J4aVBJ+i~,0πdž*fdD E]N?EmTrNοg7E$EW( voJDP6U>>tݞhJ@K@0/}(Wg֒W d=T6WQOL [;7| 3=կO%1hƭg|-vK\?Y~E0ԍq6:Cwa -#>]zcQHX+o8Sڼy y7tSOҍ; ܹ*zq Ma~!u7B\bI ϰK9X> -Hȉ=&Eɝ4[>%L-`Ʒ ԏw48~h'  T"A !>qnZƹ3 ڋ[PKVo -7[])t=LH]6`橩nB&W v,R) _+S IVk2NBvԕ𺨭^W\~Qp H8tvQyǟUD }LhLg`mtfȘ11nZO.ɥE}^ν#fPQ(_nowwB 0N Nޗ畠~[cTzLݴ:K&Q -otI̩B7 LN_ɐ?v{&{ᔃb//[wi4`0Eh`M7LuMg4s0Q-^8ewEm۠8^ pJboy~W{& f`{sQ+ElpF{{nE9f1Gw?z_vrZ0EUy(Z^ipZ::hϰsTک/BlO`zsQMuQM‹Ŷ࢜_;ypQN믝0y=mѳ0)DCrӪ>Th #+y_; 1I]&XEɶY%<x6R蓓PjLd_y0RB5˜QނYUrU* /T bةP"<NVGLcyªCQ `r+RH85amA1?59 $"p_:& ?Φ -,yЬ  -8 -(5G9VH!9 Vݧ泊Q1IX5+$I|& ֧d5s1⭠y=x;Ɩg2[bMGB'qM ?U3Rgl@M!MUJ]AEC_,gEp_XYb)pZk5Pu»9FgMzF%^j$d;aR$^˼" --šW5XDU"a)zT'`|7#W͜CYK *䄲OJQ7Tr8M% $e&Y -.g A+]äX_ [r`V.\OgjPil<9>Ƿ/O!Tg(_9<06naZxB.cǾJ;UsF>QZQz"FݞhShl>-.F+&}c]f@7@yݜ _fC>ω^,aŽ)lʲz~*%Kߩd_M/j - ȳk<|Y([]6>9dq\wWqs{l -ȣ2m`@7|y$-ZKi Z4""}b^8O|_a(vtPy9-<-S_kf1z!kfYJǧkfy|j;we?:Bߏi]/0J5N{YsP o*2>C -%LEm -&-[@ [+{V -'taop7jpLlo'a%;hox!/L W_b>\:]{Ern7hp - ݥ0acy|e2kv"t -UK>Hu) -$gB_ F -ʑoG]\!1L.YiJ>HS~eT U @T%bP 4R|@Xqxo𺨭^;k2yJplQq)/b/t]{?کrZԗqO͈,d ($;8 Ð &[BɃ\T|pi-IOqHIFRWPhV^B=[~*VZ:||Y_/|Y8{xֿCOBJVahT[x;"pB ެ{4/b6sP؊= 2Y,kZJ@AFZ ->ռ|ϵ7.E y|?B_$Q59 NI$>JE)<>9I\T1Y"~fp|L|rZxG-l$@!u1\me,T8q)#Dl>Dqg5KPX$& /󅬬z!8&˽S"\Lo BBZk~%'!;DfPAoUwBjwtW:TUʶ*$"N!k\)){>Wr{Ɔ7"@kO!_0sҤZ'/'D7Λ(;}{%Z -xbk44 63XLAd{,9%lNfdQqtj\V^{W/N'@ 99/[! sI+H+>Ҕ< HIjKa|{hN.dH /5!&>]Arr|ΓO -ߑ2 -0  AK9XGhă-~l+Bn$1MN8Od1M؜5{.ًwuN뛙?裂fܷ_ ejg_HrdMwyUq&P׍֔=b|=-UDuɗk r{p|g.Oo2 &{+hmb-b2.CW d%]b K3ZOO /:>^/{ FgdO48$B6IHxE޷W5f"^+-3%5f/e> fmS9k4TlYq$/[T ï_,2ᅼXg"6«s%&b#LM ck&;<#ݞ+ʵX#$rih(DewžY%Kw) Ic3 -E>wרUxy.˄ -hAzfl#]y$q NDl3-DX0/.jfs>Y/#M,Gdh!lN MF l"6Zd0K1ැW(^`8$B&a x~#jl_WHCt^`$$Bؕ'  -O>ZlN MFxƬ36y^W<4ە?%oO 5ePN-g#(mcwSZ\' R"NZlu7\()nA)P~)MӧJ,8Ol*< cAR޸\F3c-XN)ɻL'x2L6/U{Q&yJ̐e1P֡Rr( FU9-@Gb2.)|(^wΦr*.O9Ĕt{8_aHW9/K -,&չ[qe:V&<]0STE}эmV5F*02p> sɰrCK8ϵLj)!\0|b:|Gwx/wޢAG6!1dU-3nU\\qɷQ02 %K, -iWr_%ـ{-ү Vc*"s`Bp Df_2} Y7Rd:Ďg `4 .9jOb-5ڧc=Y&3 G&= _KgXiIk]ƞNڑ(] 6EM \<% bDkA,$]Bzf+p3C `2j|'Zo؛_ʇk<92 S2g>u#1^gNп;I>stream -HW^@}AVRP1Դ\3jd`fΜ{99mEWGe-_]R7 Fˊ[6zG,?rx&j:UX=*0DebvsХ@)x8]KJ(J1[9>rMbb߹gL^MZ\ȹ63I-ޏS¥^p,bd?BZ]TzC[+?>b0\x4IPtxg(}%q`K}Z$B^:A,(PF$ыqƒ+vnd8!vID$\N"$iaD}^S ChVfiX /?Mpdr1N"CTwQiwy^ -8%.g@q<~ 4 gN о Yiɧ@·?L=:&M=7+rn%QA-K6D*6ȼ7ηU-Dd.AJwcKZ# ћ'l8z *燫kAp!EOt{nh<\c>aJcN4bSٗx КZ)Fx5&ʀaIYKbLath!Dx ^Cao[&T}4t̥J*W f_вJTMyl_.10 /GFmDx ^+ e3 -:s\9)0T/Ai7zW1S%U梡k흳((9br3 ⅝J4X]MaM16'FMСop=E^5T 5Gx5d[՜ՊNd\#;‹oD>ZP%JA_&kGzNYv ۋp+R -  b7 -6PTiπɱe I“xLHKQ$)ɹq8\/^-;Kl¹lS`{4S2.<v` L l2y/^{CqËNO£&؅G3k/£sxL xk]BTxf릧:aKd҇nô['Ы?LAΣO H[6eԌgU$$z|te S¸[cN@C2,^ñ{B~1[0U]Ss -S1 _AY7оIG^ÙG%:tn V쬼Z/yMƜL,c-J# y Bg#i@ -3ԛχPǧOdTm@)UjA3% 8Xg`c+(/:C?#cm0aﻢ@y? %2+: C8"(j`^X|,۪J sUoR#6_`Ih-S8"Y-jbu:=PM'Ǐ|IWS!_jEQ\LNW)fZ!liQX7&^̰~TLҶfUbbR#I υ,}ge+ :]\š_$zP3 ՚ZaN 'sVM?qu-07}\]KSk>ZYW*0U27c^:a!h^sa/p`uk3u؋891anYٚvK *cLJEC׌;g]Y -Yd kbH<6HWʓl#~eRxaׁf F{6c=,_ +A xiH)J(IETO) ŰfgΜ9s&cȉsS`#3c,FmFS@8O$U>:W \t3MzxNХ,jqOw/~?U݆E !ӴⰄ%SbLWB*ڥ$ 'B징>~^CxK|^Y.~ _~{uV밗a/^Bt̜ -nC6><=3;iPijy"':i:7';ghj( b܅E^Ԩzq9KM޲C7^"_o`ӥ/h -iؽ׆ -1gj.Hv#ﱬI'R, YXC8,EXqwX[3?PzW$Y51}wr#b/!8 ExԮLLA4^Q`j=um7vaknUk@].1Hr-U잭@Ļ^rKϠ.%iTDXz%`F!y a08],gɳ>yݘUZ< F_-=M\롊{Zc! -ic [4R  z\ -"ybw*n$ob~B435nPk%܅4PhJ,zwl PϗqB;q;aDzbSؓ1GH'Z_!9a|ਾjMS}#3lIXN(+}H *PR eU nt:\V"K_F+_#G} |}OšG̉ԫcRY>37}QO5s-C2e(:6T3(ja;a1ȇ_MgC$E3%Nι+GPxy .L؅g"ƀSL>I=`Gf3H>Ou COnd8{*b?14wvbBѲ[u$!e A Od}P]%N -´i!e:3# fSfƻ3Vߍ>݄6/ dbh-?:V.MR%Z[!N8%w Og=}ږ5;ŪA}^ȂkV+%y]_=w{B*w%]c(rEYدgzqΖʟE. rɂ< g&WG:<*"Bbuckg fd}$*>IU#z.-tiuR:&o_|@@[ϒMfxfghzU`;#@wZZK%q4DCf0WQ*Zt=\]5:FK_D ͹T|Ձ^HԠ+AjAϠeĔTC%Ȓ/I.Gr^f*CưcJ -&5Kwv/Mb @zSn%S t+2v1|ur Ex@eF\KԊr^?˳\ pJSn[`_^pyH?ݰKϢnH+VgRN|eŏ1@T>z! l$KJzjdG}x(FB4WpD‘X\TC^I-1@qiQb&~r?`@dNeOxLD ЫW_?ܕT^n74f7Y < c(7'$@oC$'_b"KY ȟ2&Z8a"jZ[C\= TkhJ '>a~슯>`<4)(gM(ejm0N?aaϻP">ȱh/C#5co+ kO\b$c`&o4u6)m)W+^Sz`=lpL8N 읬G{6_?BXvIqA%x9ݳ'6X_D3=5UեdԹ30niŠZb5Eƙosz)P)|$}ߧ|-ܟG8&5w-y:8O$7B"JTd٥CCߙ}hEջD?ǯDw^-&{aw?9_0I/Kf3sݜJ6F^Ց7xGx1]ll I: -@ @ @w[L&#.D_;x1b֧v&?OL~X(ڙ>=3o#/EoZr&^(iJgNHN.db XnUCvML^Y)7DZLF˞2' -!އXIY@KHx ¿qy=^]O0)7wV>W3辬+bepˆp]!IqY)IC\0$^ gW~.יNaw@x - =47_v+nc~U-ͧGrAi`WI-=+Zh8/]p^9hW|{?Feix*(Jm&(=ؓ:,;Mk䘒ǫr2IN-R"yP%S!{/%P>%W_=g=L>+ɻƈzsUp ' }udbJK4 \oCN3glќ$[ҔBnR^#SRʏ@ k 9&LRܾ"8_d2ڐ{MU}A˅~c_' 21.*TMNN#kf.N.hS\u,\iF5r0G[6x#F,7g x"WJI+≾Jp/DulfwhfP22C;e YO -za Bށ;6g+Dy6K&OZ\40ug(91YD-E WV=EcYwV꾩aǚ_䐵=6)]xV.! -#T)3/jd"Rɍ$ް!R:nrd?- j{@ -IgwCF˛WgF6X4ggjZ\đ!Qnt5eQz4hF/ם/0^=U/Qx.3 9#_,^>ձ]>q -BtbZ?Q3s)sbZ?QTzs9=f^uxqvy boy~o=P3a}z&;֧@̑6=,v]_,780MZDܮx//w,ur ƬB8yypJ.BMmE* S!=jl,dyѯi24b1^ŋfh `7 J{ 4M`u.B(($*Yƽu ?m*Jb\w8n1 | B@@ -=(~*q &4)T+%~˵3f hOJ]iW\JV4/쁋sYעu/y')'ϒQDtaBxz8ŗTr-n2xƶeY{[քgw dfG;ܕٴ' ̸a7*wsR  %7 h7tȖҜ %Ģ 85F*L@oIvƌdG$.I})m&)/XHB³BYJI1R)Kɶ/ ٗ*R5 YgQ~g>UF>]J_LM@N? g{2.cialc=hRsl*y'ͮOˇ WJ)*H0|s2vBI' `9 -lx\U6 -KZ" E$,E>Dh `x+ &S|O?B%`_yǺ/6H4.Doʟ .=tbA>ȖjmΚa zNq.ؐI hDқZ h־f`I2^;<{o5c/ߤ#M½&{!NMvq*t)cV^C##pleh:=ĶxGxam^wtJY/@-@- `0yH#.007_^pׄW /qǹvxf!$QR@;H<3s~g}^'n -/wSx#+V^P#^F,. 1Vo/-ܨ?U_<EChEͮ,эZL"Uk1f{8n14Pa W^B ߒ7 LJЫ(#5T, -Zfǿ" -jgYE aEp'C#xqml1L؝4+ZX " -oj^>e(=2+80ٻ-G1cF&Z'eb}в ?a$w#<=BLįw&W aei&b&{)g^q>՘c,#Ps78+xxrU)N-z g9X;DjlIS js#k*p!4Eʘa0Z1ݕWiٷGM䂣 N;@UM/O -oo)6-x5+ѝֽkh-E[鎃LD\|tOR7ʻG(>6WeGvt+ q E64,E]diʷ|< T#7h)G6xw)\},H(w.ⲟG8,vs9f-$%.O}i P-'r㗡$+oI6Dj=Ug*WӜjB"Dc(1La~Wqɧ%4_imOp~AFKyyÅ"R~nOWZpD*VrP9puܑui#*cT$ﴬ -kOkʈ&+=u{+Dv4r7ыW ++t-|k(sqZ W@|k)?B^DMK4ax>%OvXM eۇ-=x!ci¾ShE4|9|wakj4~Ǚd]O&uFMe _? j,:GexubݩϠPw&b$v-RBQL˫ -r" 8zwyqc^#c uqw{)t^pABA\ -ӂk}Fus`"4wa@YF30N}ʆ ,kqdvsJjp(%g"^5jW2YN2<.=-NYiO?HYe~Ia-˷ڢ%O3Dx^kysd/˹k^g4gtgÍ̮Z'"}~izK&ϷK2&‡EpDMZHxQU'}/"M{*/q셪<Mb&(&{w&ժ<5ً\5k#vxNkb'.S}e6_cju'q⺚ Hj7|}i5d l#?U(7LzCixU͒1iyW٩U>ϼ"R~r-Scc#+|APc^CDm.ҀHAG85Q(f ߎ-L).[J',;-'3`_ ~.֍AG+ -'ejw=Fp;ഓP^D;!.OO'|| 8PG^<Ovq"%I< 8# 6񬄞oВSҏ .gnMs Ymqn#8,l.Ǭ[$婯<< e0r 2DUErt!b"p'*nm庸̷5 -pi8m05%8bRS$zsNi]-ɾE /pA!)85"NPS}$,v?HD,Gx_|tJWQ)h}xU*i5ך&F5E>6Ge2@Bfe_L:,}s큠.6O*dV|&he=-##?Jg6pXJNݛ, Ϯ}yA^>]~ (ۣjMẓ|K}Kn M"< 觴\iCZRkQ~Z͋ -ٵ4v ޤP{g| -AXzh$.l_ Qų\Rrj…8t%$?ő)iZ+2-:CLi0)?8%;eBG>2mđ6 (k -y9d =r~%'! $#A_E,"g&QQecz锶C9~  -]1^7%[mgϙ?sC!u8B.v 13ev%P?`x|-.v <-}/ .;_'xTŮw}_ ^?Zׂ/Oɐeb0 ^왋0h{g6L=$\\kWk~~5E,l%3Mɳj -6Wn+iFMTsD.D<5$1 >H"1i2-o;,W'O Pfۜt^ٷN.iJJ^J_mjƋDx|YI8%2u$'ΞB= -FLDI{4ℨZa77m;Ff9QfB~<6umk< (\/XYn@+&F }Na:XBB\|_/7賕5 R6 %:EgAe_VǥΈړz%H4y'V9&;4u<PFS f/ Z8^|I&Y[8Blu3)ڀ*Kȏ:M:!t -?J1a͔DMx8l}4?bTI fءL0L8qøplCPm]̴COxs?u8a!6!AT~Rޢ|H3x~śPGZ5[k7o!mӍIfɠٗVU ̾?rH"F@Oq6<pmʕ1 %;~.8饛wYe*OlH-?E4m_ZJk>-[Eނ3Uo}L -ʧx3fiLȧ/CzU89J}zg%c*y0{\0B/DG]x?`qX>BrQdcgs&7zK@JZhe! Smi OĖ w~=Dme&ӫTGWh K.B&KP3mHU1br [hKcfB_b//{^`k+  QhNOG!`OG!OG!\/NPᬉwLIKx.-z@Y\gy Swgyٷ"YXu_'x]I\I\Iۥ:^n ^ku.]_ ^__ ^{@wNbwNۭ:/,ş ,vNR7wu{UKuN)x"*AFN K )\kb'(|:eYHp: tG)7h:dx! bp7r)Jr -;!>xFV]\VrgR . ]M.LOǪ,tc9ߞE!fzh-5=eE/ƐLy'Kj_&|d"9 ;84PX`_l=(jPHB,@sOB1u|7G+l?EpA[:?\0y8ߍްR_:XTKF3ld%]^^ءR =h7r>.Œj v.$/ Z>g8ͤ 4^(,5p*5O5?)&#NbQDC:_n"fބ5׀DIn#LŬ@7bܤ{V,?(i1M13낓@Z%>s<̕f?k/qN {\0B/3ІMK)҆[qįDF9\3&Z.T[f,CSorA"j{V$.DQBXdSQQQAݓ 0险6lI9}s^sKkbE. &aH/۸2I|4=]Q0fcM$%`^iy1s/ZØ59E, ډ# /8uK1a/_Z_Im7t]~:LvGv$y%[ &o /lP4D@Z_Z<׷F - ^D_%0^`8X?Klz}/}loszKvUjx.Aׁb/ar@uE[|loꯗR륾 tjxɾZ&(o[l$a/%(:]^ {m_y߬s0Ld4H)B KҰ$opW7{車st{]2S5ݒPHY{Nj. ZV?ELL"]TG&_Qjjt:ŧ<&&hVZsi;_zHT*6;c_b츍 V^ؓ Q> kS1.(}{Lz>`CÍ H̬/4H(4й >Y)jGZ5;]U45R@X-"8[ٮ#09 B.*I@|pϣbD !^vc4V"nvx8]8U2 $[F)M=[DW}# ~/v1r9I%^ueKHK2+<6G4_"iq *Kz2r*F2Ɩ𠛕7mGUq7#nIfƌNnE'elgDx`Mj#\)vng^QCVdB{>HbAPfbV>OWcauK^%M5q%NYB^$/u^b?}ټ%B8CE<qD%L`rl?!Ѱ7I^NiұN,b脒h wγ;hi"lW,Q@ ӽ|T}DTpJ1c~qhŪQ>—%paC~:2 U?i誗m9O8M{YncUiY,dLRxIxnDt/܀{MRmf[X=2b^^ { ^1ߧ؎K_'u8`cM"̎!:z +SO dlέH"@Aj<Di7x?wjҵݕ]Lbr-ap5M&gRy>ti $Nr'1 pM 0M^# endstream endobj 218 0 obj <>stream -HWZ@}"@11l( -KT)g7(/ݙ3gΞ9S]80vx$1[ 4xKB'#;5ȎyXhf660p"DG6\TԂ0# EȌ@YAnEc,}\^&'0_)D -#Lm/P˲H*nJPR7hsZ%eJȟ15E"LP&$wn!2O6rx=>$p__1BfFp.6;zuy*著6*IO&"WPLJCʄ\H@l"}NʼnJ3,1wJժ.QUg9O%6G^#oyA!q<b @z[b_=4 ^Q2^63T_n;ЅnE6zǽ˸J_~FVB$8^g -ۍ -uaVT)\xKeq[(đ sJVnGUa.=?Q|5yXgԄCYn4MB&aǦc=CJ3zdn K]ϠT̒6u[[#BShۣAʕ*)]l2Ҧ_z=+B9ʛ@"oˋw姡P ^NvlX]mQ[tbuypCq$`߰<iv - cIz2@:#Ig :ؓq;0;!ܙ/<5J9%oAi'īl/{~uQn6R@Rb/Ah^7$i rڡ8m#rlz1}G"9Ҫm֦8PRa4Ym(cN(<5EEt定 Mͦ%>_תq Z͋ -7ļ!K 7$+RIQ> 'dICa[%qVWlE -&=$|AM1tR$^utw8h)]B)27=Ms)N {Rҭ&%tF|#k6j,yТBHkR"CO\!(v3) 33̯W?;Lj5'rQkk벢%*|xPk8l2+b:j1<-ZR^N)sWZ\.5HE!tlABoOI $~@H> Ġ.^vɩ"Dė|"UFPן<"4n **j "rg -\DEP$T)LP搁SUB<VBx̧U2w'* v%@sAZ ^lDl D_Թ: -Dzŭ6P0Ѫ¦~{,=tXoV CݾlGB@S 3T HŎN0ܼᇚ L1>`'u>}¿/ȹzerpXFșL.Ev1>KԲW^bح=!^bTueN -*dXW$L^w@4ef/0f#?8X1OcAs?nG޾F.U~%wɍ>`/+7#p]a怖'^> E~lu6R9Zq<8hy0qC{4[/:xS ]iia{[a{};?vxQ.{| f/‹lx͐˟ׄşׄϗ`u N}N}QT^[u0Z|/G]/ұ%Y_x؊m T֔[(_|R[0cxK >Ԫma&<߶ؼ/bZAHɮr1+ \Ws9GNj@݌S#3s4%TzZaȾj~ Gm"iPwŏ^C){X( ACt E?(\W-GRVzK[+]t"gPc TT>j-+?uBfnOQm=.9\߹&'"#Cˍ7#rbTZ7-яZíb9ZC"Wl$nWqAP,g -yyOF5 wVY|LOe׃e-e>-u\G mؘ1eTIs)RcA5eq0[B@@@8cCI,~D -_jlzdl 46e( ۘG,"8ᕝp{ibG3y%0ܼ,0=d[Kxk|j h`LcUonR+c<̜OlFw'5ⱶ& Z[re('hm\`N -y>e6io YFu@i :3Qp,:[@"gUR'.oϋS#ө49Πz^Ifj"ТA*Hx]XՆRNnoٗ08 ;3ȴ>S3+rFP&@Z1!z'%N&1`(>oׇ:h@7Y5ұ VF`6Z5ȺYtd|V$y]:EP?ΐK,,g5knwDւ";4L&2+-\Oj{[ϤOfdp)FN1r9%"ѣlk6. 6 -z<}u<z [W^ &)kki4x=;X - M-crh]%5|FM}YKqq!IrMAw"']>^`@xAa"%)*G0rU Ë拽^f]/R~{w1;v?lwia=aekT7": @\&p˟ׄWߒlw1ÏeY#ol#*?x:qFus#FǭV $l-yjeY/ޒ*PD_cՕ bjD$[áj1wI -]2RԞC\oogcUݿQ;AnӥWAKNtf=hup'RVz-!Hq"2@vƉ^kRrhε(x\DRJh(JGR&Y| -JH˞3gf' -LG.hV0yc f{&! )xn}*6 {/B %vكn*gRp͜xʧN9(qm> fݯܛ2)O˂ 72`dŝO_$ >i[M0.Ih(%|)^7_I*d*:t#GoZ C5lhm]M=b7@kcXJ}}k5S R]bL.csJ/҃-ŢߏD_KIy%-Ūo Bc<_A3"aF2˟Wu3,y 1/c]F&^(n#LDQHQ e7pڌgzM7u>9F[4>1N^XaYJ>>7 kW p`$w<=op - Hd#}oLm޽WRc/oͽrpƙ7p^ >zڕ%8b8 (XPAF1.Wnԡ^{K`/e?o;]ZȰW6/d(JfBd6/dd YxLl`x'7^kx]g_?tg<$ -DZk/ vdN9J~>=8Ӄ=N~>=8ӃqUmg)Kx/řMxؾ:XKu‹.R:XID%vz8n5`!x}k)>­g'x~/L%A9Z0;.sSinGITW1yKs\9q)@t%=kU;^t>;r\D)b _ƹ{ NO@( W{试<8XKًr]5L& p&^xy1%ݶfIN^=qxhb0mn]M998\/`Rd~v LJ'x˞ICm(9'C9bnu5n '|J8I ^@˼5/:~bnUEL~}vN -y'sJ:h7(CQN>V|o>+ǁYU|J"30KS˓$rk/6H@{!]d~mB⻪=/8IHtT}O||~f 7 c>IL ʝhUe@*6 #^\ *9UU[KqJ5s)xFiQ-O+0r0h'(*4RzOAה8^YFxFRFm*֩R O޼^7/Nŧ(t.W5 -{SZ(`&} KX9Hcdul>[՚{ -<.:J\MYPKs9CIɏ vlh8ZX`KY Rh!Сm!Bt3JIo~¤Xbs+x{%_=Yq:RE5TB0I%GQ&6bE -1xv\K񑉶:ˇ6fMKy|DR_ٟ d3Lv=ÁC#z Om1bGϹBt`GO̿S8X;v#w zaU>/G]"$n*um#b]H[kE1|ɵN(}͵NؑڃRK/hmu񗲗1{K }1 ~@d-,aAQgfe;|4diTC-k\ -Q]\[DbV[~9ZgZ x2y1 -0YKEM&usȑoƭoDwKٖM~"qy(blחߺfJrүbb렾9x^"~bKxA^Wa)*ɃkA}{<7?V}ٷ;]K^ -^}8Z4k/'?hm)xxEO _1XOb2څ|p_[p|lM#/v`\/ZV2_L~$ܜoG5"ם3a/ oiVW+f3xwvDq< EkqmS`Ĵ7E->kO.#\q[1|~>#)8I8-,e"Eݴ8"pq@9xykԋ(_ExX^,J u-v,ϲ1ٸfׁc;m,{eijf`bʻ㱁)8 KjGֵEŮ;lzώԞq//K|ZRLG1 2j -iT _*"a[(` &+0tA1 Y&i_-Id/Rl^M'jWxz|3 -/TwWx1'wQ}{]HB"FP $)I{ -sk9-jS -9vDV︒|A "y vQ,*K|ZRLl T64Tgv&W)ѪnrB_hx6h[Ļy?arl(| /T@*r&QTš2c^xo+%LX!`ڶ:T*ƨJTD(,릉á@W -2*h0ؕO]$ F}I2 N*h5-_Wjbd\XoQS~n-Cfjb_RZ,/Ix/a5{y*=$,{%2Uf\zFtV>_JEZBifX~F_V`ܗ@9 X!I _2b UV b¤JZ0|➳&ډe)-4~/Cbh*k[VbH9x֞, F<-- -+OAiv~mN)9lFoWy!\weHl!YV1h)/>!f /"\M~- -lc#qxd\ Dc aY_GPPlZ(=F -MG@SOց9\ Š O[<&C@rN]ZTզJcOH ->r~r[>ch,7er4r[}wDDZlGj aG%G0v>wwǎffm5"pMțw#n>d#'.V85Npo7 \|E3ΞG6R4moPDЏJ)Lq>W2=lNIZ!Oż 2[҆)]uƫᱯ&z԰VKV?/ɼ2/q5Yl.jtY -Wq?ާް .7Ϣ"B/*'`Y'ikbyy^|?]&FwXq6${pko:GFHX?/X/A-D"`>8 j5z9_\DO'`3MҊ3fBx;:NH &YI$FX3Vt,5O_33mDLbfg~KlؒǐtiHDzXr):P9T!k{J ZgFζfc~&g!R}O'^s~3Oq _ӚWUD  ,Y:KBWx[ٽ.No~f$]]uN㿨?CEkl3pcJF1 "_3DvtҖ|"r5HnۛV^5+lTפz,7i0,]O>I:*HBèh8~QEy -v53%/iT[축9&%.ɒ3(\@5?=ɑM8uiNTh͵ +vrػ5Cb{ڭCMY 2Vo5p8Ur6M!ڻ~iR'W5Z/3~eOރ(q$^dlxIF#ΟagHCB! O%"dm(5fO~-IH+p88I&T9Hfpd}Jk_p!2oEX]:*4eRia~4r\M$cW|pw3 ?\~|>H8z?e: w#gc6o"Nou(ax]E _XE=֏'ǮavuX 2|=֮ro{.a]ͿuyJIIN(`Y5g3 _;aXVl>?+ŅZT:gA#{Y:coiWßaW? -2V逷sMsA0TP[;֦h6!mH)OKbk'7Xɞ- ށhcX+Y:y+ՓLs']21N8QJ_Xe2̬_C >+WԼδ1p^;už˅Q9 -thLC>1*DD2{jq;^4cAg`h6 1h̿  =b -)fuit3j~S3{_P.dư<&3>!30c2cXJg 3n23'dFo̥9 3C2{_*- 52dư&xIf >=!31螒%w_]^vQ7\ppvnjlMjz|}k% ܘ1:^o3 _;z^jKM>TW7LIINJ\0&c O3iף&ݶ QD`èh8~QEvy*ݸNQˡg/)1|9;;?½̯_%Pm>A&T -*-fEj.Twx=4iTY[축&%.ɒ3(P'47W=o3}<$rG -$%ܴV*]B[e}͢^Vy]q,b{3e2n1 Jk{q%hבbZA]^1g||ګf׾:t%BRU.rZ]b\:D1KB^n~erFfyiq.C"mFF%2?I.c&VH\ݣrҁJ{g] x>xgX$bN"(O4R[=>M Wt>֊\\= 5gʥ&gS|~T "Yh Qv~x@{Gk_@+_w3]J#/'rXi|`o ԩ"9*^W݅2ԥ \uQF-QnSf4,_Rlw0H1cX Gtxi= Q°$AW[D~ IWօW.ƕHظx<58q띪T9*Ni+˛%1U J!UDǐ!33D!d  QAݙp兵yIwUװkN~2`3By'JqOm]%L 9ərs㘸@@1":jn(~l\~6Ee/5.&f-d1O÷FR(3?z֬.0]l`Fz_`Zʷ`a"̀)`w`v`y!cLM8ʝsPeC!^w!e@a[EO6! v؊!|3%!7$Ih@kF_bBu^_r _{uCZA(Qк "IYk "RMSm)mΎ`e:;$.ÚSKt'־2* pnjyĸUhZɴBS0a,Ie!~ f~Of+\R jTx|Hexy5 5_|AQcHi0)V7)W{9]0_9C*T*KȆҮY@"f_swk\"+ӌܧnryBd!+LsEɺ J԰waHv -Qh;(i9֢tɦ> Lpr"~ aLlMe]n(N(b_aj^Ѱ:8 ã<%!c;Ɇ9F/|6S} S[3z Kj4M~E9rS̞H܁0O wߤonf;jlَ]AlChx -I54.{ƪl2Ku:\ 8+J*g I讹I -+>)?xT>;bHyLCv2(rHkV)vGkcrߐ;/i܌Ǵ|<q̾Cgn5DsSwꖩ@Zo(Z<ٓaBnt.\߼/2/ѕouvTYwnGuћuvT'/$`&fcqROcD|[I^8+1 :;(R3D گTt0$gfMT F̵c bKů쥴Z/oG3ʸe!2N(yyQW [<ɐqSAK)g~/5YyܗZ&.Ի: -]Ci%zAH i.AgǸ5 FyMdcgMGom7 pfk&vǘQxyw-b̡~9c ~d]ZƃBPIq -y{tA%1C9;(ayH5 -;Q>8,ݡchDxduXUQ*A'x S E*3냕|u%׌|x+AI@}ؒŇL݆&#/(POrrlRv:j4tq:xG99bz8+ǩz 9/k )C]|@J?1@w*/zMyT< endstream endobj 5 0 obj <> endobj 31 0 obj <> endobj 62 0 obj <> endobj 110 0 obj <> endobj 118 0 obj [/View/Design] endobj 119 0 obj <>>> endobj 70 0 obj [/View/Design] endobj 71 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 167 0 obj [166 0 R] endobj 219 0 obj <> endobj xref 0 220 0000000004 65535 f -0000000016 00000 n -0000000206 00000 n -0000021781 00000 n -0000000006 00000 f -0000761517 00000 n -0000000008 00000 f -0000021832 00000 n -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000016 00000 f -0000762153 00000 n -0000762184 00000 n -0000000017 00000 f -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000029 00000 f -0000000030 00000 f -0000000032 00000 f -0000761587 00000 n -0000000033 00000 f -0000000034 00000 f -0000000035 00000 f -0000000036 00000 f -0000000037 00000 f -0000000038 00000 f -0000000041 00000 f -0000762037 00000 n -0000762068 00000 n -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000045 00000 f -0000000046 00000 f -0000000047 00000 f -0000000048 00000 f -0000000049 00000 f -0000000050 00000 f -0000000051 00000 f -0000000052 00000 f -0000000053 00000 f -0000000054 00000 f -0000000055 00000 f -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000063 00000 f -0000761658 00000 n -0000000064 00000 f -0000000065 00000 f -0000000066 00000 f -0000000067 00000 f -0000000068 00000 f -0000000069 00000 f -0000000072 00000 f -0000761921 00000 n -0000761952 00000 n -0000000073 00000 f -0000000074 00000 f -0000000075 00000 f -0000000076 00000 f -0000000077 00000 f -0000000078 00000 f -0000000079 00000 f -0000000080 00000 f -0000000081 00000 f -0000000082 00000 f -0000000083 00000 f -0000000084 00000 f -0000000085 00000 f -0000000086 00000 f -0000000087 00000 f -0000000088 00000 f -0000000089 00000 f -0000000090 00000 f -0000000091 00000 f -0000000092 00000 f -0000000093 00000 f -0000000094 00000 f -0000000095 00000 f -0000000096 00000 f -0000000097 00000 f -0000000098 00000 f -0000000099 00000 f -0000000100 00000 f -0000000101 00000 f -0000000102 00000 f -0000000103 00000 f -0000000104 00000 f -0000000105 00000 f -0000000106 00000 f -0000000107 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000761729 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000761803 00000 n -0000761835 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000167705 00000 n -0000168105 00000 n -0000167513 00000 n -0000762269 00000 n -0000022228 00000 n -0000174160 00000 n -0000174046 00000 n -0000166614 00000 n -0000166949 00000 n -0000166999 00000 n -0000167587 00000 n -0000167619 00000 n -0000170992 00000 n -0000168511 00000 n -0000168602 00000 n -0000168956 00000 n -0000171328 00000 n -0000174236 00000 n -0000175310 00000 n -0000176349 00000 n -0000184727 00000 n -0000200129 00000 n -0000214854 00000 n -0000231478 00000 n -0000246228 00000 n -0000261647 00000 n -0000276943 00000 n -0000291713 00000 n -0000308111 00000 n -0000324371 00000 n -0000339335 00000 n -0000356000 00000 n -0000372403 00000 n -0000386128 00000 n -0000401019 00000 n -0000416089 00000 n -0000431281 00000 n -0000446007 00000 n -0000460001 00000 n -0000477757 00000 n -0000498626 00000 n -0000518535 00000 n -0000530974 00000 n -0000554024 00000 n -0000575326 00000 n -0000596601 00000 n -0000616723 00000 n -0000635505 00000 n -0000656308 00000 n -0000669960 00000 n -0000685324 00000 n -0000700624 00000 n -0000714946 00000 n -0000730599 00000 n -0000745721 00000 n -0000762296 00000 n -trailer <<0D2B3B2DEB12474B8F4EDCEA80967463>]>> startxref 762562 %%EOF \ No newline at end of file diff --git a/sources/libs/font-awesome/FontAwesome.ttf b/sources/libs/font-awesome/FontAwesome.ttf deleted file mode 100644 index 793a922..0000000 Binary files a/sources/libs/font-awesome/FontAwesome.ttf and /dev/null differ diff --git a/sources/libs/font-awesome/README.md b/sources/libs/font-awesome/README.md deleted file mode 100644 index 900fd73..0000000 --- a/sources/libs/font-awesome/README.md +++ /dev/null @@ -1,18 +0,0 @@ -#Font Awesome 2.0 -##the iconic font designed for use with Twitter Bootstrap - -The full suite of pictographic icons, examples, and documentation can be found at: -http://fortawesome.github.com/Font-Awesome/ - -##Contact -- Email: dave@davegandy.com -- Twitter: http://twitter.com/fortaweso_me -- Work: Lead Product Designer @ http://kyru.us - -##License -Version 2.0 of the Font Awesome font, CSS, and LESS files are licensed under CC BY 3.0: -http://creativecommons.org/licenses/by/3.0/ -A mention of 'Font Awesome - http://fortawesome.github.com/Font-Awesome' -in human-readable source code is considered acceptable attribution (most common on the -web). If human readable source code is not available to the end user, a mention in an 'About' -or 'Credits' screen is considered acceptable (most common in desktop or mobile software). diff --git a/sources/libs/font-awesome/css/font-awesome-ie7.css b/sources/libs/font-awesome/css/font-awesome-ie7.css deleted file mode 100644 index c1dc3ac..0000000 --- a/sources/libs/font-awesome/css/font-awesome-ie7.css +++ /dev/null @@ -1,645 +0,0 @@ -[class^="icon-"], -[class*=" icon-"] { - font-family: FontAwesome; - font-style: normal; - font-weight: normal; -} -.btn.dropdown-toggle [class^="icon-"], -.btn.dropdown-toggle [class*=" icon-"] { - /* keeps button heights with and without icons the same */ - - line-height: 1.4em; -} -.icon-large { - font-size: 1.3333em; -} -.icon-glass { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-music { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-search { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-envelope { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-heart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-star { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-star-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-user { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-film { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-th-large { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-th { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-th-list { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-ok { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-remove { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-zoom-in { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-zoom-out { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-signal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-cog { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-trash { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-home { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-file { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-time { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-road { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-download-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-download { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-upload { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-inbox { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-play-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-repeat { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-refresh { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-list-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-lock { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-flag { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-headphones { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-volume-off { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-volume-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-volume-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-qrcode { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-barcode { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-tag { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-tags { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-book { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bookmark { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-print { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-camera { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-font { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bold { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-italic { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-text-height { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-text-width { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-align-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-align-center { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-align-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-align-justify { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-list { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-indent-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-indent-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-facetime-video { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-picture { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-pencil { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-map-marker { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-adjust { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-tint { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-edit { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-share { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-check { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-move { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-step-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-fast-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-backward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-play { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-pause { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-stop { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-fast-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-step-forward { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-eject { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-chevron-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-chevron-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-plus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-minus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-remove-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-ok-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-question-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-info-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-screenshot { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-remove-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-ok-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-ban-circle { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-arrow-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-arrow-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-arrow-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-arrow-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-share-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-resize-full { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-resize-small { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-plus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-minus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-asterisk { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-exclamation-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-gift { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-leaf { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-fire { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-eye-open { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-eye-close { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-warning-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-plane { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-calendar { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-random { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-comment { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-magnet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-chevron-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-chevron-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-retweet { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-shopping-cart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-folder-close { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-folder-open { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-resize-vertical { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-resize-horizontal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bar-chart { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-twitter-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-facebook-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-camera-retro { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-key { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-cogs { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-comments { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-thumbs-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-thumbs-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-star-half { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-heart-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-signout { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-linkedin-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-pushpin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-external-link { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-signin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-trophy { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-github-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-upload-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-lemon { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-phone { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-check-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bookmark-empty { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-phone-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-twitter { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-facebook { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-github { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-unlock { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-credit-card { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-rss { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-hdd { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bullhorn { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bell { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-certificate { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-hand-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-hand-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-hand-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-hand-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-circle-arrow-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-circle-arrow-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-circle-arrow-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-circle-arrow-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-globe { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-wrench { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-tasks { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-filter { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-briefcase { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-fullscreen { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-group { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-link { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-cloud { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-beaker { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-cut { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-copy { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-paper-clip { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-save { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-sign-blank { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-reorder { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-list-ul { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-list-ol { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-strikethrough { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-underline { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-table { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-magic { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-truck { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-pinterest { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-pinterest-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-google-plus-sign { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-google-plus { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-money { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-caret-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-caret-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-caret-left { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-caret-right { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-columns { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-sort { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-sort-down { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-sort-up { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-envelope-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-linkedin { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-undo { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-legal { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-dashboard { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-comment-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-comments-alt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-bolt { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-sitemap { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-umbrella { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-paste { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} -.icon-user-md { - *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); -} diff --git a/sources/libs/font-awesome/css/font-awesome.css b/sources/libs/font-awesome/css/font-awesome.css deleted file mode 100644 index 4697599..0000000 --- a/sources/libs/font-awesome/css/font-awesome.css +++ /dev/null @@ -1,303 +0,0 @@ -/* Font Awesome - the iconic font designed for use with Twitter Bootstrap - ------------------------------------------------------- - The full suite of pictographic icons, examples, and documentation - can be found at: http://fortawesome.github.com/Font-Awesome/ - - License - ------------------------------------------------------- - The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0: - http://creativecommons.org/licenses/by/3.0/ A mention of - 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable - source code is considered acceptable attribution (most common on the web). - If human readable source code is not available to the end user, a mention in - an 'About' or 'Credits' screen is considered acceptable (most common in desktop - or mobile software). - - Contact - ------------------------------------------------------- - Email: dave@davegandy.com - Twitter: http://twitter.com/fortaweso_me - Work: http://lemonwi.se co-founder - - */ -@font-face { - font-family: "FontAwesome"; - src: url('../font/fontawesome-webfont.eot'); - src: url('../font/fontawesome-webfont.eot?#iefix') format('eot'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; -} - -/* Font Awesome styles - ------------------------------------------------------- */ -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; -} -a [class^="icon-"], a [class*=" icon-"] { - display: inline-block; - text-decoration: inherit; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: top; - font-size: 1.3333333333333333em; -} -.btn [class^="icon-"], .btn [class*=" icon-"] { - /* keeps button heights with and without icons the same */ - - line-height: .9em; -} -li [class^="icon-"], li [class*=" icon-"] { - display: inline-block; - width: 1.25em; - text-align: center; -} -li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] { - /* 1.5 increased font size for icon-large * 1.25 width */ - - width: 1.875em; -} -li[class^="icon-"], li[class*=" icon-"] { - margin-left: 0; - list-style-type: none; -} -li[class^="icon-"]:before, li[class*=" icon-"]:before { - text-indent: -2em; - text-align: center; -} -li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before { - text-indent: -1.3333333333333333em; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { content: "\f000"; } -.icon-music:before { content: "\f001"; } -.icon-search:before { content: "\f002"; } -.icon-envelope:before { content: "\f003"; } -.icon-heart:before { content: "\f004"; } -.icon-star:before { content: "\f005"; } -.icon-star-empty:before { content: "\f006"; } -.icon-user:before { content: "\f007"; } -.icon-film:before { content: "\f008"; } -.icon-th-large:before { content: "\f009"; } -.icon-th:before { content: "\f00a"; } -.icon-th-list:before { content: "\f00b"; } -.icon-ok:before { content: "\f00c"; } -.icon-remove:before { content: "\f00d"; } -.icon-zoom-in:before { content: "\f00e"; } - -.icon-zoom-out:before { content: "\f010"; } -.icon-off:before { content: "\f011"; } -.icon-signal:before { content: "\f012"; } -.icon-cog:before { content: "\f013"; } -.icon-trash:before { content: "\f014"; } -.icon-home:before { content: "\f015"; } -.icon-file:before { content: "\f016"; } -.icon-time:before { content: "\f017"; } -.icon-road:before { content: "\f018"; } -.icon-download-alt:before { content: "\f019"; } -.icon-download:before { content: "\f01a"; } -.icon-upload:before { content: "\f01b"; } -.icon-inbox:before { content: "\f01c"; } -.icon-play-circle:before { content: "\f01d"; } -.icon-repeat:before { content: "\f01e"; } - -/* \f020 doesn't work in Safari. all shifted one down */ -.icon-refresh:before { content: "\f021"; } -.icon-list-alt:before { content: "\f022"; } -.icon-lock:before { content: "\f023"; } -.icon-flag:before { content: "\f024"; } -.icon-headphones:before { content: "\f025"; } -.icon-volume-off:before { content: "\f026"; } -.icon-volume-down:before { content: "\f027"; } -.icon-volume-up:before { content: "\f028"; } -.icon-qrcode:before { content: "\f029"; } -.icon-barcode:before { content: "\f02a"; } -.icon-tag:before { content: "\f02b"; } -.icon-tags:before { content: "\f02c"; } -.icon-book:before { content: "\f02d"; } -.icon-bookmark:before { content: "\f02e"; } -.icon-print:before { content: "\f02f"; } - -.icon-camera:before { content: "\f030"; } -.icon-font:before { content: "\f031"; } -.icon-bold:before { content: "\f032"; } -.icon-italic:before { content: "\f033"; } -.icon-text-height:before { content: "\f034"; } -.icon-text-width:before { content: "\f035"; } -.icon-align-left:before { content: "\f036"; } -.icon-align-center:before { content: "\f037"; } -.icon-align-right:before { content: "\f038"; } -.icon-align-justify:before { content: "\f039"; } -.icon-list:before { content: "\f03a"; } -.icon-indent-left:before { content: "\f03b"; } -.icon-indent-right:before { content: "\f03c"; } -.icon-facetime-video:before { content: "\f03d"; } -.icon-picture:before { content: "\f03e"; } - -.icon-pencil:before { content: "\f040"; } -.icon-map-marker:before { content: "\f041"; } -.icon-adjust:before { content: "\f042"; } -.icon-tint:before { content: "\f043"; } -.icon-edit:before { content: "\f044"; } -.icon-share:before { content: "\f045"; } -.icon-check:before { content: "\f046"; } -.icon-move:before { content: "\f047"; } -.icon-step-backward:before { content: "\f048"; } -.icon-fast-backward:before { content: "\f049"; } -.icon-backward:before { content: "\f04a"; } -.icon-play:before { content: "\f04b"; } -.icon-pause:before { content: "\f04c"; } -.icon-stop:before { content: "\f04d"; } -.icon-forward:before { content: "\f04e"; } - -.icon-fast-forward:before { content: "\f050"; } -.icon-step-forward:before { content: "\f051"; } -.icon-eject:before { content: "\f052"; } -.icon-chevron-left:before { content: "\f053"; } -.icon-chevron-right:before { content: "\f054"; } -.icon-plus-sign:before { content: "\f055"; } -.icon-minus-sign:before { content: "\f056"; } -.icon-remove-sign:before { content: "\f057"; } -.icon-ok-sign:before { content: "\f058"; } -.icon-question-sign:before { content: "\f059"; } -.icon-info-sign:before { content: "\f05a"; } -.icon-screenshot:before { content: "\f05b"; } -.icon-remove-circle:before { content: "\f05c"; } -.icon-ok-circle:before { content: "\f05d"; } -.icon-ban-circle:before { content: "\f05e"; } - -.icon-arrow-left:before { content: "\f060"; } -.icon-arrow-right:before { content: "\f061"; } -.icon-arrow-up:before { content: "\f062"; } -.icon-arrow-down:before { content: "\f063"; } -.icon-share-alt:before { content: "\f064"; } -.icon-resize-full:before { content: "\f065"; } -.icon-resize-small:before { content: "\f066"; } -.icon-plus:before { content: "\f067"; } -.icon-minus:before { content: "\f068"; } -.icon-asterisk:before { content: "\f069"; } -.icon-exclamation-sign:before { content: "\f06a"; } -.icon-gift:before { content: "\f06b"; } -.icon-leaf:before { content: "\f06c"; } -.icon-fire:before { content: "\f06d"; } -.icon-eye-open:before { content: "\f06e"; } - -.icon-eye-close:before { content: "\f070"; } -.icon-warning-sign:before { content: "\f071"; } -.icon-plane:before { content: "\f072"; } -.icon-calendar:before { content: "\f073"; } -.icon-random:before { content: "\f074"; } -.icon-comment:before { content: "\f075"; } -.icon-magnet:before { content: "\f076"; } -.icon-chevron-up:before { content: "\f077"; } -.icon-chevron-down:before { content: "\f078"; } -.icon-retweet:before { content: "\f079"; } -.icon-shopping-cart:before { content: "\f07a"; } -.icon-folder-close:before { content: "\f07b"; } -.icon-folder-open:before { content: "\f07c"; } -.icon-resize-vertical:before { content: "\f07d"; } -.icon-resize-horizontal:before { content: "\f07e"; } - -.icon-bar-chart:before { content: "\f080"; } -.icon-twitter-sign:before { content: "\f081"; } -.icon-facebook-sign:before { content: "\f082"; } -.icon-camera-retro:before { content: "\f083"; } -.icon-key:before { content: "\f084"; } -.icon-cogs:before { content: "\f085"; } -.icon-comments:before { content: "\f086"; } -.icon-thumbs-up:before { content: "\f087"; } -.icon-thumbs-down:before { content: "\f088"; } -.icon-star-half:before { content: "\f089"; } -.icon-heart-empty:before { content: "\f08a"; } -.icon-signout:before { content: "\f08b"; } -.icon-linkedin-sign:before { content: "\f08c"; } -.icon-pushpin:before { content: "\f08d"; } -.icon-external-link:before { content: "\f08e"; } - -.icon-signin:before { content: "\f090"; } -.icon-trophy:before { content: "\f091"; } -.icon-github-sign:before { content: "\f092"; } -.icon-upload-alt:before { content: "\f093"; } -.icon-lemon:before { content: "\f094"; } -.icon-phone:before { content: "\f095"; } -.icon-check-empty:before { content: "\f096"; } -.icon-bookmark-empty:before { content: "\f097"; } -.icon-phone-sign:before { content: "\f098"; } -.icon-twitter:before { content: "\f099"; } -.icon-facebook:before { content: "\f09a"; } -.icon-github:before { content: "\f09b"; } -.icon-unlock:before { content: "\f09c"; } -.icon-credit-card:before { content: "\f09d"; } -.icon-rss:before { content: "\f09e"; } - -.icon-hdd:before { content: "\f0a0"; } -.icon-bullhorn:before { content: "\f0a1"; } -.icon-bell:before { content: "\f0a2"; } -.icon-certificate:before { content: "\f0a3"; } -.icon-hand-right:before { content: "\f0a4"; } -.icon-hand-left:before { content: "\f0a5"; } -.icon-hand-up:before { content: "\f0a6"; } -.icon-hand-down:before { content: "\f0a7"; } -.icon-circle-arrow-left:before { content: "\f0a8"; } -.icon-circle-arrow-right:before { content: "\f0a9"; } -.icon-circle-arrow-up:before { content: "\f0aa"; } -.icon-circle-arrow-down:before { content: "\f0ab"; } -.icon-globe:before { content: "\f0ac"; } -.icon-wrench:before { content: "\f0ad"; } -.icon-tasks:before { content: "\f0ae"; } - -.icon-filter:before { content: "\f0b0"; } -.icon-briefcase:before { content: "\f0b1"; } -.icon-fullscreen:before { content: "\f0b2"; } - -.icon-group:before { content: "\f0c0"; } -.icon-link:before { content: "\f0c1"; } -.icon-cloud:before { content: "\f0c2"; } -.icon-beaker:before { content: "\f0c3"; } -.icon-cut:before { content: "\f0c4"; } -.icon-copy:before { content: "\f0c5"; } -.icon-paper-clip:before { content: "\f0c6"; } -.icon-save:before { content: "\f0c7"; } -.icon-sign-blank:before { content: "\f0c8"; } -.icon-reorder:before { content: "\f0c9"; } -.icon-list-ul:before { content: "\f0ca"; } -.icon-list-ol:before { content: "\f0cb"; } -.icon-strikethrough:before { content: "\f0cc"; } -.icon-underline:before { content: "\f0cd"; } -.icon-table:before { content: "\f0ce"; } - -.icon-magic:before { content: "\f0d0"; } -.icon-truck:before { content: "\f0d1"; } -.icon-pinterest:before { content: "\f0d2"; } -.icon-pinterest-sign:before { content: "\f0d3"; } -.icon-google-plus-sign:before { content: "\f0d4"; } -.icon-google-plus:before { content: "\f0d5"; } -.icon-money:before { content: "\f0d6"; } -.icon-caret-down:before { content: "\f0d7"; } -.icon-caret-up:before { content: "\f0d8"; } -.icon-caret-left:before { content: "\f0d9"; } -.icon-caret-right:before { content: "\f0da"; } -.icon-columns:before { content: "\f0db"; } -.icon-sort:before { content: "\f0dc"; } -.icon-sort-down:before { content: "\f0dd"; } -.icon-sort-up:before { content: "\f0de"; } - -.icon-envelope-alt:before { content: "\f0e0"; } -.icon-linkedin:before { content: "\f0e1"; } -.icon-undo:before { content: "\f0e2"; } -.icon-legal:before { content: "\f0e3"; } -.icon-dashboard:before { content: "\f0e4"; } -.icon-comment-alt:before { content: "\f0e5"; } -.icon-comments-alt:before { content: "\f0e6"; } -.icon-bolt:before { content: "\f0e7"; } -.icon-sitemap:before { content: "\f0e8"; } -.icon-umbrella:before { content: "\f0e9"; } -.icon-paste:before { content: "\f0ea"; } - -.icon-user-md:before { content: "\f200"; } diff --git a/sources/libs/font-awesome/docs/assets/css/font-awesome-ie7.css b/sources/libs/font-awesome/docs/assets/css/font-awesome-ie7.css deleted file mode 100644 index fa71f40..0000000 --- a/sources/libs/font-awesome/docs/assets/css/font-awesome-ie7.css +++ /dev/null @@ -1,213 +0,0 @@ -[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-style:normal;font-weight:normal;} -.btn.dropdown-toggle [class^="icon-"],.btn.dropdown-toggle [class*=" icon-"]{line-height:1.4em;} -.icon-large{font-size:1.3333em;} -.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} -.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' ');} diff --git a/sources/libs/font-awesome/docs/assets/css/font-awesome.css b/sources/libs/font-awesome/docs/assets/css/font-awesome.css deleted file mode 100644 index d1f1974..0000000 --- a/sources/libs/font-awesome/docs/assets/css/font-awesome.css +++ /dev/null @@ -1,303 +0,0 @@ -/* Font Awesome - the iconic font designed for use with Twitter Bootstrap - ------------------------------------------------------- - The full suite of pictographic icons, examples, and documentation - can be found at: http://fortawesome.github.com/Font-Awesome/ - - License - ------------------------------------------------------- - The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0: - http://creativecommons.org/licenses/by/3.0/ A mention of - 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable - source code is considered acceptable attribution (most common on the web). - If human readable source code is not available to the end user, a mention in - an 'About' or 'Credits' screen is considered acceptable (most common in desktop - or mobile software). - - Contact - ------------------------------------------------------- - Email: dave@davegandy.com - Twitter: http://twitter.com/fortaweso_me - Work: http://lemonwi.se co-founder - - */ -@font-face { - font-family: 'FontAwesome'; - src: url('../font/fontawesome-webfont.eot'); - src: url('../font/fontawesome-webfont.eot?#iefix') format('eot'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; -} - -/* Font Awesome styles - ------------------------------------------------------- */ -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; -} -a [class^="icon-"], a [class*=" icon-"] { - display: inline-block; - text-decoration: inherit; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: top; - font-size: 1.3333333333333333em; -} -.btn [class^="icon-"], .btn [class*=" icon-"] { - /* keeps button heights with and without icons the same */ - - line-height: .9em; -} -li [class^="icon-"], li [class*=" icon-"] { - display: inline-block; - width: 1.25em; - text-align: center; -} -li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] { - /* 1.5 increased font size for icon-large * 1.25 width */ - - width: 1.875em; -} -li[class^="icon-"], li[class*=" icon-"] { - margin-left: 0; - list-style-type: none; -} -li[class^="icon-"]:before, li[class*=" icon-"]:before { - text-indent: -2em; - text-align: center; -} -li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before { - text-indent: -1.3333333333333333em; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { content: "\f000"; } -.icon-music:before { content: "\f001"; } -.icon-search:before { content: "\f002"; } -.icon-envelope:before { content: "\f003"; } -.icon-heart:before { content: "\f004"; } -.icon-star:before { content: "\f005"; } -.icon-star-empty:before { content: "\f006"; } -.icon-user:before { content: "\f007"; } -.icon-film:before { content: "\f008"; } -.icon-th-large:before { content: "\f009"; } -.icon-th:before { content: "\f00a"; } -.icon-th-list:before { content: "\f00b"; } -.icon-ok:before { content: "\f00c"; } -.icon-remove:before { content: "\f00d"; } -.icon-zoom-in:before { content: "\f00e"; } - -.icon-zoom-out:before { content: "\f010"; } -.icon-off:before { content: "\f011"; } -.icon-signal:before { content: "\f012"; } -.icon-cog:before { content: "\f013"; } -.icon-trash:before { content: "\f014"; } -.icon-home:before { content: "\f015"; } -.icon-file:before { content: "\f016"; } -.icon-time:before { content: "\f017"; } -.icon-road:before { content: "\f018"; } -.icon-download-alt:before { content: "\f019"; } -.icon-download:before { content: "\f01a"; } -.icon-upload:before { content: "\f01b"; } -.icon-inbox:before { content: "\f01c"; } -.icon-play-circle:before { content: "\f01d"; } -.icon-repeat:before { content: "\f01e"; } - -/* \f020 doesn't work in Safari. all shifted one down */ -.icon-refresh:before { content: "\f021"; } -.icon-list-alt:before { content: "\f022"; } -.icon-lock:before { content: "\f023"; } -.icon-flag:before { content: "\f024"; } -.icon-headphones:before { content: "\f025"; } -.icon-volume-off:before { content: "\f026"; } -.icon-volume-down:before { content: "\f027"; } -.icon-volume-up:before { content: "\f028"; } -.icon-qrcode:before { content: "\f029"; } -.icon-barcode:before { content: "\f02a"; } -.icon-tag:before { content: "\f02b"; } -.icon-tags:before { content: "\f02c"; } -.icon-book:before { content: "\f02d"; } -.icon-bookmark:before { content: "\f02e"; } -.icon-print:before { content: "\f02f"; } - -.icon-camera:before { content: "\f030"; } -.icon-font:before { content: "\f031"; } -.icon-bold:before { content: "\f032"; } -.icon-italic:before { content: "\f033"; } -.icon-text-height:before { content: "\f034"; } -.icon-text-width:before { content: "\f035"; } -.icon-align-left:before { content: "\f036"; } -.icon-align-center:before { content: "\f037"; } -.icon-align-right:before { content: "\f038"; } -.icon-align-justify:before { content: "\f039"; } -.icon-list:before { content: "\f03a"; } -.icon-indent-left:before { content: "\f03b"; } -.icon-indent-right:before { content: "\f03c"; } -.icon-facetime-video:before { content: "\f03d"; } -.icon-picture:before { content: "\f03e"; } - -.icon-pencil:before { content: "\f040"; } -.icon-map-marker:before { content: "\f041"; } -.icon-adjust:before { content: "\f042"; } -.icon-tint:before { content: "\f043"; } -.icon-edit:before { content: "\f044"; } -.icon-share:before { content: "\f045"; } -.icon-check:before { content: "\f046"; } -.icon-move:before { content: "\f047"; } -.icon-step-backward:before { content: "\f048"; } -.icon-fast-backward:before { content: "\f049"; } -.icon-backward:before { content: "\f04a"; } -.icon-play:before { content: "\f04b"; } -.icon-pause:before { content: "\f04c"; } -.icon-stop:before { content: "\f04d"; } -.icon-forward:before { content: "\f04e"; } - -.icon-fast-forward:before { content: "\f050"; } -.icon-step-forward:before { content: "\f051"; } -.icon-eject:before { content: "\f052"; } -.icon-chevron-left:before { content: "\f053"; } -.icon-chevron-right:before { content: "\f054"; } -.icon-plus-sign:before { content: "\f055"; } -.icon-minus-sign:before { content: "\f056"; } -.icon-remove-sign:before { content: "\f057"; } -.icon-ok-sign:before { content: "\f058"; } -.icon-question-sign:before { content: "\f059"; } -.icon-info-sign:before { content: "\f05a"; } -.icon-screenshot:before { content: "\f05b"; } -.icon-remove-circle:before { content: "\f05c"; } -.icon-ok-circle:before { content: "\f05d"; } -.icon-ban-circle:before { content: "\f05e"; } - -.icon-arrow-left:before { content: "\f060"; } -.icon-arrow-right:before { content: "\f061"; } -.icon-arrow-up:before { content: "\f062"; } -.icon-arrow-down:before { content: "\f063"; } -.icon-share-alt:before { content: "\f064"; } -.icon-resize-full:before { content: "\f065"; } -.icon-resize-small:before { content: "\f066"; } -.icon-plus:before { content: "\f067"; } -.icon-minus:before { content: "\f068"; } -.icon-asterisk:before { content: "\f069"; } -.icon-exclamation-sign:before { content: "\f06a"; } -.icon-gift:before { content: "\f06b"; } -.icon-leaf:before { content: "\f06c"; } -.icon-fire:before { content: "\f06d"; } -.icon-eye-open:before { content: "\f06e"; } - -.icon-eye-close:before { content: "\f070"; } -.icon-warning-sign:before { content: "\f071"; } -.icon-plane:before { content: "\f072"; } -.icon-calendar:before { content: "\f073"; } -.icon-random:before { content: "\f074"; } -.icon-comment:before { content: "\f075"; } -.icon-magnet:before { content: "\f076"; } -.icon-chevron-up:before { content: "\f077"; } -.icon-chevron-down:before { content: "\f078"; } -.icon-retweet:before { content: "\f079"; } -.icon-shopping-cart:before { content: "\f07a"; } -.icon-folder-close:before { content: "\f07b"; } -.icon-folder-open:before { content: "\f07c"; } -.icon-resize-vertical:before { content: "\f07d"; } -.icon-resize-horizontal:before { content: "\f07e"; } - -.icon-bar-chart:before { content: "\f080"; } -.icon-twitter-sign:before { content: "\f081"; } -.icon-facebook-sign:before { content: "\f082"; } -.icon-camera-retro:before { content: "\f083"; } -.icon-key:before { content: "\f084"; } -.icon-cogs:before { content: "\f085"; } -.icon-comments:before { content: "\f086"; } -.icon-thumbs-up:before { content: "\f087"; } -.icon-thumbs-down:before { content: "\f088"; } -.icon-star-half:before { content: "\f089"; } -.icon-heart-empty:before { content: "\f08a"; } -.icon-signout:before { content: "\f08b"; } -.icon-linkedin-sign:before { content: "\f08c"; } -.icon-pushpin:before { content: "\f08d"; } -.icon-external-link:before { content: "\f08e"; } - -.icon-signin:before { content: "\f090"; } -.icon-trophy:before { content: "\f091"; } -.icon-github-sign:before { content: "\f092"; } -.icon-upload-alt:before { content: "\f093"; } -.icon-lemon:before { content: "\f094"; } -.icon-phone:before { content: "\f095"; } -.icon-check-empty:before { content: "\f096"; } -.icon-bookmark-empty:before { content: "\f097"; } -.icon-phone-sign:before { content: "\f098"; } -.icon-twitter:before { content: "\f099"; } -.icon-facebook:before { content: "\f09a"; } -.icon-github:before { content: "\f09b"; } -.icon-unlock:before { content: "\f09c"; } -.icon-credit-card:before { content: "\f09d"; } -.icon-rss:before { content: "\f09e"; } - -.icon-hdd:before { content: "\f0a0"; } -.icon-bullhorn:before { content: "\f0a1"; } -.icon-bell:before { content: "\f0a2"; } -.icon-certificate:before { content: "\f0a3"; } -.icon-hand-right:before { content: "\f0a4"; } -.icon-hand-left:before { content: "\f0a5"; } -.icon-hand-up:before { content: "\f0a6"; } -.icon-hand-down:before { content: "\f0a7"; } -.icon-circle-arrow-left:before { content: "\f0a8"; } -.icon-circle-arrow-right:before { content: "\f0a9"; } -.icon-circle-arrow-up:before { content: "\f0aa"; } -.icon-circle-arrow-down:before { content: "\f0ab"; } -.icon-globe:before { content: "\f0ac"; } -.icon-wrench:before { content: "\f0ad"; } -.icon-tasks:before { content: "\f0ae"; } - -.icon-filter:before { content: "\f0b0"; } -.icon-briefcase:before { content: "\f0b1"; } -.icon-fullscreen:before { content: "\f0b2"; } - -.icon-group:before { content: "\f0c0"; } -.icon-link:before { content: "\f0c1"; } -.icon-cloud:before { content: "\f0c2"; } -.icon-beaker:before { content: "\f0c3"; } -.icon-cut:before { content: "\f0c4"; } -.icon-copy:before { content: "\f0c5"; } -.icon-paper-clip:before { content: "\f0c6"; } -.icon-save:before { content: "\f0c7"; } -.icon-sign-blank:before { content: "\f0c8"; } -.icon-reorder:before { content: "\f0c9"; } -.icon-list-ul:before { content: "\f0ca"; } -.icon-list-ol:before { content: "\f0cb"; } -.icon-strikethrough:before { content: "\f0cc"; } -.icon-underline:before { content: "\f0cd"; } -.icon-table:before { content: "\f0ce"; } - -.icon-magic:before { content: "\f0d0"; } -.icon-truck:before { content: "\f0d1"; } -.icon-pinterest:before { content: "\f0d2"; } -.icon-pinterest-sign:before { content: "\f0d3"; } -.icon-google-plus-sign:before { content: "\f0d4"; } -.icon-google-plus:before { content: "\f0d5"; } -.icon-money:before { content: "\f0d6"; } -.icon-caret-down:before { content: "\f0d7"; } -.icon-caret-up:before { content: "\f0d8"; } -.icon-caret-left:before { content: "\f0d9"; } -.icon-caret-right:before { content: "\f0da"; } -.icon-columns:before { content: "\f0db"; } -.icon-sort:before { content: "\f0dc"; } -.icon-sort-down:before { content: "\f0dd"; } -.icon-sort-up:before { content: "\f0de"; } - -.icon-envelope-alt:before { content: "\f0e0"; } -.icon-linkedin:before { content: "\f0e1"; } -.icon-undo:before { content: "\f0e2"; } -.icon-legal:before { content: "\f0e3"; } -.icon-dashboard:before { content: "\f0e4"; } -.icon-comment-alt:before { content: "\f0e5"; } -.icon-comments-alt:before { content: "\f0e6"; } -.icon-bolt:before { content: "\f0e7"; } -.icon-sitemap:before { content: "\f0e8"; } -.icon-umbrella:before { content: "\f0e9"; } -.icon-paste:before { content: "\f0ea"; } - -.icon-user-md:before { content: "\f200"; } diff --git a/sources/libs/font-awesome/docs/assets/css/prettify.css b/sources/libs/font-awesome/docs/assets/css/prettify.css deleted file mode 100755 index aedd8d1..0000000 --- a/sources/libs/font-awesome/docs/assets/css/prettify.css +++ /dev/null @@ -1,30 +0,0 @@ -.com { color: #93a1a1; } -.lit { color: #195f91; } -.pun, .opn, .clo { color: #93a1a1; } -.fun { color: #dc322f; } -.str, .atv { color: #D14; } -.kwd, .linenums .tag { color: #1e347b; } -.typ, .atn, .dec, .var { color: teal; } -.pln { color: #48484c; } - -.prettyprint { - padding: 8px; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -.prettyprint.linenums { - -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin: 0 0 0 33px; /* IE indents via margin-left */ -} -ol.linenums li { - padding-left: 12px; - color: #bebec5; - line-height: 18px; - text-shadow: 0 1px 0 #fff; -} \ No newline at end of file diff --git a/sources/libs/font-awesome/docs/assets/css/site.css b/sources/libs/font-awesome/docs/assets/css/site.css deleted file mode 100644 index 6db5c84..0000000 --- a/sources/libs/font-awesome/docs/assets/css/site.css +++ /dev/null @@ -1,4904 +0,0 @@ -/*! - * Bootstrap v2.0.3 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 21px; - color: #333333; - background-color: #ffffff; -} -a { - color: #9d261d; - text-decoration: none; -} -a:hover { - color: #5c1611; - text-decoration: underline; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.127659574%; - *margin-left: 2.0744680846382977%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .span12 { - width: 99.99999998999999%; - *width: 99.94680850063828%; -} -.row-fluid .span11 { - width: 91.489361693%; - *width: 91.4361702036383%; -} -.row-fluid .span10 { - width: 82.97872339599999%; - *width: 82.92553190663828%; -} -.row-fluid .span9 { - width: 74.468085099%; - *width: 74.4148936096383%; -} -.row-fluid .span8 { - width: 65.95744680199999%; - *width: 65.90425531263828%; -} -.row-fluid .span7 { - width: 57.446808505%; - *width: 57.3936170156383%; -} -.row-fluid .span6 { - width: 48.93617020799999%; - *width: 48.88297871863829%; -} -.row-fluid .span5 { - width: 40.425531911%; - *width: 40.3723404216383%; -} -.row-fluid .span4 { - width: 31.914893614%; - *width: 31.8617021246383%; -} -.row-fluid .span3 { - width: 23.404255317%; - *width: 23.3510638276383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.8404255306383%; -} -.row-fluid .span1 { - width: 6.382978723%; - *width: 6.329787233638298%; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10.5px; - font-family: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 21px; -} -p small { - font-size: 12px; - color: #999999; -} -.lead { - margin-bottom: 21px; - font-size: 20px; - font-weight: 200; - line-height: 31.5px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: bold; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} -h1 { - font-size: 30px; - line-height: 42px; -} -h1 small { - font-size: 18px; -} -h2 { - font-size: 24px; - line-height: 42px; -} -h2 small { - font-size: 18px; -} -h3 { - font-size: 18px; - line-height: 31.5px; -} -h3 small { - font-size: 14px; -} -h4, -h5, -h6 { - line-height: 21px; -} -h4 { - font-size: 14px; -} -h4 small { - font-size: 12px; -} -h5 { - font-size: 12px; -} -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} -.page-header { - padding-bottom: 20px; - margin: 21px 0; - border-bottom: 1px solid #eeeeee; -} -.page-header h1 { - line-height: 1; -} -ul, -ol { - padding: 0; - margin: 0 0 10.5px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -ul { - list-style: disc; -} -ol { - list-style: decimal; -} -li { - line-height: 21px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -dl { - margin-bottom: 21px; -} -dt, -dd { - line-height: 21px; -} -dt { - font-weight: bold; - line-height: 20px; -} -dd { - margin-left: 10.5px; -} -.dl-horizontal dt { - float: left; - width: 120px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 130px; -} -hr { - margin: 21px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -.muted { - color: #999999; -} -abbr[title] { - cursor: help; - border-bottom: 1px dotted #ddd; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 21px; - border-left: 5px solid #eeeeee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 26.25px; -} -blockquote small { - display: block; - line-height: 21px; - color: #999999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 21px; - font-style: normal; - line-height: 21px; -} -small { - font-size: 100%; -} -cite { - font-style: normal; -} -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 13px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -pre { - display: block; - padding: 10px; - margin: 0 0 10.5px; - font-size: 12.950000000000001px; - line-height: 21px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 21px; -} -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 21px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 31.5px; - font-size: 21px; - line-height: 42px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} -legend small { - font-size: 15.75px; - color: #999999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 21px; -} -input, -button, -select, -textarea { - font-family: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; - color: #333333; -} -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 21px; - padding: 4px; - margin-bottom: 9px; - font-size: 14px; - line-height: 21px; - color: #555555; - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.uneditable-textarea { - width: auto; - height: auto; -} -label input, -label textarea, -label select { - display: block; -} -input[type="image"], -input[type="checkbox"], -input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; - background-color: transparent; - border: 0 \9; - /* IE9 and down */ - - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -input[type="image"] { - border: 0; -} -input[type="file"] { - width: auto; - padding: initial; - line-height: initial; - background-color: #ffffff; - background-color: initial; - border: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -input[type="button"], -input[type="reset"], -input[type="submit"] { - width: auto; - height: auto; -} -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} -input[type="file"] { - line-height: 18px \9; -} -select { - width: 220px; - background-color: #ffffff; -} -select[multiple], -select[size] { - height: auto; -} -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -textarea { - height: auto; -} -input[type="hidden"] { - display: none; -} -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -input, -textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} -input:focus, -textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus, -select:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -input.span12, textarea.span12, .uneditable-input.span12 { - width: 930px; -} -input.span11, textarea.span11, .uneditable-input.span11 { - width: 850px; -} -input.span10, textarea.span10, .uneditable-input.span10 { - width: 770px; -} -input.span9, textarea.span9, .uneditable-input.span9 { - width: 690px; -} -input.span8, textarea.span8, .uneditable-input.span8 { - width: 610px; -} -input.span7, textarea.span7, .uneditable-input.span7 { - width: 530px; -} -input.span6, textarea.span6, .uneditable-input.span6 { - width: 450px; -} -input.span5, textarea.span5, .uneditable-input.span5 { - width: 370px; -} -input.span4, textarea.span4, .uneditable-input.span4 { - width: 290px; -} -input.span3, textarea.span3, .uneditable-input.span3 { - width: 210px; -} -input.span2, textarea.span2, .uneditable-input.span2 { - width: 130px; -} -input.span1, textarea.span1, .uneditable-input.span1 { - width: 50px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; - border-color: #ddd; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 20px 20px 21px; - margin-top: 21px; - margin-bottom: 21px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; -} -.form-actions:after { - clear: both; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; - cursor: not-allowed; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} -:-moz-placeholder { - color: #999999; -} -::-webkit-input-placeholder { - color: #999999; -} -.help-block, -.help-inline { - color: #555555; -} -.help-block { - display: block; - margin-bottom: 10.5px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-prepend, -.input-append { - margin-bottom: 5px; -} -.input-prepend input, -.input-append input, -.input-prepend select, -.input-append select, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: middle; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend input:focus, -.input-append input:focus, -.input-prepend select:focus, -.input-append select:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - z-index: 2; -} -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} -.input-prepend .add-on, -.input-append .add-on { - display: inline-block; - width: auto; - height: 21px; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 21px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; -} -.input-prepend .add-on, -.input-append .add-on, -.input-prepend .btn, -.input-append .btn { - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append .uneditable-input { - border-right-color: #ccc; - border-left-color: #eee; -} -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-bottom: 0; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10.5px; -} -legend + .control-group { - margin-top: 21px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 21px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 160px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 160px; -} -.form-horizontal .help-block { - margin-top: 10.5px; - margin-bottom: 0; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 21px; -} -.table th, -.table td { - padding: 8px; - line-height: 21px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #dddddd; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapsed; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #f5f5f5; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - opacity: 0.3; - filter: alpha(opacity=30); -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown:hover .caret, -.open .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 4px 0; - margin: 1px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9.5px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 21px; - color: #333333; - white-space: nowrap; -} -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #9d261d; -} -.open { - *z-index: 1000; -} -.open .dropdown-menu { - display: block; -} -.pull-right .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: "\2191"; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - filter: alpha(opacity=0); - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; - filter: alpha(opacity=100); -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 21px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - padding: 4px 10px 4px; - margin-bottom: 0; - font-size: 14px; - line-height: 21px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e6e6e6; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #cccccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - background-color: #e6e6e6; - *background-color: #d9d9d9; -} -.btn:active, -.btn.active { - background-color: #cccccc \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 16px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-large [class^="icon-"] { - margin-top: 1px; -} -.btn-small { - padding: 5px 9px; - font-size: 12px; - line-height: 19px; -} -.btn-small [class^="icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 2px 6px; - font-size: 12px; - line-height: 17px; -} -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn { - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} -.btn-primary { - background-color: #9d331d; - background-image: -moz-linear-gradient(top, #9d261d, #9d461d); - background-image: -ms-linear-gradient(top, #9d261d, #9d461d); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#9d261d), to(#9d461d)); - background-image: -webkit-linear-gradient(top, #9d261d, #9d461d); - background-image: -o-linear-gradient(top, #9d261d, #9d461d); - background-image: linear-gradient(top, #9d261d, #9d461d); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9d261d', endColorstr='#9d461d', GradientType=0); - border-color: #9d461d #9d461d #5c2911; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #9d461d; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #9d461d; - *background-color: #873c19; -} -.btn-primary:active, -.btn-primary.active { - background-color: #723315 \9; -} -.btn-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - background-color: #414141; - background-image: -moz-linear-gradient(top, #555555, #222222); - background-image: -ms-linear-gradient(top, #555555, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); - background-image: -webkit-linear-gradient(top, #555555, #222222); - background-image: -o-linear-gradient(top, #555555, #222222); - background-image: linear-gradient(top, #555555, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #222222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-group { - position: relative; - *zoom: 1; - *margin-left: .3em; -} -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} -.btn-group:after { - clear: both; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - margin-top: 10.5px; - margin-bottom: 10.5px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} -.btn-group > .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 6px; - -moz-border-radius-topleft: 6px; - border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - border-bottom-left-radius: 6px; -} -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - -moz-border-radius-topright: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-bottomright: 6px; - border-bottom-right-radius: 6px; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - *padding-top: 4px; - *padding-bottom: 4px; -} -.btn-group > .btn-mini.dropdown-toggle { - padding-left: 5px; - padding-right: 5px; -} -.btn-group > .btn-small.dropdown-toggle { - *padding-top: 4px; - *padding-bottom: 4px; -} -.btn-group > .btn-large.dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #9d461d; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} -.btn .caret { - margin-top: 7px; - margin-left: 0; -} -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.btn-mini .caret { - margin-top: 5px; -} -.btn-small .caret { - margin-top: 6px; -} -.btn-large .caret { - margin-top: 6px; - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.dropup .btn-large .caret { - border-bottom: 5px solid #000000; - border-top: 0; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 21px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - color: #c09853; -} -.alert-heading { - color: inherit; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f2dede; - border-color: #eed3d7; - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 21px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} -.nav > .pull-right { - float: right; -} -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 21px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - margin-bottom: 0; -} -.nav-list > li > a, -.nav-list .nav-header { - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #9d261d; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9.5px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.nav-tabs > li, -.nav-pills > li { - float: left; -} -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 21px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #9d261d; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - border-top-color: #9d261d; - border-bottom-color: #9d261d; - margin-top: 6px; -} -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #5c1611; - border-bottom-color: #5c1611; -} -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} -.navbar { - *position: relative; - *z-index: 2; - overflow: visible; - margin-bottom: 21px; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); - box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; -} -.navbar { - color: #999999; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #999999; -} -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; -} -.navbar .navbar-link { - color: #999999; -} -.navbar .navbar-link:hover { - color: #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn { - margin: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} -.navbar-search .search-query { - padding: 4px 9px; - font-family: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - background-color: #626262; - border: 1px solid #151515; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} -.navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} -.navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - display: block; - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 9px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar .btn { - display: inline-block; - padding: 4px 10px 4px; - margin: 5px 5px 6px; - line-height: 21px; -} -.navbar .btn-group { - margin: 0; - padding: 5px 5px 6px; -} -.navbar .nav > li > a:hover { - background-color: transparent; - color: #ffffff; - text-decoration: none; -} -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} -.navbar .divider-vertical { - height: 40px; - width: 1px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} -.navbar .nav.pull-right { - margin-left: 10px; - margin-right: 0; -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - background-color: #222222; - *background-color: #151515; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #080808 \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .dropdown-menu:after { - border-top: 6px solid #ffffff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown .dropdown-toggle .caret, -.navbar .nav li.dropdown.open .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} -.navbar .nav li.dropdown.active .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: transparent; -} -.navbar .nav li.dropdown.active > .dropdown-toggle:hover { - color: #ffffff; -} -.navbar .pull-right .dropdown-menu, -.navbar .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right .dropdown-menu:before, -.navbar .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right .dropdown-menu:after, -.navbar .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.breadcrumb { - padding: 7px 14px; - margin: 0 0 21px; - list-style: none; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -.breadcrumb li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - text-shadow: 0 1px 0 #ffffff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} -.breadcrumb .active a { - color: #333333; -} -.pagination { - height: 42px; - margin: 21px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination li { - display: inline; -} -.pagination a { - float: left; - padding: 0 14px; - line-height: 40px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} -.pagination .active a { - color: #999999; - cursor: default; -} -.pagination .disabled span, -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - background-color: transparent; - cursor: default; -} -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pager { - margin-left: 0; - margin-bottom: 21px; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next a { - float: right; -} -.pager .previous a { - float: left; -} -.pager .disabled a, -.pager .disabled a:hover { - color: #999999; - background-color: #fff; - cursor: default; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2070; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -ms-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-body { - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.tooltip { - position: absolute; - z-index: 1020; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -2px; -} -.tooltip.right { - margin-left: 2px; -} -.tooltip.bottom { - margin-top: 2px; -} -.tooltip.left { - margin-left: -2px; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} -.popover.top { - margin-top: -5px; -} -.popover.right { - margin-left: 5px; -} -.popover.bottom { - margin-top: 5px; -} -.popover.left { - margin-left: -5px; -} -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} -.popover-inner { - padding: 3px; - width: 280px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 21px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} -a.thumbnail:hover { - border-color: #9d261d; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; -} -.label, -.badge { - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999999; -} -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b94a48; -} -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 18px; - margin-bottom: 18px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 18px; - color: #ffffff; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); -} -.progress-warning.progress-striped .bar { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 21px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 21px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel .item > img { - display: block; - line-height: 1; -} -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} -.carousel .active { - left: 0; -} -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel .next { - left: 100%; -} -.carousel .prev { - left: -100%; -} -.carousel .next.left, -.carousel .prev.right { - left: 0; -} -.carousel .active.left { - left: -100%; -} -.carousel .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 31.5px; - color: inherit; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -@font-face { - font-family: 'museo-slab'; - src: url('../font/museo_slab_300-webfont.eot'); - src: url('../font/museo_slab_300-webfont.eot?#iefix') format('embedded-opentype'), url('../font/museo_slab_300-webfont.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} -@font-face { - font-family: 'museo-slab'; - src: url('../font/museo_slab_500-webfont.eot'); - src: url('../font/museo_slab_500-webfont.eot?#iefix') format('embedded-opentype'), url('../font/museo_slab_500-webfont.ttf') format('truetype'); - font-weight: bold; - font-style: normal; -} -@font-face { - font-family: 'proxima-nova'; - src: url('../font/proximanova-webfont.eot'); - src: url('../font/proximanova-webfont.eot?#iefix') format('embedded-opentype'), url('../font/proximanova-webfont.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} -/* Font Awesome - the iconic font designed for use with Twitter Bootstrap - ------------------------------------------------------- - The full suite of pictographic icons, examples, and documentation - can be found at: http://fortawesome.github.com/Font-Awesome/ - - License - ------------------------------------------------------- - The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0: - http://creativecommons.org/licenses/by/3.0/ A mention of - 'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable - source code is considered acceptable attribution (most common on the web). - If human readable source code is not available to the end user, a mention in - an 'About' or 'Credits' screen is considered acceptable (most common in desktop - or mobile software). - - Contact - ------------------------------------------------------- - Email: dave@davegandy.com - Twitter: http://twitter.com/fortaweso_me - Work: Lead Product Designer @ http://kyruus.com - - */ -@font-face { - font-family: 'FontAwesome'; - src: url('../font/fontawesome-webfont.eot'); - src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg'); - font-weight: normal; - font-style: normal; -} -/* Font Awesome styles - ------------------------------------------------------- */ -[class^="icon-"]:before, -[class*=" icon-"]:before { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; -} -a [class^="icon-"], -a [class*=" icon-"] { - display: inline-block; - text-decoration: inherit; -} -/* makes the font 33% larger relative to the icon container */ -.icon-large:before { - vertical-align: middle; - font-size: 1.3333333333333333em; -} -.btn [class^="icon-"], -.nav-tabs [class^="icon-"], -.btn [class*=" icon-"], -.nav-tabs [class*=" icon-"] { - /* keeps button heights with and without icons the same */ - - line-height: .9em; -} -li [class^="icon-"], -li [class*=" icon-"] { - display: inline-block; - width: 1.25em; - text-align: center; -} -li .icon-large:before, -li .icon-large:before { - /* 1.5 increased font size for icon-large * 1.25 width */ - - width: 1.875em; -} -ul.icons { - list-style-type: none; - margin-left: 2em; - text-indent: -0.8em; -} -ul.icons li [class^="icon-"], -ul.icons li [class*=" icon-"] { - width: .8em; -} -ul.icons li .icon-large:before, -ul.icons li .icon-large:before { - /* 1.5 increased font size for icon-large * 1.25 width */ - - vertical-align: initial; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.icon-glass:before { - content: "\f000"; -} -.icon-music:before { - content: "\f001"; -} -.icon-search:before { - content: "\f002"; -} -.icon-envelope:before { - content: "\f003"; -} -.icon-heart:before { - content: "\f004"; -} -.icon-star:before { - content: "\f005"; -} -.icon-star-empty:before { - content: "\f006"; -} -.icon-user:before { - content: "\f007"; -} -.icon-film:before { - content: "\f008"; -} -.icon-th-large:before { - content: "\f009"; -} -.icon-th:before { - content: "\f00a"; -} -.icon-th-list:before { - content: "\f00b"; -} -.icon-ok:before { - content: "\f00c"; -} -.icon-remove:before { - content: "\f00d"; -} -.icon-zoom-in:before { - content: "\f00e"; -} -.icon-zoom-out:before { - content: "\f010"; -} -.icon-off:before { - content: "\f011"; -} -.icon-signal:before { - content: "\f012"; -} -.icon-cog:before { - content: "\f013"; -} -.icon-trash:before { - content: "\f014"; -} -.icon-home:before { - content: "\f015"; -} -.icon-file:before { - content: "\f016"; -} -.icon-time:before { - content: "\f017"; -} -.icon-road:before { - content: "\f018"; -} -.icon-download-alt:before { - content: "\f019"; -} -.icon-download:before { - content: "\f01a"; -} -.icon-upload:before { - content: "\f01b"; -} -.icon-inbox:before { - content: "\f01c"; -} -.icon-play-circle:before { - content: "\f01d"; -} -.icon-repeat:before { - content: "\f01e"; -} -/* \f020 doesn't work in Safari. all shifted one down */ -.icon-refresh:before { - content: "\f021"; -} -.icon-list-alt:before { - content: "\f022"; -} -.icon-lock:before { - content: "\f023"; -} -.icon-flag:before { - content: "\f024"; -} -.icon-headphones:before { - content: "\f025"; -} -.icon-volume-off:before { - content: "\f026"; -} -.icon-volume-down:before { - content: "\f027"; -} -.icon-volume-up:before { - content: "\f028"; -} -.icon-qrcode:before { - content: "\f029"; -} -.icon-barcode:before { - content: "\f02a"; -} -.icon-tag:before { - content: "\f02b"; -} -.icon-tags:before { - content: "\f02c"; -} -.icon-book:before { - content: "\f02d"; -} -.icon-bookmark:before { - content: "\f02e"; -} -.icon-print:before { - content: "\f02f"; -} -.icon-camera:before { - content: "\f030"; -} -.icon-font:before { - content: "\f031"; -} -.icon-bold:before { - content: "\f032"; -} -.icon-italic:before { - content: "\f033"; -} -.icon-text-height:before { - content: "\f034"; -} -.icon-text-width:before { - content: "\f035"; -} -.icon-align-left:before { - content: "\f036"; -} -.icon-align-center:before { - content: "\f037"; -} -.icon-align-right:before { - content: "\f038"; -} -.icon-align-justify:before { - content: "\f039"; -} -.icon-list:before { - content: "\f03a"; -} -.icon-indent-left:before { - content: "\f03b"; -} -.icon-indent-right:before { - content: "\f03c"; -} -.icon-facetime-video:before { - content: "\f03d"; -} -.icon-picture:before { - content: "\f03e"; -} -.icon-pencil:before { - content: "\f040"; -} -.icon-map-marker:before { - content: "\f041"; -} -.icon-adjust:before { - content: "\f042"; -} -.icon-tint:before { - content: "\f043"; -} -.icon-edit:before { - content: "\f044"; -} -.icon-share:before { - content: "\f045"; -} -.icon-check:before { - content: "\f046"; -} -.icon-move:before { - content: "\f047"; -} -.icon-step-backward:before { - content: "\f048"; -} -.icon-fast-backward:before { - content: "\f049"; -} -.icon-backward:before { - content: "\f04a"; -} -.icon-play:before { - content: "\f04b"; -} -.icon-pause:before { - content: "\f04c"; -} -.icon-stop:before { - content: "\f04d"; -} -.icon-forward:before { - content: "\f04e"; -} -.icon-fast-forward:before { - content: "\f050"; -} -.icon-step-forward:before { - content: "\f051"; -} -.icon-eject:before { - content: "\f052"; -} -.icon-chevron-left:before { - content: "\f053"; -} -.icon-chevron-right:before { - content: "\f054"; -} -.icon-plus-sign:before { - content: "\f055"; -} -.icon-minus-sign:before { - content: "\f056"; -} -.icon-remove-sign:before { - content: "\f057"; -} -.icon-ok-sign:before { - content: "\f058"; -} -.icon-question-sign:before { - content: "\f059"; -} -.icon-info-sign:before { - content: "\f05a"; -} -.icon-screenshot:before { - content: "\f05b"; -} -.icon-remove-circle:before { - content: "\f05c"; -} -.icon-ok-circle:before { - content: "\f05d"; -} -.icon-ban-circle:before { - content: "\f05e"; -} -.icon-arrow-left:before { - content: "\f060"; -} -.icon-arrow-right:before { - content: "\f061"; -} -.icon-arrow-up:before { - content: "\f062"; -} -.icon-arrow-down:before { - content: "\f063"; -} -.icon-share-alt:before { - content: "\f064"; -} -.icon-resize-full:before { - content: "\f065"; -} -.icon-resize-small:before { - content: "\f066"; -} -.icon-plus:before { - content: "\f067"; -} -.icon-minus:before { - content: "\f068"; -} -.icon-asterisk:before { - content: "\f069"; -} -.icon-exclamation-sign:before { - content: "\f06a"; -} -.icon-gift:before { - content: "\f06b"; -} -.icon-leaf:before { - content: "\f06c"; -} -.icon-fire:before { - content: "\f06d"; -} -.icon-eye-open:before { - content: "\f06e"; -} -.icon-eye-close:before { - content: "\f070"; -} -.icon-warning-sign:before { - content: "\f071"; -} -.icon-plane:before { - content: "\f072"; -} -.icon-calendar:before { - content: "\f073"; -} -.icon-random:before { - content: "\f074"; -} -.icon-comment:before { - content: "\f075"; -} -.icon-magnet:before { - content: "\f076"; -} -.icon-chevron-up:before { - content: "\f077"; -} -.icon-chevron-down:before { - content: "\f078"; -} -.icon-retweet:before { - content: "\f079"; -} -.icon-shopping-cart:before { - content: "\f07a"; -} -.icon-folder-close:before { - content: "\f07b"; -} -.icon-folder-open:before { - content: "\f07c"; -} -.icon-resize-vertical:before { - content: "\f07d"; -} -.icon-resize-horizontal:before { - content: "\f07e"; -} -.icon-bar-chart:before { - content: "\f080"; -} -.icon-twitter-sign:before { - content: "\f081"; -} -.icon-facebook-sign:before { - content: "\f082"; -} -.icon-camera-retro:before { - content: "\f083"; -} -.icon-key:before { - content: "\f084"; -} -.icon-cogs:before { - content: "\f085"; -} -.icon-comments:before { - content: "\f086"; -} -.icon-thumbs-up:before { - content: "\f087"; -} -.icon-thumbs-down:before { - content: "\f088"; -} -.icon-star-half:before { - content: "\f089"; -} -.icon-heart-empty:before { - content: "\f08a"; -} -.icon-signout:before { - content: "\f08b"; -} -.icon-linkedin-sign:before { - content: "\f08c"; -} -.icon-pushpin:before { - content: "\f08d"; -} -.icon-external-link:before { - content: "\f08e"; -} -.icon-signin:before { - content: "\f090"; -} -.icon-trophy:before { - content: "\f091"; -} -.icon-github-sign:before { - content: "\f092"; -} -.icon-upload-alt:before { - content: "\f093"; -} -.icon-lemon:before { - content: "\f094"; -} -.icon-phone:before { - content: "\f095"; -} -.icon-check-empty:before { - content: "\f096"; -} -.icon-bookmark-empty:before { - content: "\f097"; -} -.icon-phone-sign:before { - content: "\f098"; -} -.icon-twitter:before { - content: "\f099"; -} -.icon-facebook:before { - content: "\f09a"; -} -.icon-github:before { - content: "\f09b"; -} -.icon-unlock:before { - content: "\f09c"; -} -.icon-credit-card:before { - content: "\f09d"; -} -.icon-rss:before { - content: "\f09e"; -} -.icon-hdd:before { - content: "\f0a0"; -} -.icon-bullhorn:before { - content: "\f0a1"; -} -.icon-bell:before { - content: "\f0a2"; -} -.icon-certificate:before { - content: "\f0a3"; -} -.icon-hand-right:before { - content: "\f0a4"; -} -.icon-hand-left:before { - content: "\f0a5"; -} -.icon-hand-up:before { - content: "\f0a6"; -} -.icon-hand-down:before { - content: "\f0a7"; -} -.icon-circle-arrow-left:before { - content: "\f0a8"; -} -.icon-circle-arrow-right:before { - content: "\f0a9"; -} -.icon-circle-arrow-up:before { - content: "\f0aa"; -} -.icon-circle-arrow-down:before { - content: "\f0ab"; -} -.icon-globe:before { - content: "\f0ac"; -} -.icon-wrench:before { - content: "\f0ad"; -} -.icon-tasks:before { - content: "\f0ae"; -} -.icon-filter:before { - content: "\f0b0"; -} -.icon-briefcase:before { - content: "\f0b1"; -} -.icon-fullscreen:before { - content: "\f0b2"; -} -.icon-group:before { - content: "\f0c0"; -} -.icon-link:before { - content: "\f0c1"; -} -.icon-cloud:before { - content: "\f0c2"; -} -.icon-beaker:before { - content: "\f0c3"; -} -.icon-cut:before { - content: "\f0c4"; -} -.icon-copy:before { - content: "\f0c5"; -} -.icon-paper-clip:before { - content: "\f0c6"; -} -.icon-save:before { - content: "\f0c7"; -} -.icon-sign-blank:before { - content: "\f0c8"; -} -.icon-reorder:before { - content: "\f0c9"; -} -.icon-list-ul:before { - content: "\f0ca"; -} -.icon-list-ol:before { - content: "\f0cb"; -} -.icon-strikethrough:before { - content: "\f0cc"; -} -.icon-underline:before { - content: "\f0cd"; -} -.icon-table:before { - content: "\f0ce"; -} -.icon-magic:before { - content: "\f0d0"; -} -.icon-truck:before { - content: "\f0d1"; -} -.icon-pinterest:before { - content: "\f0d2"; -} -.icon-pinterest-sign:before { - content: "\f0d3"; -} -.icon-google-plus-sign:before { - content: "\f0d4"; -} -.icon-google-plus:before { - content: "\f0d5"; -} -.icon-money:before { - content: "\f0d6"; -} -.icon-caret-down:before { - content: "\f0d7"; -} -.icon-caret-up:before { - content: "\f0d8"; -} -.icon-caret-left:before { - content: "\f0d9"; -} -.icon-caret-right:before { - content: "\f0da"; -} -.icon-columns:before { - content: "\f0db"; -} -.icon-sort:before { - content: "\f0dc"; -} -.icon-sort-down:before { - content: "\f0dd"; -} -.icon-sort-up:before { - content: "\f0de"; -} -.icon-envelope-alt:before { - content: "\f0e0"; -} -.icon-linkedin:before { - content: "\f0e1"; -} -.icon-undo:before { - content: "\f0e2"; -} -.icon-legal:before { - content: "\f0e3"; -} -.icon-dashboard:before { - content: "\f0e4"; -} -.icon-comment-alt:before { - content: "\f0e5"; -} -.icon-comments-alt:before { - content: "\f0e6"; -} -.icon-bolt:before { - content: "\f0e7"; -} -.icon-sitemap:before { - content: "\f0e8"; -} -.icon-umbrella:before { - content: "\f0e9"; -} -.icon-paste:before { - content: "\f0ea"; -} -.icon-user-md:before { - content: "\f200"; -} -#overview { - padding-top: 60px; -} -#new-icons, -#all-icons, -#examples, -#integration, -#code, -#roadmap { - padding-top: 40px; -} -.navbar .brand { - padding: 11px 20px 9px; - color: #ffffff; -} -.navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar .nav > li > a { - padding: 12px 10px 9px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: museo-slab, "Helvetica Neue", Helvetica, Arial, sans-serif; -} -#iconCarousel { - float: right; - width: 267.5px; - height: 206.25px; - margin-right: 10px; - margin-top: -20px; - font-size: 275px; - text-align: center; - text-shadow: 2px 2px 3px #222222; -} -#iconCarousel a { - color: #ffffff; -} -#iconCarousel .carousel-control { - top: 280px; - width: 23px; - height: 23px; - border-width: 3px; - font-size: 17px; - line-height: 28px; - left: 100.66666666666667px; -} -#iconCarousel .carousel-control.right { - left: auto; - right: 100.66666666666667px; -} -.hero-unit { - margin-bottom: 20px; - -webkit-border-radius: 20px; - -moz-border-radius: 20px; - border-radius: 20px; - background-color: #9d261d; - text-shadow: 2px 2px 2px #333333; -} -.hero-unit, -.hero-unit h1 { - color: #ffffff; -} -.hero-unit h1 { - font-size: 70px; - letter-spacing: -1px; - line-height: 1.2; -} -.hero-unit p { - margin-top: 10px; - margin-bottom: 15px; - font-size: 28px; - line-height: 34px; -} -.hero-unit ul { - margin-left: 50px; -} -.hero-unit ul li { - font-size: 15px; - line-height: 30px; - text-shadow: 1px 1px 1px #333333; -} -.hero-unit ul li.icon-large:before { - text-indent: -2em; - vertical-align: baseline; -} -.hero-unit a { - color: #fffeb8; -} -.hero-unit .btn-large { - background-color: #e4e4e4; - background-image: -moz-linear-gradient(top, #ffffff, #bbbbbb); - background-image: -ms-linear-gradient(top, #ffffff, #bbbbbb); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#bbbbbb)); - background-image: -webkit-linear-gradient(top, #ffffff, #bbbbbb); - background-image: -o-linear-gradient(top, #ffffff, #bbbbbb); - background-image: linear-gradient(top, #ffffff, #bbbbbb); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#bbbbbb', GradientType=0); - border-color: #bbbbbb #bbbbbb #959595; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bbbbbb; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - font-family: museo-slab, "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #333333; - margin-top: 15px; - font-weight: bold; - font-size: 18px; - padding: 13px 22px; - padding-left: 68px; - margin-right: 10px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - position: relative; - text-align: left; -} -.hero-unit .btn-large:hover, -.hero-unit .btn-large:active, -.hero-unit .btn-large.active, -.hero-unit .btn-large.disabled, -.hero-unit .btn-large[disabled] { - background-color: #bbbbbb; - *background-color: #aeaeae; -} -.hero-unit .btn-large:active, -.hero-unit .btn-large.active { - background-color: #a2a2a2 \9; -} -.hero-unit .btn-large i { - position: absolute; - left: 22px; - font-size: 46px; -} -.hero-unit .btn-large.btn-github { - padding-left: 74px; -} -.hero-unit .hero-content { - width: 500px; - text-align: center; -} -.btn-primary, -.hero-unit .btn-primary { - background-color: #e7d785; - background-image: -moz-linear-gradient(top, #fffeb8, #c49c38); - background-image: -ms-linear-gradient(top, #fffeb8, #c49c38); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fffeb8), to(#c49c38)); - background-image: -webkit-linear-gradient(top, #fffeb8, #c49c38); - background-image: -o-linear-gradient(top, #fffeb8, #c49c38); - background-image: linear-gradient(top, #fffeb8, #c49c38); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffeb8', endColorstr='#c49c38', GradientType=0); - border-color: #c49c38 #c49c38 #896d27; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #c49c38; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - *background-color: #e7d785; - color: #333333; - text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25); -} -.btn-primary:hover, -.hero-unit .btn-primary:hover, -.btn-primary:active, -.hero-unit .btn-primary:active, -.btn-primary.active, -.hero-unit .btn-primary.active, -.btn-primary.disabled, -.hero-unit .btn-primary.disabled, -.btn-primary[disabled], -.hero-unit .btn-primary[disabled] { - background-color: #c49c38; - *background-color: #b08c32; -} -.btn-primary:active, -.hero-unit .btn-primary:active, -.btn-primary.active, -.hero-unit .btn-primary.active { - background-color: #9c7c2d \9; -} -.btn-primary:hover, -.hero-unit .btn-primary:hover { - text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25); - color: #333333; -} -#social-buttons { - margin-bottom: 30px; - text-align: center; -} -#social-buttons .btn { - font-family: museo-slab, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: bold; - font-size: 14px; - padding: 4px 10px 1px; - line-height: 21px; -} -#social-buttons .count.btn { - font-family: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: normal; - background-color: #ffffff; - background-image: -moz-linear-gradient(top, #ffffff, #ffffff); - background-image: -ms-linear-gradient(top, #ffffff, #ffffff); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff)); - background-image: -webkit-linear-gradient(top, #ffffff, #ffffff); - background-image: -o-linear-gradient(top, #ffffff, #ffffff); - background-image: linear-gradient(top, #ffffff, #ffffff); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ffffff', GradientType=0); - border-color: #ffffff #ffffff #d9d9d9; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #ffffff; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -#social-buttons .count.btn:hover, -#social-buttons .count.btn:active, -#social-buttons .count.btn.active, -#social-buttons .count.btn.disabled, -#social-buttons .count.btn[disabled] { - background-color: #ffffff; - *background-color: #f2f2f2; -} -#social-buttons .count.btn:active, -#social-buttons .count.btn.active { - background-color: #e6e6e6 \9; -} -#social-buttons .watch, -#social-buttons .fork { - margin-right: 30px; -} -.the-icons { - list-style-type: none; - margin-left: 0; -} -.the-icons li { - cursor: pointer; - line-height: 42px; - height: 42px; - padding-left: 12px; - -webkit-border-radius: 12px; - -moz-border-radius: 12px; - border-radius: 12px; -} -.the-icons li [class^="icon-"], -.the-icons li [class*=" icon-"] { - width: 32px; - font-size: 16px; -} -.the-icons li:hover { - background-color: #fbf4f4; -} -.the-icons li:hover [class^="icon-"], -.the-icons li:hover [class*=" icon-"] { - *font-size: 24px; - *vertical-align: middle; -} -.the-icons li:hover [class^="icon-"]:before, -.the-icons li:hover [class*=" icon-"]:before { - font-size: 24px; - vertical-align: middle; -} -#all-icons h3, -#new-icons h3 { - margin-top: 10px; -} -#why .row { - margin-bottom: 20px; -} -#why .icon-large { - font-size: 22px; - text-align: center; - padding-right: 4px; -} -#examples .btn-toolbar { - margin-top: 0; - margin-bottom: 20px; -} -#integration .row { - margin-bottom: 40px; -} -#examples form, -#code form { - margin-bottom: 25px; -} -#examples form input, -#code form input { - line-height: 1; -} -#examples .rating, -#code .rating { - unicode-bidi: bidi-override; - direction: rtl; - font-size: 30px; -} -#examples .rating span.star, -#code .rating span.star { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - display: inline-block; -} -#examples .rating span.star:hover, -#code .rating span.star:hover { - cursor: pointer; -} -#examples .rating span.star:before, -#code .rating span.star:before { - content: "\f006"; - padding-right: 5px; - color: #999999; -} -#examples .rating span.star:hover:before, -#code .rating span.star:hover:before, -#examples .rating span.star:hover ~ span.star:before, -#code .rating span.star:hover ~ span.star:before { - content: "\f005"; - color: #e3cf7a; -} -.modal { - width: 560px; - max-height: 600px; -} -.modal .modal-body { - *overflow: hidden; - max-height: none; - padding-bottom: 0; -} -.modal .modal-body .row { - margin-bottom: 15px; -} -.modal .modal-body div.thumbnail { - text-align: center; -} -.modal .modal-body div.thumbnail div { - margin-bottom: 5px; -} -.modal .modal-body .icon6 { - width: 325px; -} -.modal .modal-body .icon6 > div.thumbnail > div { - line-height: 340px; - height: 323px; - text-align: center; -} -.modal .modal-body .icon6 > div.thumbnail > div i { - font-size: 340px; -} -.modal .modal-body .icon5 { - width: 185px; -} -.modal .modal-body .icon5 > div.thumbnail > div { - line-height: 180px; - height: 171px; - text-align: center; -} -.modal .modal-body .icon5 > div.thumbnail > div i { - font-size: 180px; -} -.modal .modal-body .icon4 { - width: 215px; -} -.modal .modal-body .icon4 > div.thumbnail > div { - line-height: 100px; - height: 95px; - text-align: center; -} -.modal .modal-body .icon4 > div.thumbnail > div i { - font-size: 100px; -} -.modal .modal-body .icon3 { - width: 120px; -} -.modal .modal-body .icon3 > div.thumbnail > div { - line-height: 50px; - height: 47.5px; - text-align: center; -} -.modal .modal-body .icon3 > div.thumbnail > div i { - font-size: 50px; -} -.modal .modal-body .icon2 { - width: 75px; -} -.modal .modal-body .icon2 > div.thumbnail > div { - line-height: 20px; - height: 19px; - text-align: center; -} -.modal .modal-body .icon2 > div.thumbnail > div i { - font-size: 20px; -} -.modal .modal-body .icon1 { - width: 60px; -} -.modal .modal-body .icon1 > div.thumbnail > div { - line-height: 12px; - height: 11.399999999999999px; - text-align: center; -} -.modal .modal-body .icon1 > div.thumbnail > div i { - font-size: 12px; -} -.label, -.badge { - background-color: #eeeeee; -} -footer { - color: #555555; - border-top: 1px solid #eeeeee; - margin-top: 60px; - padding-top: 20px; - padding-bottom: 60px; - *zoom: 1; -} -footer ul { - margin-left: 30px; - line-height: 25px; -} diff --git a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.eot b/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.eot deleted file mode 100755 index 89070c1..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.eot and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.svg b/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.svg deleted file mode 100755 index 1245f92..0000000 --- a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.svg +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.ttf b/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.ttf deleted file mode 100755 index c17e9f8..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.ttf and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.woff b/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.woff deleted file mode 100755 index 09f2469..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/fontawesome-webfont.woff and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.eot b/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.eot deleted file mode 100755 index 3324999..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.eot and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.ttf b/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.ttf deleted file mode 100755 index 9248b9a..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/museo_slab_300-webfont.ttf and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.eot b/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.eot deleted file mode 100755 index 2eb7a89..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.eot and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.ttf b/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.ttf deleted file mode 100755 index bf78a2a..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/museo_slab_500-webfont.ttf and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.eot b/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.eot deleted file mode 100755 index 1f28b41..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.eot and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.ttf b/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.ttf deleted file mode 100755 index e9aa413..0000000 Binary files a/sources/libs/font-awesome/docs/assets/font/proximanova-webfont.ttf and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/ico/favicon.ico b/sources/libs/font-awesome/docs/assets/ico/favicon.ico deleted file mode 100644 index 742243e..0000000 Binary files a/sources/libs/font-awesome/docs/assets/ico/favicon.ico and /dev/null differ diff --git a/sources/libs/font-awesome/docs/assets/js/backbone.min.js b/sources/libs/font-awesome/docs/assets/js/backbone.min.js deleted file mode 100644 index 5846b32..0000000 --- a/sources/libs/font-awesome/docs/assets/js/backbone.min.js +++ /dev/null @@ -1,37 +0,0 @@ -// Backbone.js 0.9.1 - -// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://backbonejs.org -(function(){var i=this,r=i.Backbone,s=Array.prototype.slice,t=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:i.Backbone={};g.VERSION="0.9.1";var f=i._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var h=i.jQuery||i.Zepto||i.ender;g.setDomLibrary=function(a){h=a};g.noConflict=function(){i.Backbone=r;return this};g.emulateHTTP=!1;g.emulateJSON=!1;g.Events={on:function(a,b,c){for(var d,a=a.split(/\s+/),e=this._callbacks||(this._callbacks={});d=a.shift();){d=e[d]||(e[d]= -{});var f=d.tail||(d.tail=d.next={});f.callback=b;f.context=c;d.tail=f.next={}}return this},off:function(a,b,c){var d,e,f;if(a){if(e=this._callbacks)for(a=a.split(/\s+/);d=a.shift();)if(f=e[d],delete e[d],b&&f)for(;(f=f.next)&&f.next;)if(!(f.callback===b&&(!c||f.context===c)))this.on(d,f.callback,f.context)}else delete this._callbacks;return this},trigger:function(a){var b,c,d,e;if(!(d=this._callbacks))return this;e=d.all;for((a=a.split(/\s+/)).push(null);b=a.shift();)e&&a.push({next:e.next,tail:e.tail, -event:b}),(c=d[b])&&a.push({next:c.next,tail:c.tail});for(e=s.call(arguments,1);c=a.pop();){b=c.tail;for(d=c.event?[c.event].concat(e):e;(c=c.next)!==b;)c.callback.apply(c.context||this,d)}return this}};g.Events.bind=g.Events.on;g.Events.unbind=g.Events.off;g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=j(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");if(!this.set(a, -{silent:!0}))throw Error("Can't create an invalid model");delete this._changed;this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(g.Model.prototype,g.Events,{idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.attributes[a];return this._escapedAttributes[a]=f.escape(null==b?"":""+b)},has:function(a){return null!= -this.attributes[a]},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof g.Model&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=this.attributes,k=this._escapedAttributes,n=this._previousAttributes||{},h=this._setting;this._changed||(this._changed={});this._setting=!0;for(e in d)if(a=d[e],f.isEqual(b[e],a)||delete k[e],c.unset?delete b[e]:b[e]= -a,this._changing&&!f.isEqual(this._changed[e],a)&&(this.trigger("change:"+e,this,a,c),this._moreChanges=!0),delete this._changed[e],!f.isEqual(n[e],a)||f.has(b,e)!=f.has(n,e))this._changed[e]=a;h||(!c.silent&&this.hasChanged()&&this.change(c),this._setting=!1);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d, -e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};c.wait&&(e=f.clone(this.attributes));a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var k=this,h=c.success;c.success=function(a,b,e){b=k.parse(a,e);c.wait&&(b=f.extend(d||{},b));if(!k.set(b,c))return!1;h?h(k,a):k.trigger("sync",k,a,c)};c.error=g.wrapError(c.error, -k,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d();a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=j(this.collection,"url")||j(this,"urlRoot")||o();return this.isNew()? -a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){if(this._changing||!this.hasChanged())return this;this._moreChanges=this._changing=!0;for(var b in this._changed)this.trigger("change:"+b,this,this._changed[b],a);for(;this._moreChanges;)this._moreChanges=!1,this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes); -delete this._changed;this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this._changed):this._changed&&f.has(this._changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this._changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)}, -isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});g.Collection=function(a,b){b||(b={});b.comparator&&(this.comparator=b.comparator);this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(g.Collection.prototype,g.Events,{model:g.Model,initialize:function(){}, -toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){var c,d,e,g,h,i={},j={};b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c=b))this.iframe=h(''),d.bgiframe.appendTo(e),e.bind("tooltipmove"+f,c.adjust)},adjust:function(){var a=b.get("dimensions"),c=b.plugins.tip,f=d.tip,g,h;h=parseInt(e.css("border-left-width"),10)||0,h={left:-h,top:-h},c&&f&&(g=c.corner.precedance==="x"?["width","left"]:["height","top"],h[g[1]]-=f[g[0]]()),d.bgiframe.css(h).css(a)},destroy:function(){d.bgiframe.remove(),e.unbind(f)}}),c.init()}"use strict";var b=!0,c=!1,d=null,e="x",f="y",g="width",h="height",i="top",j="left",k="bottom",l="right",m="center",n="flip",o="flipinvert",p="shift",q,r,s,t={},u="ui-tooltip",v="ui-widget",w="ui-state-disabled",x="div.qtip."+u,y=u+"-default",z=u+"-focus",A=u+"-hover",B=u+"-fluid",C="-31000px",D="_replacedByqTip",E="oldtitle",F;q=a.fn.qtip=function(e,f,g){var h=(""+e).toLowerCase(),i=d,j=a.makeArray(arguments).slice(1),k=j[j.length-1],l=this[0]?a.data(this[0],"qtip"):d;if(!arguments.length&&l||h==="api")return l;if("string"==typeof e)return this.each(function(){var d=a.data(this,"qtip");if(!d)return b;k&&k.timeStamp&&(d.cache.event=k);if(h!=="option"&&h!=="options"||!f)d[h]&&d[h].apply(d[h],j);else if(a.isPlainObject(f)||g!==undefined)d.set(f,g);else return i=d.get(f),c}),i!==d?i:this;if("object"==typeof e||!arguments.length)return l=H(a.extend(b,{},e)),q.bind.call(this,l,k)},q.bind=function(d,e){return this.each(function(f){function m(b){function d(){k.render(typeof b=="object"||g.show.ready),h.show.add(h.hide).unbind(j)}if(k.cache.disabled)return c;k.cache.event=a.extend({},b),k.cache.target=b?a(b.target):[undefined],g.show.delay>0?(clearTimeout(k.timers.show),k.timers.show=setTimeout(d,g.show.delay),i.show!==i.hide&&h.hide.bind(i.hide,function(){clearTimeout(k.timers.show)})):d()}var g,h,i,j,k,l;l=a.isArray(d.id)?d.id[f]:d.id,l=!l||l===c||l.length<1||t[l]?q.nextid++:t[l]=l,j=".qtip-"+l+"-create",k=J.call(this,l,d);if(k===c)return b;g=k.options,a.each(r,function(){this.initialize==="initialize"&&this(k)}),h={show:g.show.target,hide:g.hide.target},i={show:a.trim(""+g.show.event).replace(/ /g,j+" ")+j,hide:a.trim(""+g.hide.event).replace(/ /g,j+" ")+j},/mouse(over|enter)/i.test(i.show)&&!/mouse(out|leave)/i.test(i.hide)&&(i.hide+=" mouseleave"+j),h.show.bind("mousemove"+j,function(a){s={pageX:a.pageX,pageY:a.pageY,type:"mousemove"},k.cache.onTarget=b}),h.show.bind(i.show,m),(g.show.ready||g.prerender)&&m(e)})},r=q.plugins={Corner:function(a){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,m).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase();var b=a.charAt(0);this.precedance=b==="t"||b==="b"?f:e,this.string=function(){return this.precedance===f?this.y+this.x:this.x+this.y},this.abbrev=function(){var a=this.x.substr(0,1),b=this.y.substr(0,1);return a===b?a:this.precedance===f?b+a:a+b},this.invertx=function(a){this.x=this.x===j?l:this.x===l?j:a||this.x},this.inverty=function(a){this.y=this.y===i?k:this.y===k?i:a||this.y},this.clone=function(){return{x:this.x,y:this.y,precedance:this.precedance,string:this.string,abbrev:this.abbrev,clone:this.clone,invertx:this.invertx,inverty:this.inverty}}},offset:function(b,c){function j(a,b){d.left+=b*a.scrollLeft(),d.top+=b*a.scrollTop()}var d=b.offset(),e=b.closest("body")[0],f=c,g,h,i;if(f){do f.css("position")!=="static"&&(h=f.position(),d.left-=h.left+(parseInt(f.css("borderLeftWidth"),10)||0)+(parseInt(f.css("marginLeft"),10)||0),d.top-=h.top+(parseInt(f.css("borderTopWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0),!g&&(i=f.css("overflow"))!=="hidden"&&i!=="visible"&&(g=f));while((f=a(f[0].offsetParent)).length);g&&g[0]!==e&&j(g,1)}return d},iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||c,fn:{attr:function(b,c){if(this.length){var d=this[0],e="title",f=a.data(d,"qtip");if(b===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?a.attr(d,E):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",c),this.attr(E,c))}return a.fn["attr"+D].apply(this,arguments)},clone:function(b){var c=a([]),d="title",e=a.fn["clone"+D].apply(this,arguments);return b||e.filter("["+E+"]").attr("title",function(){return a.attr(this,E)}).removeAttr(E),e}}},a.each(r.fn,function(c,d){if(!d||a.fn[c+D])return b;var e=a.fn[c+D]=a.fn[c];a.fn[c]=function(){return d.apply(this,arguments)||e.apply(this,arguments)}}),a.ui||(a["cleanData"+D]=a.cleanData,a.cleanData=function(b){for(var c=0,d;(d=b[c])!==undefined;c++)try{a(d).triggerHandler("removeqtip")}catch(e){}a["cleanData"+D](b)}),q.version="@VERSION",q.nextid=0,q.inactiveEvents="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),q.zindex=15e3,q.defaults={prerender:c,id:c,overwrite:b,suppress:b,content:{text:b,attr:"title",title:{text:c,button:c}},position:{my:"top left",at:"bottom right",target:c,container:c,viewport:c,adjust:{x:0,y:0,mouse:b,resize:b,method:"flip flip"},effect:function(b,d,e){a(this).animate(d,{duration:200,queue:c})}},show:{target:c,event:"mouseenter",effect:b,delay:90,solo:c,ready:c,autofocus:c},hide:{target:c,event:"mouseleave",effect:b,delay:0,fixed:c,inactive:c,leave:"window",distance:c},style:{classes:"",widget:c,width:c,height:c,def:b},events:{render:d,move:d,show:d,hide:d,toggle:d,visible:d,hidden:d,focus:d,blur:d}},r.svg=function(b,c,d,e){var f=a(document),g=c[0],h={width:0,height:0,position:{top:1e10,left:1e10}},i,j,k,l,m;while(!g.getBBox)g=g.parentNode;if(g.getBBox&&g.parentNode){i=g.getBBox(),j=g.getScreenCTM(),k=g.farthestViewportElement||g;if(!k.createSVGPoint)return h;l=k.createSVGPoint(),l.x=i.x,l.y=i.y,m=l.matrixTransform(j),h.position.left=m.x,h.position.top=m.y,l.x+=i.width,l.y+=i.height,m=l.matrixTransform(j),h.width=m.x-h.position.left,h.height=m.y-h.position.top,h.position.left+=f.scrollLeft(),h.position.top+=f.scrollTop()}return h},r.ajax=function(a){var b=a.plugins.ajax;return"object"==typeof b?b:a.plugins.ajax=new K(a)},r.ajax.initialize="render",r.ajax.sanitize=function(a){var b=a.content,c;b&&"ajax"in b&&(c=b.ajax,typeof c!="object"&&(c=a.content.ajax={url:c}),"boolean"!=typeof c.once&&c.once&&(c.once=!!c.once))},a.extend(b,q.defaults,{content:{ajax:{loading:b,once:b}}}),r.tip=function(a){var b=a.plugins.tip;return"object"==typeof b?b:a.plugins.tip=new M(a)},r.tip.initialize="render",r.tip.sanitize=function(a){var c=a.style,d;c&&"tip"in c&&(d=a.style.tip,typeof d!="object"&&(a.style.tip={corner:d}),/string|boolean/i.test(typeof d.corner)||(d.corner=b),typeof d.width!="number"&&delete d.width,typeof d.height!="number"&&delete d.height,typeof d.border!="number"&&d.border!==b&&delete d.border,typeof d.offset!="number"&&delete d.offset)},a.extend(b,q.defaults,{style:{tip:{corner:b,mimic:c,width:6,height:6,border:b,offset:0}}}),r.modal=function(a){var b=a.plugins.modal;return"object"==typeof b?b:a.plugins.modal=new N(a)},r.modal.initialize="render",r.modal.sanitize=function(a){a.show&&(typeof a.show.modal!="object"?a.show.modal={on:!!a.show.modal}:typeof a.show.modal.on=="undefined"&&(a.show.modal.on=b))},r.modal.zindex=q.zindex-200,r.modal.focusable=["a[href]","area[href]","input","select","textarea","button","iframe","object","embed","[tabindex]","[contenteditable]"],a.extend(b,q.defaults,{show:{modal:{on:c,effect:b,blur:b,stealfocus:b,escape:b}}}),r.viewport=function(a,b,c,d,n,q,r){function J(a,c,d,e,f,g,h,i,j){var k=b[f],l=v[a],n=w[a],q=d===p,r=-C.offset[f]+B.offset[f]+B["scroll"+f],s=l===f?j:l===g?-j:-j/2,t=n===f?i:n===g?-i:-i/2,u=E&&E.size?E.size[h]||0:0,x=E&&E.corner&&E.corner.precedance===a&&!q?u:0,y=r-k+x,z=k+j-B[h]-r+x,A=s-(v.precedance===a||l===v[c]?t:0)-(n===m?i/2:0);return q?(x=E&&E.corner&&E.corner.precedance===c?u:0,A=(l===f?1:-1)*s-x,b[f]+=y>0?y:z>0?-z:0,b[f]=Math.max(-C.offset[f]+B.offset[f]+(x&&E.corner[a]===m?E.offset:0),k-A,Math.min(Math.max(-C.offset[f]+B.offset[f]+B[h],k+A),b[f]))):(e*=d===o?2:0,y>0&&(l!==f||z>0)?(b[f]-=A+e,H["invert"+a](f)):z>0&&(l!==g||y>0)&&(b[f]-=(l===m?-A:A)+e,H["invert"+a](g)),b[f]z&&(b[f]=k,H=undefined)),b[f]-k}var s=c.target,t=a.elements.tooltip,v=c.my,w=c.at,x=c.adjust,y=x.method.split(" "),z=y[0],A=y[1]||y[0],B=c.viewport,C=c.container,D=a.cache,E=a.plugins.tip,F={left:0,top:0},G,H,I;if(!B.jquery||s[0]===window||s[0]===document.body||x.method==="none")return F;G=t.css("position")==="fixed",B={elem:B,height:B[(B[0]===window?"h":"outerH")+"eight"](),width:B[(B[0]===window?"w":"outerW")+"idth"](),scrollleft:G?0:B.scrollLeft(),scrolltop:G?0:B.scrollTop(),offset:B.offset()||{left:0,top:0}},C={elem:C,scrollLeft:C.scrollLeft(),scrollTop:C.scrollTop(),offset:C.offset()||{left:0,top:0}};if(z!=="shift"||A!=="shift")H=v.clone();return F={left:z!=="none"?J(e,f,z,x.x,j,l,g,d,q):0,top:A!=="none"?J(f,e,A,x.y,i,k,h,n,r):0},H&&D.lastClass!==(I=u+"-pos-"+H.abbrev())&&t.removeClass(a.cache.lastClass).addClass(a.cache.lastClass=I),F},r.imagemap=function(b,c,d,e){function v(a,b,c){var d=0,e=1,f=1,g=0,h=0,n=a.width,o=a.height;while(n>0&&o>0&&e>0&&f>0){n=Math.floor(n/2),o=Math.floor(o/2),c.x===j?e=n:c.x===l?e=a.width-n:e+=Math.floor(n/2),c.y===i?f=o:c.y===k?f=a.height-o:f+=Math.floor(o/2),d=b.length;while(d--){if(b.length<2)break;g=b[d][0]-a.position.left,h=b[d][1]-a.position.top,(c.x===j&&g>=e||c.x===l&&g<=e||c.x===m&&(ga.width-e)||c.y===i&&h>=f||c.y===k&&h<=f||c.y===m&&(ha.height-f))&&b.splice(d,1)}}return{left:b[0][0],top:b[0][1]}}c.jquery||(c=a(c));var f=b.cache.areas={},g=(c[0].shape||c.attr("shape")).toLowerCase(),h=c[0].coords||c.attr("coords"),n=h.split(","),o=[],p=a('img[usemap="#'+c.parent("map").attr("name")+'"]'),q=p.offset(),r={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10}},s=0,t=0,u;q.left+=Math.ceil((p.outerWidth()-p.width())/2),q.top+=Math.ceil((p.outerHeight()-p.height())/2);if(g==="poly"){s=n.length;while(s--)t=[parseInt(n[--s],10),parseInt(n[s+1],10)],t[0]>r.position.right&&(r.position.right=t[0]),t[0]r.position.bottom&&(r.position.bottom=t[1]),t[1]=1?"rgb("+[b.r,b.g,b.b].join(",")+")":"rgba("+[b.r,b.g,b.b,b.a].join(",")+")"};b.normalize=function(){function a(b,c,d){return cd?d:c}b.r=a(0,parseInt(b.r),255);b.g=a(0,parseInt(b.g), -255);b.b=a(0,parseInt(b.b),255);b.a=a(0,b.a,1);return b};b.clone=function(){return e.color.make(b.r,b.b,b.g,b.a)};return b.normalize()};e.color.extract=function(c,a){var d;do{d=c.css(a).toLowerCase();if(d!=""&&d!="transparent")break;c=c.parent()}while(!e.nodeName(c.get(0),"body"));d=="rgba(0, 0, 0, 0)"&&(d="transparent");return e.color.parse(d)};e.color.parse=function(c){var a,d=e.color.make;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return d(parseInt(a[1],10), -parseInt(a[2],10),parseInt(a[3],10));if(a=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c))return d(parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10),parseFloat(a[4]));if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return d(parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55);if(a=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c))return d(parseFloat(a[1])* -2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55,parseFloat(a[4]));if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return d(parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16));if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return d(parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16));c=e.trim(c).toLowerCase();return c=="transparent"?d(255,255,255,0):(a=g[c]||[0,0,0],d(a[0],a[1],a[2]))};var g={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, -0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, -211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); -(function(a){function r(c,d,b){c.value=a(d).text();a(c).change();a.browser.msie||c.focus();b.hide()}function n(c,a){var b=c.getHours(),h=a.show24Hours?b:(b+11)%12+1,f=c.getMinutes();return(h<10?"0":"")+h+a.separator+((f<10?"0":"")+f)+(a.show24Hours?"":b<12?" AM":" PM")}function o(c,a){return typeof c=="object"?p(c):q(c,a)}function q(a,d){if(a){var b=a.split(d.separator),h=parseFloat(b[0]),b=parseFloat(b[1]);d.show24Hours||(h===12&&a.indexOf("AM")!==-1?h=0:h!==12&&a.indexOf("PM")!==-1&&(h+=12));return p(new Date(0, -0,0,h,b,0))}return null}function p(a){a.setFullYear(2001);a.setMonth(0);a.setDate(0);return a}a.fn.timePicker=function(c){var d=a.extend({},a.fn.timePicker.defaults,c);return this.each(function(){a.timePicker(this,d)})};a.timePicker=function(c,d){var b=a(c)[0];return b.timePicker||(b.timePicker=new jQuery._timePicker(b,d))};a.timePicker.version="0.3";a._timePicker=function(c,d){var b=false,h=false,f=o(d.startTime,d),s=o(d.endTime,d);a(c).attr("autocomplete","OFF");for(var l=[],j=new Date(f);j<=s;)l[l.length]= -n(j,d),j=new Date(j.setMinutes(j.getMinutes()+d.step));for(var e=a('
'),k=a("
    "),j=0;j"+l[j]+"");e.append(k);e.appendTo("body").hide();e.mouseover(function(){b=true}).mouseout(function(){b=false});a("li",k).mouseover(function(){h||(a("li.selected",e).removeClass("selected"),a(this).addClass("selected"))}).mousedown(function(){b=true}).click(function(){r(c,this,e,d);b=false});var m=function(){if(e.is(":visible"))return false; -a("li",e).removeClass("selected");var g=a(c).offset();e.css({top:g.top+c.offsetHeight,left:g.left});e.show();var b=c.value?q(c.value,d):f,g=f.getHours()*60+f.getMinutes(),b=b.getHours()*60+b.getMinutes()-g,b=Math.round(b/d.step),g=p(new Date(0,0,0,0,b*d.step+g,0)),g=f -f+e[0].offsetHeight)e[0].scrollTop=f+i.offsetHeight}else b.removeClass("selected"),a("li:first",k).addClass("selected"),e[0].scrollTop=0;return false;case 13:return e.is(":visible")&&(f=a("li.selected",k)[0],r(c,f,e,d)),false;case 27:return e.hide(),false}return true});a(c).keyup(function(){h=false});this.getTime=function(){return q(c.value,d)};this.setTime=function(b){c.value=n(o(b,d),d);a(c).change()}};a.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30, -0),separator:":",show24Hours:true}})(jQuery); -(function(g){g.cookie=function(h,b,a){if(arguments.length>1&&(!/Object/.test(Object.prototype.toString.call(b))||b===null||b===void 0)){a=g.extend({},a);if(b===null||b===void 0)a.expires=-1;if(typeof a.expires==="number"){var d=a.expires,c=a.expires=new Date;c.setDate(c.getDate()+d)}b=String(b);return document.cookie=[encodeURIComponent(h),"=",a.raw?b:encodeURIComponent(b),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure": -""].join("")}for(var a=b||{},d=a.raw?function(a){return a}:decodeURIComponent,c=document.cookie.split("; "),e=0,f;f=c[e]&&c[e].split("=");e++)if(d(f[0])===h)return d(f[1]||"");return null}})(jQuery); -$.fn.serializeObject=function(){var a={},b=this.find(":input").serializeArray();$.each(b,function(){if(this.value=="true")this.value=true;else if(this.value=="false")this.value=false;else if(this.value===void 0)this.value="";a[this.name]!==void 0?(a[this.name].push||(a[this.name]=[a[this.name]]),a[this.name].push(this.value)):a[this.name]=this.value});return a}; -function load_i18n_strings(){AgenDAVConf.i18n={};var a=$.ajax({async:false,url:base_app_url+"strings/load/"+agendav_version,dataType:"json",method:"GET",ifModified:false});a.done(function(a){AgenDAVConf.i18n=a;set_default_datepicker_options()});a.fail(function(){show_error("Error loading translation","Please, contact your system administrator")})} -function t(a,c,d){var b="["+a+":"+c+"]";if(typeof AgenDAVConf.i18n!="undefined"&&(a=="messages"||a=="labels"))a=="labels"&&AgenDAVConf.i18n.labels[c]?b=AgenDAVConf.i18n.labels[c]:a=="messages"&&AgenDAVConf.i18n.messages[c]&&(b=AgenDAVConf.i18n.messages[c]);for(var e in d)b=b.replace(e,d[e]);return b}function labels_as_array(a){if(!$.isArray(a))return[];for(var c=[],d=a.length,b=0;b\"\']/),o=/&/g,g= -//g,m=/\"/g,p=/\'/g;e.escapeHtml=function(a){return typeof a==="string"?!d.test(a)?a:a.replace(o,"&").replace(g,"<").replace(n,">").replace(m,""").replace(p,"'"):a};var q=/\\/g,r=/\r/g,s=/\u2028/g,t=/\u2029/g,u=/\n/g,v=/\f/g,w=/'/g,x=/"/g,y=/\t/g;e.escapeJs=function(a){return typeof a==="string"?a.replace(q,"\\\\").replace(x,'\\"').replace(w,"\\'").replace(r,"\\r").replace(s,"\\u2028").replace(t,"\\u2029").replace(u,"\\n").replace(v,"\\f").replace(y,"\\t"):a}})(dust); -if(typeof exports!=="undefined")dust.helpers=require("../dust-helpers/lib/dust-helpers").helpers,typeof process!=="undefined"&&require("./server")(dust),module.exports=dust; -(function(e){function i(b){b=b.current();return typeof b==="object"&&b.isSelect===true}function j(b,d,e,g,n){var g=g||{},m,j;if(g.key)m=h.tap(g.key,b,d);else if(i(d))m=d.current().selectKey,d.current().isResolved&&(n=function(){return false});else throw"No key specified for filter and no key found in context from select statement";j=h.tap(g.value,b,d);if(n(j,l(m,g.type,d))){if(i(d))d.current().isResolved=true;return b.render(e.block,d)}else if(e["else"])return b.render(e["else"],d);return b.write("")} -function l(b,d,e){if(b)switch(d||typeof b){case "number":return+b;case "string":return String(b);case "boolean":return Boolean(b);case "date":return new Date(b);case "context":return e.get(b)}return b}var k=typeof console!=="undefined"?console:{log:function(){}},h={sep:function(b,d,e){return d.stack.index===d.stack.of-1?b:e.block(b,d)},idx:function(b,d,e){return e.block(b,d.push(d.stack.index))},contextDump:function(b,d){k.log(JSON.stringify(d.stack));return b},tap:function(b,d,e){var g=b;typeof b=== -"function"&&(g="",d.tap(function(b){g+=b;return""}).render(b,e).untap(),g===""&&(g=false));return g},"if":function(b,d,e,g){if(g&&g.cond){g=g.cond;g=this.tap(g,b,d);if(eval(g))return b.render(e.block,d);if(e["else"])return b.render(e["else"],d)}else k.log("No condition given in the if helper!");return b},select:function(b,d,e,g){if(g&&g.key)return g=this.tap(g.key,b,d),b.render(e.block,d.push({isSelect:true,isResolved:false,selectKey:g}));else k.log("No key given in the select helper!");return b}, -eq:function(b,d,e,g){return j(b,d,e,g,function(b,d){return d===b})},lt:function(b,d,e,g){return j(b,d,e,g,function(b,d){return db})},gte:function(b,d,e,g){return j(b,d,e,g,function(b,d){return d>=b})},"default":function(b,d,e,g){return j(b,d,e,g,function(){return true})}};e.helpers=h})(typeof exports!=="undefined"?exports:getGlobal()); -(function(){function a(b,a){return b.write('
    ')}function e(b,a){return b.write('class="').reference(a.get("applyclass"), -a,"h").write('"')}function d(b,a){return b.write(' id="').reference(a.get("applyid"),a,"h").write('"')}dust.register("form_open",a);return a})(); -(function(){function a(a,h){return a.write(' ")}function e(a){return a.write(' selected="true"')}function d(a,b){return a.reference(b.get("write_access"),b,"h")}function b(a){return a.write(' selected="true"')}function f(a, -b){return a.reference(b.get("write_access"),b,"h")}dust.register("calendar_share_access_options",a);return a})();(function(){function a(a,d){return a.write('
    ').partial("form_open",d,{applyclass:"form-horizontal",applyid:"calendar_create_form"}).partial("calendar_basic_form_part",d,null).partial("form_close",d,null).write("
    ")}dust.register("calendar_create_dialog",a);return a})(); -(function(){function a(a){return a.write("
    ")}dust.register("form_close",a);return a})(); -(function(){function a(a,d){return a.write('
    ').partial("form_open",d,null).write('

    ').helper("i18n",d,{},{type:"messages",name:"info_confirmcaldelete"}).write('

    ').reference(d.get("displayname"),d,"h").write("

    ").helper("i18n",d,{},{type:"messages",name:"info_permanentremoval"}).write("

    ").partial("form_close", -d,null).write("
    ")}dust.register("calendar_delete_dialog",a);return a})(); -(function(){function a(a,f){return a.section(f.get("visible_reminders"),f,{block:e},null).write('').section(f.get("reminders"),f,{block:d},null).write('
    ').helper("i18n",f,{},{type:"messages",name:"info_noreminders"}).write('
    ').helper("i18n",f,{},{type:"labels",name:"newreminder"}).write('').partial("reminder_row", -f,{add:"true"}).write('
    ').helper("i18n",f,{},{type:"labels",name:"newreminder"}).write('').partial("reminder_row",f,{add:"true",is_absolute:"true"}).write("
    ")}function e(a,d){return a.write('')}function d(a,d){return a.partial("reminder_row",d,null)}dust.register("reminders_table",a);return a})(); -(function(){function a(a,b){return a.write('").section(b.get("share_with"),b,{block:e},null).write('
    ').helper("i18n",b,{},{type:"labels",name:"username"}).write("").helper("i18n",b,{},{type:"labels",name:"access"}).write("
    ').helper("i18n",b,{},{type:"messages",name:"info_notshared"}).write('
    ').helper("i18n", -b,{},{type:"labels",name:"sharewith"}).write('
    ').helper(
    ")}function e(a,b){return a.partial("calendar_share_row",b,null)}dust.register("calendar_share_table",a);return a})(); -(function(){function a(a,c){return a.write('

    ').reference(c.get("formatted_start"),c,"h").write(" ").reference(c.get("formatted_end"),c,"h").write('

    ').helper("i18n",c,{},{type:"labels",name:"calendar"}).write('
    ').reference(c.getPath(false,["caldata","displayname"]),c,"h").write("
    ").exists(c.get("location"), -c,{block:e},null).exists(c.get("description"),c,{block:d},null).exists(c.get("rrule"),c,{block:b},null).section(c.get("reminders"),c,{block:k},null).notexists(c.get("disable_actions"),c,{block:l},null).write("
    ")}function e(a,c){return a.write("
    ").helper("i18n",c,{},{type:"labels",name:"location"}).write("
    ").reference(c.get("location"),c,"h").write("
    ")}function d(a,c){return a.write("
    ").helper("i18n",c,{},{type:"labels",name:"description"}).write("
    ").reference(c.get("formatted_description"), -c,"h").write("
    ")}function b(a,c){return a.write("
    ").helper("i18n",c,{},{type:"labels",name:"repeat"}).write("
    ").exists(c.get("rrule_explained"),c,{"else":f,block:j},null)}function f(a,c){return a.write("
    ").helper("i18n",c,{},{type:"messages",name:"info_repetition_unparseable"}).write(' ').reference(c.get("rrule"),c,"h").write("
    ")}function j(a,c){return a.write("
    ").helper("i18n",c,{},{type:"messages",name:"info_repetition_human",explanation:h}).write("
    ")} -function h(a,c){return a.reference(c.get("rrule_explained"),c,"h")}function k(a,c){return a.write("
    ").helper("i18n",c,{},{type:"labels",name:"reminder"}).write("
    ").partial("reminder_description",c,null).write("
    ")}function l(a,c){return a.write('
    ")}dust.register("event_details_popup",a);return a})();(function(){function a(a,d){return a.write('')}dust.register("datepicker_button",a);return a})(); -(function(){function a(a,c){return a.write('
    ").partial("form_open",c,{applyclass:"form-horizontal",applyid:"calendar_modify_form"}).write('
    ').exists(c.get("user_from"),c,{block:b},null).partial("calendar_basic_form_part", -c,null).write("
    ").exists(c.get("enable_calendar_sharing"),c,{block:k},null).partial("form_close",c,null).write("
    ")}function e(a,c){return a.notexists(c.get("shared"),c,{block:d},null)}function d(a,c){return a.write('
  • ').helper("i18n",c,{},{type:"labels",name:"shareoptions"}).write("
  • ")}function b(a,c){return a.write('")}function f(a,c){return a.reference(c.get("user_from"),c,"h")}function j(a,c){return a.write("(").helper("i18n",c,{},{type:"labels",name:"readonly"}).write(")")}function h(a,c){return a.reference(c.get("write_access"),c,"h")}function k(a,c){return a.notexists(c.get("shared"),c,{block:l},null)}function l(a,c){return a.write('
    ').partial("calendar_share_table",c,null).write("
    ")}dust.register("calendar_modify_dialog",a);return a})(); -(function(){function a(a,g){return a.exists(g.get("calendar"),g,{block:e},null).write('').partial("form_element_start",g,{"for":"displayname",label:"displayname"}).write('').partial("form_element_end",g,null).partial("form_element_start", -g,{"for":"color",label:"color"}).write('').partial("form_element_end",g,null).exists(g.get("public_url"),g,{block:k},null)}function e(a,b){return a.write('')}function d(a){return a.write("false")}function b(a){return a.write("true")}function f(a, -b){return a.reference(b.get("displayname"),b,"h")}function j(a,b){return a.reference(b.get("default_calendar_color"),b,"h")}function h(a,b){return a.reference(b.get("color"),b,"h")}function k(a,b){return a.write('")}dust.register("calendar_basic_form_part",a);return a})(); -(function(){function a(a,b){return a.write('
    ')}function e(a,b){return a.write('for="').reference(b.get("for"),b,"h").write('"')}dust.register("form_element_start",a);return a})(); -(function(){function a(a,d){return a.write('').reference(d.get("username"),d,"h").write('').helper(')}dust.register("calendar_share_row",a);return a})(); -(function(){function a(a,b){return a.exists(b.get("input_help"),b,{block:e},null).write("
    ")}function e(a,b){return a.write('

    ').reference(b.get("input_help"),b,"h").write("

    ")}dust.register("form_element_end",a);return a})(); -(function(){function a(a,i){return a.write('').notexists(i.get("add"),i,{block:j},null).exists(i.get("is_absolute"),i,{"else":h,block:k},null).write('').exists(i.get("is_absolute"),i,{"else":l,block:o},null).write("").exists(i.get("add"),i,{"else":p,block:q},null).write("")}function e(a){return a.write("is_absolute")} -function d(a){return a.write("reminders[is_absolute][]")}function b(a){return a.write("false")}function f(a){return a.write("true")}function j(a,b){return a.write('')}function h(a){return a.write('')}function k(a){return a.write('')}function l(a,b){return a.write('").notexists(b.get("add"), -b,{block:H},null)}function g(a){return a.write("qty")}function c(a){return a.write("reminders[qty][]")}function m(a){return a.write("interval")}function n(a){return a.write("reminders[interval][]")}function r(a){return a.write(' selected="true"')}function s(a,b){return a.reference(b.get("interval"),b,"h")}function t(a){return a.write(' selected="true"')}function u(a,b){return a.reference(b.get("interval"),b,"h")}function v(a){return a.write(' selected="true"')}function w(a,b){return a.reference(b.get("interval"), -b,"h")}function x(a){return a.write(' selected="true"')}function y(a,b){return a.reference(b.get("interval"),b,"h")}function z(a){return a.write("before")}function A(a){return a.write("reminders[before][]")}function B(a){return a.write(' selected="true"')}function C(a,b){return a.notexists(b.get("add"),b,{block:I},null)}function I(a){return a.write(' selected="true"')}function D(a){return a.write("relatedStart")}function E(a){return a.write("reminders[relatedStart][]")}function F(a){return a.write(' selected="true"')} -function G(a,b){return a.notexists(b.get("add"),b,{block:J},null)}function J(a){return a.write(' selected="true"')}function H(a){return a.write('')}function o(a,b){return a.write('').notexists(b.get("add"),b,{block:O},null)}function K(a){return a.write("tdate")}function L(a){return a.write("reminders[tdate][]")}function M(a){return a.write("ttime")}function N(a){return a.write("reminders[ttime][]")}function O(a){return a.write('')} -function p(a,b){return a.write('').helper(')}function q(a,b){return a.write('').helper(')}dust.register("reminder_row",a);return a})(); -(function(){function a(a,b){return a.write('
    ').partial("form_open",b,null).write('

    ').helper("i18n",b,{},{type:"messages",name:"info_confirmeventdelete"}).write('

    ').reference(b.get("title"), -b,"h").write("

    ").exists(b.get("rrule"),b,{block:e},null).partial("form_close",b,null).write("
    ")}function e(a,b){return a.write("

    ").helper("i18n",b,{},{type:"messages",name:"info_repetitivedeleteall"}).write("

    ")}dust.register("event_delete_dialog",a);return a})(); -(function(){function a(a,c){return a.write('
  • ').exists(c.get("shared"),c,{"else":f,block:h},null).write('").reference(c.get("displayname"), -c,"h").write('
  • ')}function e(a){return a.write(" default_calendar")}function d(a,b){return a.reference(b.get("default_calendar_color"),b,"h")}function b(a,b){return a.reference(b.get("color"),b,"h")}function f(a,b){return a.exists(b.get("share_with"),b,{block:j},null)}function j(a,b){return a.write('')} -function h(a,b){return a.helper("eq",b,{block:k},{key:l,value:"0"})}function k(a,b){return a.write('')}function l(a,b){return a.reference(b.get("write_access"),b,"h")}function g(a,b){return a.write('title="').helper("i18n",b,{},{type:"messages",name:"info_sharedby",user:c}).write('"')}function c(a,b){return a.reference(b.get("user_from"),b,"h")}dust.register("calendar_list_entry",a);return a})(); -(function(){function a(a,b){return a.exists(b.get("is_absolute"),b,{"else":e,block:n},null)}function e(a,b){return a.reference(b.get("qty"),b,"h").write(" ").helper("select",b,{block:d},{key:k}).write(" ").exists(b.get("before"),b,{"else":l,block:g},null).write(" ").exists(b.get("relatedStart"),b,{"else":c,block:m},null)}function d(a,c){return a.helper("eq",c,{block:b},{value:"min"}).helper("eq",c,{block:f},{value:"hour"}).helper("eq",c,{block:j},{value:"day"}).helper("eq",c,{block:h},{value:"week"})} -function b(a,b){return a.helper("i18n",b,{},{type:"labels",name:"minutes"})}function f(a,b){return a.helper("i18n",b,{},{type:"labels",name:"hours"})}function j(a,b){return a.helper("i18n",b,{},{type:"labels",name:"days"})}function h(a,b){return a.helper("i18n",b,{},{type:"labels",name:"weeks"})}function k(a,b){return a.reference(b.get("interval"),b,"h")}function l(a,b){return a.helper("i18n",b,{},{type:"labels",name:"after"})}function g(a,b){return a.helper("i18n",b,{},{type:"labels",name:"before"})} -function c(a,b){return a.helper("i18n",b,{},{type:"labels",name:"end"})}function m(a,b){return a.helper("i18n",b,{},{type:"labels",name:"start"})}function n(a,b){return a.reference(b.get("tdate"),b,"h").write(" ").reference(b.get("ttime"),b,"h")}dust.register("reminder_description",a);return a})(); -var ved="div.view_event_details",ced="#com_event_dialog",dustbase={}; -$(document).ready(function(){load_i18n_strings();dust.helpers.i18n=function(a,b,c,d){var c={},e=d.name,f=d.type;delete d.name;delete d.type;for(var g in d)d.hasOwnProperty(g)&&(c["%"+g]=dust.helpers.tap(d[g],a,b));return a.write(t(f,e,c))};$("body").hasClass("loginpage")?($("input:submit").button(),$('input[name="user"]').focus()):$("body").hasClass("prefspage")?($("#prefs_tabs").tabs(),$("#prefs_buttons button").button(),$("#return_button").on("click",function(){window.location=base_app_url;return false}), -$("#save_button").on("click",function(){var a=$("#prefs_form");proceed_send_ajax_form(a,function(){show_success(t("messages","info_prefssaved"),"")},function(a){show_error(t("messages","error_invalidinput"),a)},function(){})})):$("body").hasClass("calendarpage")&&(dustbase=dust.makeBase({default_calendar_color:default_calendar_color,base_url:base_url,base_app_url:base_app_url,csrf_token_name:AgenDAVConf.prefs_csrf_token_name,enable_calendar_sharing:enable_calendar_sharing}),set_default_colorpicker_options(), -$("#calendar_view").fullCalendar({selectable:true,editable:true,firstDay:AgenDAVConf.prefs_firstday,timeFormat:{agenda:AgenDAVConf.prefs_timeformat+"{ - "+AgenDAVConf.prefs_timeformat+"}","":AgenDAVConf.prefs_timeformat},columnFormat:{month:AgenDAVConf.prefs_format_column_month,week:AgenDAVConf.prefs_format_column_week,day:AgenDAVConf.prefs_format_column_day,table:AgenDAVConf.prefs_format_column_table},titleFormat:{month:AgenDAVConf.prefs_format_title_month,week:AgenDAVConf.prefs_format_title_week, -day:AgenDAVConf.prefs_format_title_day,table:AgenDAVConf.prefs_format_title_table},currentTimeIndicator:true,weekMode:"liquid",height:calendar_height(),windowResize:function(){$(this).fullCalendar("option","height",calendar_height())},header:{left:"month,agendaWeek,agendaDay table",center:"title",right:"today prev,next"},listTexts:{until:t("labels","repeatuntil"),past:t("labels","pastevents"),today:t("labels","today"),tomorrow:t("labels","tomorrow"),thisWeek:t("labels","thisweek"),nextWeek:t("labels", -"nextweek"),thisMonth:t("labels","thismonth"),nextMonth:t("labels","nextmonth"),future:t("labels","future"),week:"W"},listSections:"smart",listRange:30,listPage:7,monthNames:month_names_long(),monthNamesShort:month_names_short(),dayNames:day_names_long(),dayNamesShort:day_names_short(),buttonText:{today:t("labels","today"),month:t("labels","month"),week:t("labels","week"),day:t("labels","day"),table:t("labels","tableview")},theme:true,allDayText:t("labels","allday"),axisFormat:AgenDAVConf.prefs_timeformat, -slotMinutes:30,firstHour:8,allDayDefault:false,loading:function(a){loading(a)},eventRender:event_render_callback,eventClick:event_click_callback,select:slots_drag_callback,selectHelper:select_helper,eventResize:event_resize_callback,eventDrop:event_drop_callback}),$(' '+t("labels","refresh")+"").appendTo("#calendar_view td.fc-header-right").button().on("click",function(){update_calendar_list(true)}).before(''), -dust.render("datepicker_button",dustbase,function(a,b){a!=null?show_error(t("messages","error_interfacefailure"),a.message):($("#calendar_view span.fc-button-next").after(b),$("#datepicker_fullcalendar").datepicker({changeYear:true,closeText:t("labels","cancel"),onSelect:function(){var a=$("#datepicker_fullcalendar").datepicker("getDate");$("#calendar_view").fullCalendar("gotoDate",a)}}).prev().button().on("click",function(){$("#datepicker_fullcalendar").datepicker("setDate",$("#calendar_view").fullCalendar("getDate")); -$("#datepicker_fullcalendar").datepicker("show")}))}),$("#calendar_view").fullCalendar("renderEvent",{title:"Little portal",start:"1985-02-15T00:00:00Z",end:"1985-02-15T23:59:59Z",allDay:true,editable:false,color:"#E78AEF"},true),$("div.calendar_list").on("click","i.cfg",function(a){a.stopPropagation();a=$(this).parent();calendar_modify_dialog($(a[0]).data())}).on("click","li.available_calendar",function(){toggle_calendar($(this))}),update_calendar_list(true),$("#sidebar").on("click","#toggle_all_shared_calendars", -function(){var a=$("#shared_calendar_list").find("ul").children();$(this).hasClass("hide_all")?($.map(a,function(a){hide_calendar($(a))}),$(this).removeClass("hide_all").addClass("show_all").find("i").removeClass("icon-eye-close").addClass("icon-eye-open")):($.map(a,function(a){show_calendar($(a))}),$(this).removeClass("show_all").addClass("hide_all").find("i").removeClass("icon-eye-open").addClass("icon-eye-close"))}),$("#sidebar div.buttons").find("img[title],span[title],a[title]").qtip({position:{my:"top left", -at:"bottom left"},show:{delay:600},style:{classes:"ui-tooltip-bootstrap",tip:true}}),$("#calendar_add").on("click",calendar_create_dialog),$("#shortcut_add_event").button({icons:{primary:"ui-icon-plusthick"}}).on("click",function(){var a={start:fulldatetimestring($("#calendar_view").fullCalendar("getDate")),allday:false,view:"month"};$("#calendar_view").fullCalendar("unselect");event_field_form("new",a)}));setup_print_tweaks();$("#usermenu").qtip({content:$("#usermenu_content"),position:{my:"top center", -at:"bottom center"},style:{tip:true,classes:"ui-tooltip-bootstrap agendav-menu"},show:{event:"click",effect:false,delay:0},hide:{event:"unfocus"}})}); -var calendar_height=function(){var a=$("#calendar_view").offset();return $(window).height()-Math.ceil(a.top)-30},show_error=function(a,b){loading(false);$("#popup").freeow(a,b,{classes:["popup_error"],autoHide:false,showStyle:{opacity:1,left:0},hideStyle:{opacity:0,left:"400px"}})},show_success=function(a,b){$("#popup").freeow(a,b,{classes:["popup_success"],autoHide:true,autoHideDelay:2E3,showStyle:{opacity:1,left:0},hideStyle:{opacity:0,left:"400px"}})},get_data=function(a){return $.data($("body")[0], -a)},set_data=function(a,b){$.data($("body")[0],a,b)},remove_data=function(a){$.removeData($("body")[0],a)},load_generated_dialog=function(a,b,c,d,e,f,g){f="#"+f;if($(f).length!=0)return false;b=generate_on_the_fly_form(base_app_url+"event/modify",b);if(get_data("formcreation")=="ok"){b=$("#"+b);$(b).attr("action");var h=$(b).serialize(),a=$.ajax({url:base_app_url+a,cache:false,type:"POST",data:h,dataType:"html"});a.then(function(){loading(false)});a.fail(function(a,b){show_error(t("messages","error_loading_dialog"), -t("messages","error_oops")+": "+b)});a.done(function(a){$("body").append(a);$(f).dialog({autoOpen:true,buttons:e,title:d,minWidth:g,modal:true,open:function(a){c();$(f).dialog("option","position","center");a=$(a.target).parent().find(".ui-dialog-buttonset").children();add_button_icons(a)},close:function(){$(this).remove()}})});$(b).remove()}else show_error(t("messages","error_interfacefailure"),t("messages","error_oops"))},proceed_send_ajax_form=function(a,b,c,d){var e=$(a).attr("action"),a=$(a).serialize(); -loading(true);e=$.ajax({url:e,cache:false,type:"POST",data:a,dataType:"json"});e.then(function(){loading(false)});e.fail(function(a,b){show_error(t("messages","error_interfacefailure"),t("messages","error_oops")+":"+b);set_data("lastoperation","failed");d()});e.done(function(a){var e=a.result,a=a.message;e=="ERROR"?(set_data("lastoperation","failed"),show_error(t("messages","error_internal"),a),d()):e=="EXCEPTION"?(set_data("lastoperation","failed"),c(a)):e=="SUCCESS"?(set_data("lastoperation","success"), -b(a)):show_error(t("messages","error_internal"),t("messages","error_oops")+":"+e)})},show_dialog=function(a,b,c,d,e,f,g){dust.render(a,dustbase.push(b),function(a,b){a!=null?show_error(t("messages","error_interfacefailure"),a.message):($("body").append(b),$("#"+e).dialog({autoOpen:true,buttons:d,title:c,minWidth:f,modal:true,open:function(a){g();$(e).dialog("option","position","center");a=$(a.target).parent().find(".ui-dialog-buttonset").children();add_button_icons(a)},close:function(){$(this).remove()}}))})}, -generate_on_the_fly_form=function(a,b){for(var c="",d=0;d<10;d++)c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));d=$.ajax({url:base_app_url+"dialog_generator/on_the_fly_form/"+c,cache:false,type:"POST",contentType:"text",dataType:"text",async:false});d.fail(function(){session_expired();set_data("formcreation","failed")});d.done(function(c){var d="";$.each(b,function(a,b){d+=''});$(c).append(d).attr("action", -a).appendTo(document.body);set_data("formcreation","ok")});return c},destroy_dialog=function(a){$(a).dialog("close");$(a).dialog("destroy");$(a).remove()},set_default_datepicker_options=function(){$.datepicker.regional.custom={closeText:t("labels","close"),prevText:t("labels","previous"),nextText:t("labels","next"),currentText:t("labels","today"),monthNames:month_names_long(),monthNamesShort:month_names_short(),dayNames:day_names_long(),dayNamesShort:day_names_short(),dayNamesMin:day_names_short(), -weekHeader:"Sm",firstDay:AgenDAVConf.prefs_firstday,isRTL:false,showMonthAfterYear:false,yearSuffix:""};$.datepicker.setDefaults($.datepicker.regional.custom);$.datepicker.setDefaults({constrainInput:true});$.datepicker.setDefaults({dateFormat:AgenDAVConf.prefs_dateformat})},set_end_minDate=function(){var a=ced+" input.end_date",b=ced+" input.recurrence_until",c=$(ced+" input.start_date").datepicker("getDate");c.setTime(c.getTime());$(a).datepicker("option","minDate",c);$(b).datepicker("option","minDate", -c)},update_recurrence_options=function(a){a=="none"?($(ced+" input.recurrence_count").val(""),$(ced+" input.recurrence_until").val(""),$(ced+" input.recurrence_count").attr("disabled","disabled"),$(ced+" input.recurrence_count").addClass("ui-state-disabled"),$(ced+' label[for="recurrence_count"]').addClass("ui-state-disabled"),$(ced+" input.recurrence_until").attr("disabled","disabled"),$(ced+" input.recurrence_until").datepicker("disable"),$(ced+" input.recurrence_until").addClass("ui-state-disabled"), -$(ced+' label[for="recurrence_until"]').addClass("ui-state-disabled")):(enforce_exclusive_recurrence_field("recurrence_count","recurrence_until"),enforce_exclusive_recurrence_field("recurrence_until","recurrence_count"))},event_field_form=function(a,b){var c="dialog_generator/",d;a=="new"?(c+="create_event",d=t("labels","createevent")):(c+="edit_event",d=t("labels","editevent"));load_generated_dialog(c,b,function(){$(ced+"_tabs").tabs();$(ced+" input.start_time").timePicker(AgenDAVConf.timepicker_base); -$(ced+" input.end_time").timePicker(AgenDAVConf.timepicker_base);$(ced+" input.start_date").datepicker({onSelect:function(){set_end_minDate()}});$(ced+" input.end_date").datepicker();$(ced+" input.recurrence_until").datepicker();$(ced+" input.end_time").data("untouched",true);set_end_minDate();update_recurrence_options($(ced+" select.recurrence_type").val());$(ced).on("change","input.allday",function(){var a=$(ced+" input.start_date").datepicker("getDate");set_end_minDate();$(this).is(":checked")? -($(ced+" input.start_time").hide(),$(ced+" input.end_time").hide()):($(ced+" input.end_date").removeAttr("disabled"),$(ced+" input.end_date").removeClass("ui-state-disabled"),$(ced+" input.end_date").datepicker("setDate",a),$(ced+" input.start_time").show(),$(ced+" input.end_time").show())});$(ced).on("change","select.recurrence_type",function(){$(this).val();update_recurrence_options($(this).val())});$(ced).on("keyup","input.recurrence_count",function(){enforce_exclusive_recurrence_field("recurrence_count", -"recurrence_until")}).on("keyup change","input.recurrence_until",function(){enforce_exclusive_recurrence_field("recurrence_until","recurrence_count")});var c=$.timePicker(ced+" input.start_time").getTime(),d=$.timePicker(ced+" input.end_time").getTime()-c.getTime();$(ced).on("change","input.start_time",function(){if($(ced+" input.end_time").data("untouched")){var a=$.timePicker(ced+" input.start_time").getTime(),b=$.timePicker(ced+" input.end_time").getTime()-c.getTime();$.timePicker(ced+" input.end_time").setTime(new Date(a.getTime()+ -b));c=a}});$(ced).on("change","input.end_time",function(){$.timePicker(this).getTime()-$.timePicker(ced+" input.start_time").getTime()!=d&&$(this).data("untouched",false)});a=="new"&&$('input[name="summary"]').focus();dust.render("reminders_table",dustbase.push(b),function(a,b){a!=null?show_error(t("messages","error_interfacefailure"),a.message):($("#tabs-reminders").html(b),reminders_manager())})},d,[{text:t("labels","save"),"class":"addicon btn-icon-event-edit",click:function(){var a=$("#com_form"); -proceed_send_ajax_form(a,function(a){$.each(a,function(a,b){reload_event_source(b)});destroy_dialog(ced)},function(a){show_error(t("messages","error_invalidinput"),a)},function(){})}},{text:t("labels","cancel"),"class":"addicon btn-icon-cancel",click:function(){destroy_dialog(ced)}}],"com_event_dialog",550)},update_single_event=function(a,b){$.each(b,function(b,d){a[b]=d});$("#calendar_view").fullCalendar("updateEvent",a)},calendar_create_dialog=function(){var a=base_app_url+"calendar/create",b=t("labels", -"newcalendar"),a={applyid:"calendar_create_form",frm:{action:a,method:"post",csrf:get_csrf_token()}};show_dialog("calendar_create_dialog",a,b,[{text:t("labels","create"),"class":"addicon btn-icon-calendar-add",click:function(){var a=$("#calendar_create_form");proceed_send_ajax_form(a,function(){destroy_dialog("#calendar_create_dialog");update_calendar_list(false)},function(a){show_error(t("messages","error_invalidinput"),a)},function(){})}},{text:t("labels","cancel"),"class":"addicon btn-icon-cancel", -click:function(){destroy_dialog("#calendar_create_dialog")}}],"calendar_create_dialog",400,function(){$("input.pick_color").colorPicker()})},calendar_modify_dialog=function(a){var b=base_app_url+"calendar/modify",c=t("labels","modifycalendar");$.extend(a,{applyid:"calendar_modify_form",frm:{action:b,method:"post",csrf:get_csrf_token()}});b=[{text:t("labels","deletecalendar"),"class":"addicon btn-icon-calendar-delete",click:function(){calendar_delete_dialog(a)}},{text:t("labels","save"),"class":"addicon btn-icon-calendar-edit", -click:function(){var a=$("#calendar_modify_form");proceed_send_ajax_form(a,function(){destroy_dialog("#calendar_modify_dialog");update_calendar_list(false)},function(a){show_error(t("messages","error_invalidinput"),a)},function(){})}},{text:t("labels","cancel"),"class":"addicon btn-icon-cancel",click:function(){destroy_dialog("#calendar_modify_dialog")}}];a.shared===true&&b.splice(0,1);show_dialog("calendar_modify_dialog",a,c,b,"calendar_modify_dialog",500,function(){$("input.pick_color").colorPicker(); -$("#calendar_modify_dialog_tabs").tabs();enable_calendar_sharing===true&&a.shared!==true&&share_manager()})},calendar_delete_dialog=function(a){destroy_dialog("#calendar_modify_dialog");var b=base_app_url+"calendar/delete",c=t("labels","deletecalendar");$.extend(a,{applyid:"calendar_delete_form",frm:{action:b,method:"post",csrf:get_csrf_token()}});show_dialog("calendar_delete_dialog",a,c,[{text:t("labels","yes"),"class":"addicon btn-icon-calendar-delete",click:function(){var a=$("#calendar_delete_form"); -proceed_send_ajax_form(a,function(a){$(".calendar_list li.available_calendar").each(function(){var b=$(this).data();if(b.calendar==a)return $("#calendar_view").fullCalendar("removeEventSource",b.eventsource),$(this).remove(),false})},function(a){show_error(t("messages","error_caldelete"),a)},function(){});destroy_dialog("#calendar_delete_dialog")}},{text:t("labels","cancel"),"class":"addicon btn-icon-cancel",click:function(){destroy_dialog("#calendar_delete_dialog")}}],"calendar_delete_dialog",500, -function(){})},update_calendar_list=function update_calendar_list(b){b&&loading(true);var c=$.ajax({url:base_app_url+"calendar/all",cache:false,dataType:"json",async:false});c.then(function(){b&&loading(false)});c.fail(function(b,c){show_error(t("messages","error_loading_calendar_list"),t("messages","error_oops")+c)});c.done(function(b){var c={};$(".calendar_list li.available_calendar").each(function(){var b=$(this).data();$("#calendar_view").fullCalendar("removeEventSource",b.eventsource);$(this).hasClass("transparent")&& -(c[b.calendar]=true);$(this).remove()});var f=0,g=0,h=document.createDocumentFragment(),i=document.createDocumentFragment(),j=[];$.each(b,function(b,d){f++;d.color=d.color===void 0||d.color===false||d.color==null?default_calendar_color:d.color.substr(0,7);d.fg=fg_for_bg(d.color);d.bordercolor=$.color.parse(d.color).scale("rgb",d.fg=="#000000"?0.8:1.8).toString();var k=generate_calendar_entry(d);c[d.calendar]?k.addClass("transparent"):j.push($(k).data().eventsource);d.shared==true?(g++,i.appendChild(k[0])): -h.appendChild(k[0])});if(f==0)b=get_data("last_calendar_count"),b===void 0||b!="0"?(set_data("last_calendar_count",0),setTimeout(function(){update_calendar_list(false)},1)):(show_error(t("messages","notice_no_calendars"),""),$("#shortcut_add_event").button("disable"));else{set_data("last_calendar_count",f);$("#own_calendar_list ul")[0].appendChild(h);g==0?$("#shared_calendar_list").hide():($("#shared_calendar_list ul")[0].appendChild(i),$("#shared_calendar_list").show());for(;f--;)$("#calendar_view").fullCalendar("addEventSource", -j[f]);$("#shortcut_add_event").button("enable")}})},generate_event_source=function(a){return{url:base_app_url+"event/all#"+a,cache:false,data:{calendar:a},error:function(b){b.status!==void 0&&b.status==401?session_expired():show_error(t("messages","error_interfacefailure"),t("messages","error_loadevents",{"%cal":a}))},startParamUTC:true,endParamUTC:true}},session_refresh=function session_refresh(b){var c=$.ajax({url:base_app_url+"js_generator/keepalive",cache:false,method:"GET",dataType:"html"}); -c.done(function(c){c!==""?$("body").append(c):setTimeout(function(){session_refresh(b)},b)});c.fail(function(){session_expired()})},add_button_icons=function(a){a.filter("button.addicon").removeClass("addicon").removeClass("ui-button-text-only").addClass("ui-button-text-icon-primary").each(function(a,c){var d=$(c).attr("class").split(" ");$.each(d,function(a,b){if(b.match(/^btn-icon-/))return $(c).prepend(''),$(c).removeClass(b),false})})}, -generate_calendar_entry=function(a){var b=generate_event_source(a.calendar);b.ignoreTimezone=true;b.color=a.color;b.textColor=a.fg;b.borderColor=a.bordercolor;if(a.shared!==void 0&&a.shared==true&&a.write_access=="0")b.editable=false;a.eventsource=b;var c;dust.render("calendar_list_entry",dustbase.push(a),function(b,e){b!=null?show_error(t("messages","error_interfacefailure"),b.message):(c=$(e),c.data(a),c.disableSelection(),c.find("span[title],i[title]").qtip({position:{my:"top left",at:"bottom left"}, -show:{delay:600},style:{classes:"ui-tooltip-bootstrap",tip:true}}))});return c},get_calendar_data=function(a){var b=void 0;$(".calendar_list li.available_calendar").each(function(){var c=$(this).data();if(c.calendar==a)return b=c,false});return b},get_calendar_displayname=function(a){a=get_calendar_data(a);return a===void 0||a.displayname===void 0?"(?)":a.displayname},reload_event_source=function(a){var b=void 0;$(".calendar_list li.available_calendar").each(function(){var c=$(this).data();if(c.calendar== -a)return b=c.eventsource,false});b!==void 0?($("#calendar_view").fullCalendar("removeEventSource",b),$("#calendar_view").fullCalendar("addEventSource",b)):show_error(t("messages","error_interfacefailure"),t("messages","error_calendarnotfound",{"%calendar":a}))},enforce_exclusive_recurrence_field=function(a,b){$(ced+" input."+a).val()==""?($(ced+" input."+b).removeAttr("disabled"),$(ced+" input."+b).removeClass("ui-state-disabled"),$(ced+' label[for="'+b+'"]').removeClass("ui-state-disabled"),b=="recurrence_until"&& -$(ced+" input."+b).datepicker("enable")):($(ced+" input."+b).attr("disabled","disabled"),$(ced+" input."+b).addClass("ui-state-disabled"),$(ced+" input."+b).val(""),$(ced+' label[for="'+b+'"]').addClass("ui-state-disabled"),b=="recurrence_until"&&$(ced+" input."+b).datepicker("disable"))},timestamp=function(a){return Math.round(a.getTime()/1E3)},fulldatetimestring=function(a){if(a!=void 0)return $.fullCalendar.formatDate(a,"yyyyMMddHHmmss")},fg_for_bg=function(a){a=parseInt(a.substr(1),16);return(a>>> -16)+(a>>>8&255)+(a&255)<500?"#ffffff":"#000000"},session_expired=function(){$(".ui-dialog-content").dialog("close");show_error(t("messages","error_sessexpired"),t("messages","error_loginagain"));setTimeout(function(){window.location=base_url},2E3)},share_manager=function(){var a=$("#calendar_share_table"),b=$("#calendar_share_add");share_manager_no_entries_placeholder();a.on("click",".calendar_share_delete",function(){$(this).parent().parent().fadeOut("fast",function(){$(this).remove();share_manager_no_entries_placeholder()})}); -var c={},d;b.find("#calendar_share_add_username").autocomplete({minLength:3,source:function(a,b){var g=a.term;g in c?b(c[g]):d=$.getJSON(base_app_url+"caldav2json/principal_search",a,function(a,e,j){c[g]=a;j===d&&b(a)})},focus:function(a,b){$(this).val(b.item.username);return false},select:function(a,b){$(this).val(b.item.username);return false}}).data("autocomplete")._renderItem=function(a,b){return $("
  • ").data("item.autocomplete",b).append(' '+b.displayname+' <'+ -b.email+">").appendTo(a)};b.on("click","#calendar_share_add_button",function(){var b=$("#calendar_share_add_username").val(),c=$("#calendar_share_add_write_access").val();if(b!=""){var d=false;a.find("span.username").each(function(){!d&&$(this).text()==b&&(d=true,$(this).parent().parent().effect("highlight",{},"slow"))});d||dust.render("calendar_share_row",dustbase.push({username:b,write_access:c}),function(b,c){b!=null?show_error(t("messages","error_interfacefailure"),b.message):(a.find("tbody").append(c), -$("#calendar_share_add_username").val(""),$("#calendar_share_add_write_access").val("0"),share_manager_no_entries_placeholder())})}})},share_manager_no_entries_placeholder=function(){$("#calendar_share_table").find("tbody tr").length==1?$("#calendar_share_no_rows").show():$("#calendar_share_no_rows").hide()},reminders_manager=function(){var a=$("#tabs-reminders"),b=$("#reminders_table");initialize_date_and_time_pickers(a);reminders_manager_no_entries_placeholder();b.on("click",".reminder_delete", -function(){$(this).parent().parent().fadeOut("fast",function(){$(this).remove();reminders_manager_no_entries_placeholder()})});b.parent().on("click","img.reminder_add_button",function(){var c=$(this).closest("tbody").serializeObject(),d=false,e=/^[0-9]+$/;c.is_absolute===false?c.qty!==""&&e.test(c.qty)&&c.interval!==""&&c.before!==""&&(d=true):c.tdate!==""&&c.ttime!==""&&(d=true);if(d===true){var f=$(this).closest("tr");dust.render("reminder_row",dustbase.push(c),function(c,d){c!=null?show_error(t("messages", -"error_interfacefailure"),c.message):(b.find("tbody").append(d),f.find("input").val(""),f.find("select").val(""),initialize_date_and_time_pickers(a),reminders_manager_no_entries_placeholder())})}})},reminders_manager_no_entries_placeholder=function(){$("#reminders_table").find("tbody tr").length==1?$("#reminders_no_rows").show():$("#reminders_no_rows").hide()},event_render_callback=function(a,b){var c=get_calendar_data(a.calendar),d=$.extend({},a,{caldata:c});c!==void 0&&c.shared===true&&c.write_access== -"0"&&$.extend(d,{disable_actions:true});c=[];a.rrule!=void 0&&c.push("icon-repeat");a.reminders.length>0&&c.push("icon-bell");if(c.length!=0){var e=$('');$.each(c,function(a,b){e.append('')});b.hasClass("fc-event-row")||b.find(".fc-event-title").after(e)}dust.render("event_details_popup",dustbase.push(d),function(c,d){c!=null?show_error(t("messages","error_interfacefailure"),c.message):b.qtip({content:{text:d,title:{text:a.title,button:true}}, -position:{my:"bottom center",at:"top center",viewport:$("#calendar_view")},style:{classes:"view_event_details ui-tooltip-bootstrap",tip:true},show:{target:$("#calendar_view"),event:false,solo:$("#calendar_view"),effect:false},hide:{fixed:true,event:"unfocus",effect:false},events:{show:function(a,b){$(this).find("button.link_delete_event").off("click").on("click",function(){event_delete_dialog()}).end().find("button.link_modify_event").off("click").on("click",function(){modify_event_handler()});$(window).on("keydown.tooltipevents", -function(a){a.keyCode===$.ui.keyCode.ESCAPE&&b.hide(a)});var c=b.elements.tooltip.find("div.actions").find("button.addicon").button();add_button_icons(c)},hide:function(){remove_data("current_event");$(window).off("keydown.tooltipevents")}}})})},event_click_callback=function(a,b){get_data("current_event")==a?($(ved).qtip("hide"),remove_data("current_event")):(set_data("current_event",a),$(this).qtip("show",b))},slots_drag_callback=function(a,b,c,d,e){c=e.name=="month"?false:c;a={start:fulldatetimestring(a), -end:fulldatetimestring(b),allday:c,view:e.name};$("#calendar_view").fullCalendar("unselect");event_field_form("new",a)},select_helper=function(a,b){return $('
    ').text($.fullCalendar.formatDates(a,b,AgenDAVConf.prefs_timeformat+"{ - "+AgenDAVConf.prefs_timeformat+"}"))},event_resize_callback=function(a,b,c,d,e,f,g){b=generate_on_the_fly_form(base_app_url+"event/alter",{uid:a.uid,calendar:a.calendar,etag:a.etag,view:g.name, -dayDelta:b,minuteDelta:c,allday:a.allDay,was_allday:a.was_allday,timezone:a.timezone,type:"resize"});if(get_data("formcreation")=="ok"){var h=$("#"+b);proceed_send_ajax_form(h,function(b){update_single_event(a,b)},function(a){show_error(t("messages","error_modfailed"),a);d()},function(){d()})}$(h).remove()},event_drop_callback=function(a,b,c,d,e,f,g,h){b=generate_on_the_fly_form(base_app_url+"event/alter",{uid:a.uid,calendar:a.calendar,etag:a.etag,view:h.name,dayDelta:b,minuteDelta:c,allday:a.allDay, -was_allday:a.orig_allday,timezone:a.timezone,type:"drag"});if(get_data("formcreation")=="ok"){var i=$("#"+b);proceed_send_ajax_form(i,function(b){update_single_event(a,b)},function(a){show_error(t("messages","error_modfailed"),a);e()},function(){e()})}$(i).remove()},event_delete_dialog=function(){var a=base_app_url+"event/delete",b=t("labels","deleteevent"),c=get_data("current_event");if(c===void 0)show_error(t("messages","error_interfacefailure"),t("messages","error_current_event_not_loaded"));else return $.extend(c, -{applyid:"event_delete_form",frm:{action:a,method:"post",csrf:get_csrf_token()}}),show_dialog("event_delete_dialog",c,b,[{text:t("labels","yes"),"class":"addicon btn-icon-event-delete",click:function(){var a=$("#event_delete_form");proceed_send_ajax_form(a,function(){$("#calendar_view").fullCalendar("removeEvents",c.id)},function(){show_error(t("messages","error_event_not_deleted"),c)},function(){});destroy_dialog("#event_delete_dialog")}},{text:t("labels","cancel"),"class":"addicon btn-icon-cancel", -click:function(){destroy_dialog("#event_delete_dialog")}}],"event_delete_dialog",400,function(){}),$(ved).qtip("hide"),false},modify_event_handler=function(){var a=get_data("current_event");if(a===void 0)show_error(t("messages","error_interfacefailure"),t("messages","error_current_event_not_loaded"));else return a={uid:a.uid,calendar:a.calendar,href:a.href,etag:a.etag,start:fulldatetimestring(a.start),end:fulldatetimestring(a.end),summary:a.title,location:a.location,allday:a.allDay,description:a.description, -rrule:a.rrule,rrule_serialized:a.rrule_serialized,rrule_explained:a.rrule_explained,icalendar_class:a.icalendar_class,transp:a.transp,recurrence_id:a.recurrence_id,reminders:a.reminders,visible_reminders:a.visible_reminders,orig_start:fulldatetimestring($.fullCalendar.parseDate(a.orig_start)),orig_end:fulldatetimestring($.fullCalendar.parseDate(a.orig_end))},$(ved).qtip("hide"),event_field_form("modify",a),false},show_calendar=function(a){$("#calendar_view").fullCalendar("addEventSource",a.data().eventsource); -a.removeClass("transparent")},hide_calendar=function(a){$("#calendar_view").fullCalendar("removeEventSource",a.data().eventsource);a.addClass("transparent")},toggle_calendar=function(a){a.hasClass("transparent")?show_calendar(a):hide_calendar(a)},initialize_date_and_time_pickers=function(a){a.find(".needs-datepicker").datepicker();a.find(".needs-timepicker").timePicker(AgenDAVConf.timepicker_base)},get_csrf_token=function(){return $.cookie(AgenDAVConf.prefs_csrf_cookie_name)},loading=function(a){a=== -false?$("#loading").hide():$("#loading").show()},beforePrint=function(){$("#calendar_view").addClass("printing");$("#calendar_view").fullCalendar("render")},afterPrint=function(){$("#calendar_view").removeClass("printing");$("#calendar_view").fullCalendar("render")},setup_print_tweaks=function(){window.matchMedia&&window.matchMedia("print").addListener(function(a){a.matches?beforePrint():afterPrint()});window.onbeforeprint=beforePrint;window.onafterprint=afterPrint}; diff --git a/sources/web/public/js/app.js b/sources/web/public/js/app.js deleted file mode 100644 index 46efa0c..0000000 --- a/sources/web/public/js/app.js +++ /dev/null @@ -1,2044 +0,0 @@ -/* - * Copyright 2011-2012 Jorge López Pérez - * - * This file is part of AgenDAV. - * - * AgenDAV is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * AgenDAV is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AgenDAV. If not, see . - */ - -// Useful names -var ved = 'div.view_event_details'; -var ced = '#com_event_dialog'; -var dustbase = {}; - - -$(document).ready(function() { - // Load i18n strings - // TODO: language - load_i18n_strings(); - - // Dust.js i18n helper - dust.helpers.i18n = function i18n(chunk, context, bodies, params) { - var i18n_params = {}; - var i18n_name = params.name; - var i18n_type = params.type; - - delete params.name; - delete params.type; - - for (var key in params) { - if (params.hasOwnProperty(key)) { - var param_name = '%' + key; - i18n_params[param_name] = dust.helpers.tap(params[key], - chunk, context); - } - } - return chunk.write(t(i18n_type, i18n_name, i18n_params)); - }; - - - - // Login page: focus first input field - if ($('body').hasClass('loginpage')) { - $('input:submit').button(); - $('input[name="user"]').focus(); - } else if ($('body').hasClass('prefspage')) { - $('#prefs_tabs').tabs(); - $('#prefs_buttons button').button(); - $('#return_button').on('click', function() { - window.location = base_app_url; - return false; - }); - $('#save_button').on('click', function() { - var thisform = $('#prefs_form'); - proceed_send_ajax_form(thisform, - function(data) { - show_success( - t('messages', 'info_prefssaved'), - ''); - }, - function(data) { - show_error(t('messages', 'error_invalidinput'), data); - }, - function(data) { }); - }); - } else if ($('body').hasClass('calendarpage')) { - // Dust.js base context - dustbase = dust.makeBase({ - default_calendar_color: default_calendar_color, - base_url: base_url, - base_app_url: base_app_url, - csrf_token_name: AgenDAVConf.prefs_csrf_token_name, - enable_calendar_sharing: enable_calendar_sharing - }); - - // Default colorpicker options - set_default_colorpicker_options(); - - // Enable full calendar - // TODO: configurable! - $('#calendar_view').fullCalendar({ - selectable: true, - editable: true, - firstDay: AgenDAVConf.prefs_firstday, - timeFormat: { - agenda: AgenDAVConf.prefs_timeformat + '{ - ' - + AgenDAVConf.prefs_timeformat + '}', - '': AgenDAVConf.prefs_timeformat - }, - columnFormat: { - month: AgenDAVConf.prefs_format_column_month, - week: AgenDAVConf.prefs_format_column_week, - day: AgenDAVConf.prefs_format_column_day, - table: AgenDAVConf.prefs_format_column_table - }, - titleFormat: { - month: AgenDAVConf.prefs_format_title_month, - week: AgenDAVConf.prefs_format_title_week, - day: AgenDAVConf.prefs_format_title_day, - table: AgenDAVConf.prefs_format_title_table - }, - currentTimeIndicator: true, - weekMode: 'liquid', - height: calendar_height(), - windowResize: function(view) { - $(this).fullCalendar('option', 'height', calendar_height()); - }, - header: { - left: 'month,agendaWeek,agendaDay table', - center: 'title', - right: 'today prev,next' - }, - - listTexts: { - until: t('labels', 'repeatuntil'), - past: t('labels', 'pastevents'), - today: t('labels', 'today'), - tomorrow: t('labels', 'tomorrow'), - thisWeek: t('labels', 'thisweek'), - nextWeek: t('labels', 'nextweek'), - thisMonth: t('labels', 'thismonth'), - nextMonth: t('labels', 'nextmonth'), - future: t('labels', 'future'), - week: 'W' - }, - // list/table options - listSections: 'smart', - listRange: 30, - listPage: 7, - - monthNames: month_names_long(), - monthNamesShort: month_names_short(), - dayNames: day_names_long(), - dayNamesShort: day_names_short(), - buttonText: { - today: t('labels', 'today'), - month: t('labels', 'month'), - week: t('labels', 'week'), - day: t('labels', 'day'), - table: t('labels', 'tableview') - }, - theme: true, // use jQuery UI themeing - allDayText: t('labels', 'allday'), - axisFormat: AgenDAVConf.prefs_timeformat, - slotMinutes: 30, - firstHour: 8, - - allDayDefault: false, - - loading: function(bool) { - loading(bool); - }, - - eventRender: event_render_callback, - eventClick: event_click_callback, - - // Add new event by dragging. Click also triggers this event, - // if you define dayClick and select there is some kind of - // collision between them. - select: slots_drag_callback, - - // Useful for creating events in agenda view - selectHelper: select_helper, - - eventResize: event_resize_callback, - eventDrop: event_drop_callback - }); - - - // Refresh link - $('' - +' ' - +t('labels', 'refresh') + '') - .appendTo('#calendar_view td.fc-header-right') - .button() - .on('click', function() { - update_calendar_list(true); - }) - .before(''); - - // Date picker above calendar - dust.render('datepicker_button', dustbase, function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - $('#calendar_view span.fc-button-next') - .after(out); - $('#datepicker_fullcalendar') - .datepicker({ - changeYear: true, - closeText: t('labels', 'cancel'), - onSelect: function(date, text) { - var d = $('#datepicker_fullcalendar').datepicker('getDate'); - $('#calendar_view').fullCalendar('gotoDate', d); - } - }) - .prev() - .button() - .on('click', function() { - $('#datepicker_fullcalendar').datepicker('setDate', $('#calendar_view').fullCalendar('getDate')); - $('#datepicker_fullcalendar').datepicker('show'); - }); - } - }); - - - $('#calendar_view').fullCalendar('renderEvent', - { - title: 'Little portal', - start: '1985-02-15T00:00:00Z', - end: '1985-02-15T23:59:59Z', - allDay: true, - editable: false, - color: '#E78AEF' - }, - true); - - - /************************************************************* - * Calendar list events - *************************************************************/ - - // Editing a calendar - $('div.calendar_list').on('click', 'i.cfg', function(e) { - e.stopPropagation(); - var calentry = $(this).parent(); - calendar_modify_dialog($(calentry[0]).data()); - }) - .on('click', 'li.available_calendar', function(e) { - // Make calendar transparent - toggle_calendar($(this)); - }); - - // First time load: create calendar list - update_calendar_list(true); - - $('#sidebar').on('click', '#toggle_all_shared_calendars', function(e) { - var shared_cals = $('#shared_calendar_list').find('ul').children(); - if ($(this).hasClass('hide_all')) { - $.map(shared_cals, function(e, i) { - hide_calendar($(e)); - }); - $(this) - .removeClass('hide_all') - .addClass('show_all') - .find('i') - .removeClass('icon-eye-close') - .addClass('icon-eye-open'); - } else { - $.map(shared_cals, function(e, i) { - show_calendar($(e)); - }); - $(this) - .removeClass('show_all') - .addClass('hide_all') - .find('i') - .removeClass('icon-eye-open') - .addClass('icon-eye-close'); - } - }); - - // Help tooltips - $('#sidebar div.buttons').find('img[title],span[title],a[title]').qtip({ - position: { - my: 'top left', - at: 'bottom left' - }, - show: { - delay: 600 - }, - style: { - classes: 'ui-tooltip-bootstrap', - tip: true - } - }); - - - // Create calendar - $('#calendar_add') - .on('click', calendar_create_dialog); - - /************************************************************* - * End of calendar list events - *************************************************************/ - - /************************************************************* - * Shortcuts - *************************************************************/ - - $('#shortcut_add_event') - .button({ - icons: { - primary: 'ui-icon-plusthick' - } - }) - .on('click', function() { - var start = fulldatetimestring($('#calendar_view').fullCalendar('getDate')); - var data = { - start: start, - allday: false, - view: 'month' - }; - - // Unselect every single day/slot - $('#calendar_view').fullCalendar('unselect'); - event_field_form('new', data); - }); - } - - // Printing - - setup_print_tweaks(); - - - - - // User menu - $('#usermenu').qtip({ - content: $('#usermenu_content'), - position: { my: 'top center', at: 'bottom center' }, - style: { - tip: true, - classes: 'ui-tooltip-bootstrap agendav-menu' - }, - show: { - event: 'click', - effect: false, - delay: 0 - }, - hide: { - event: 'unfocus' - } - }); -}); - - -/** - * Used to calculate calendar view height - */ -var calendar_height = function calendar_height() { - var offset = $('#calendar_view').offset(); - return $(window).height() - Math.ceil(offset.top) - 30; -}; - -/** - * Used to show error messages - */ - -var show_error = function show_error(title, message) { - // Hide loading indicator - loading(false); - - $('#popup').freeow(title, message, - { - classes: ['popup_error'], - autoHide: false, - showStyle: { - opacity: 1, - left: 0 - }, - hideStyle: { - opacity: 0, - left: '400px' - } - }); -}; - -/** - * Used to show success messages - */ - - -var show_success = function show_success(title, message) { - $('#popup').freeow(title, message, - { - classes: ['popup_success'], - autoHide: true, - autoHideDelay: 2000, - showStyle: { - opacity: 1, - left: 0 - }, - hideStyle: { - opacity: 0, - left: '400px' - } - }); -}; - - -/** - * Gets data from body - */ -var get_data = function get_data(name) { - return $.data($('body')[0], name); -}; - -/** - * Sets data on body - */ -var set_data = function set_data(name, value) { - $.data($('body')[0], name, value); -}; - -/** - * Removes data from body - */ -var remove_data = function remove_data(name) { - $.removeData($('body')[0], name); -}; - - -/** - * Loads a form (via AJAX) to a specified div - */ -var load_generated_dialog = function load_generated_dialog(url, data, preDialogFunc, title, buttons, divname, width) { - - divname = '#' + divname; - - // Avoid double dialog opening - if ($(divname).length != 0) { - return false; - } - - // Do it via POST - var newid = generate_on_the_fly_form( - base_app_url + 'event/modify', data); - - if (get_data('formcreation') == 'ok') { - var thisform = $('#' + newid); - var action = $(thisform).attr('action'); - var formdata = $(thisform).serialize(); - - var dialog_ajax_req = $.ajax({ - url: base_app_url + url, - cache: false, - type: 'POST', - data: formdata, - dataType: 'html' - }); - - dialog_ajax_req.then(function() { - loading(false); - }); - - dialog_ajax_req.fail(function(jqXHR, textStatus, errorThrown) { - show_error(t('messages', 'error_loading_dialog'), - t('messages', 'error_oops') + ': ' + textStatus); - }); - - dialog_ajax_req.done(function(data, textStatus, jqxHR) { - $('body').append(data); - $(divname).dialog({ - autoOpen: true, - buttons: buttons, - title: title, - minWidth: width, - modal: true, - open: function(event, ui) { - preDialogFunc(); - $(divname).dialog('option', 'position', 'center'); - var buttons = $(event.target).parent().find('.ui-dialog-buttonset').children(); - add_button_icons(buttons); - }, - close: function(ev, ui) { $(this).remove(); } - }) - }); - - // Remove generated form - $(thisform).remove(); - } else { - // Error generating dialog on the fly? - show_error(t('messages', 'error_interfacefailure'), - t('messages', 'error_oops')); - } -}; - -/** - * Sends a form via AJAX. - * - * This way we respect CodeIgniter CSRF tokens - */ -var proceed_send_ajax_form = function proceed_send_ajax_form(formObj, successFunc, exceptionFunc, - errorFunc) { - var url = $(formObj).attr('action'); - var data = $(formObj).serialize(); - - // Mask body - loading(true); - - var sendform_ajax_req = $.ajax({ - url: url, - cache: false, - type: 'POST', - data: data, - dataType: 'json' - }); - - sendform_ajax_req.then(function() { - loading(false); - }); - - sendform_ajax_req.fail(function(jqXHR, textStatus, errorThrown) { - show_error(t('messages', 'error_interfacefailure'), - t('messages', 'error_oops') + ':' + textStatus); - set_data('lastoperation', 'failed'); - errorFunc(); - }); - - sendform_ajax_req.done(function(data, textStatus, jqXHR) { - // "ERROR", "EXCEPTION" or "SUCCESS" - var result = data.result; - var message = data.message; - if (result == 'ERROR') { - set_data('lastoperation', 'failed'); - show_error( - t('messages', 'error_internal'), - message); - errorFunc(); - } else if (result == 'EXCEPTION') { - set_data('lastoperation', 'failed'); - exceptionFunc(message); - } else if (result == 'SUCCESS') { - set_data('lastoperation', 'success'); - successFunc(message); - } else { - show_error(t('messages', 'error_internal'), - t('messages', 'error_oops') + ':' + result); - } - }); -}; - - -/** - * Generates a dialog - */ - -var show_dialog = function show_dialog(template, data, title, buttons, - divname, width, pre_func) { - - dust.render(template, dustbase.push(data), function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - $('body').append(out); - $('#' + divname).dialog({ - autoOpen: true, - buttons: buttons, - title: title, - minWidth: width, - modal: true, - open: function(event, ui) { - pre_func(); - $(divname).dialog('option', 'position', 'center'); - var buttons = $(event.target).parent().find('.ui-dialog-buttonset').children(); - add_button_icons(buttons); - }, - close: function(ev, ui) { $(this).remove(); } - }) - } - }); -}; - -/** - * Creates a form with a random id in the document, and returns it. - * Defines each element in the second parameter as hidden fields - */ -var generate_on_the_fly_form = function generate_on_the_fly_form(action, data) { - var random_id = ''; - var possible = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for( var i=0; i < 10; i++ ) - random_id += possible.charAt(Math.floor(Math.random() * - possible.length)); - - // Now we have our random id - var form_gen = base_app_url + 'dialog_generator/on_the_fly_form/' + - random_id; - var csrf_ajax_gen = $.ajax({ - url: form_gen, - cache: false, - type: 'POST', - contentType: 'text', - dataType: 'text', - async: false // Let's wait - }); - - csrf_ajax_gen.fail(function(jqXHR, textStatus, errorThrown) { - // This is generally caused by expired session - session_expired(); - set_data('formcreation', 'failed'); - }); - - csrf_ajax_gen.done(function(formdata, textStatus, jqXHR) { - var hidden_fields = ''; - - $.each(data, function (i, v) { - hidden_fields += ''; - }); - - $(formdata) - .append(hidden_fields) - .attr('action' , action) - .appendTo(document.body); - - set_data('formcreation', 'ok'); - }); - - return random_id; -}; - -/** - * Destroys a dialog - */ -var destroy_dialog = function destroy_dialog(name) { - $(name).dialog('close'); - $(name).dialog('destroy'); - $(name).remove(); -}; - -/** - * Sets datepicker options - */ -var set_default_datepicker_options = function set_default_datepicker_options() { - // Localization (TODO: make this configurable!) -$.datepicker.regional['custom'] = { - closeText: t('labels', 'close'), - prevText: t('labels', 'previous'), - nextText: t('labels', 'next'), - currentText: t('labels', 'today'), - monthNames: month_names_long(), - monthNamesShort: month_names_short(), - dayNames: day_names_long(), - dayNamesShort: day_names_short(), - dayNamesMin: day_names_short(), - weekHeader: 'Sm', - firstDay: AgenDAVConf.prefs_firstday, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - -$.datepicker.setDefaults($.datepicker.regional['custom']); -$.datepicker.setDefaults({constrainInput: true}); -$.datepicker.setDefaults({dateFormat: AgenDAVConf.prefs_dateformat}); -}; - -/** - * Sets a minDate on end_date - */ -var set_end_minDate = function set_end_minDate() { - var elems = ced + ' input.start_date'; - var eleme = ced + ' input.end_date'; - var elemru = ced + ' input.recurrence_until'; - - var selected = $(elems).datepicker('getDate'); - - selected.setTime(selected.getTime()); - - $(eleme).datepicker('option', 'minDate', selected); - $(elemru).datepicker('option', 'minDate', selected); - -}; - -/** - * Sets recurrence options to be enabled or disabled - */ -var update_recurrence_options = function update_recurrence_options(newval) { - if (newval == 'none') { - $(ced + ' input.recurrence_count').val(''); - $(ced + ' input.recurrence_until').val(''); - - $(ced + ' input.recurrence_count').attr('disabled', 'disabled'); - $(ced + ' input.recurrence_count').addClass('ui-state-disabled'); - $(ced + ' label[for="recurrence_count"]').addClass('ui-state-disabled'); - - $(ced + ' input.recurrence_until').attr('disabled', 'disabled'); - $(ced + ' input.recurrence_until').datepicker('disable'); - $(ced + ' input.recurrence_until').addClass('ui-state-disabled'); - $(ced + ' label[for="recurrence_until"]').addClass('ui-state-disabled'); - } else { - enforce_exclusive_recurrence_field('recurrence_count', 'recurrence_until'); - enforce_exclusive_recurrence_field('recurrence_until', 'recurrence_count'); - - } -}; - - - -/*************************** - * Event handling functions - */ - -// Triggers a dialog for editing/creating events -var event_field_form = function event_field_form(type, data) { - - var url_dialog = 'dialog_generator/'; - var title; - var action_verb; - - if (type == 'new') { - url_dialog += 'create_event'; - title = t('labels', 'createevent'); - } else { - url_dialog += 'edit_event'; - title = t('labels', 'editevent'); - } - - load_generated_dialog(url_dialog, - data, - function() { - var start_datepicker_opts = { - onSelect: function(dateText, inst) { - // End date can't be previous to start date - set_end_minDate(); - } - }; - - // Tabs - $(ced + '_tabs').tabs(); - - - $(ced + ' input.start_time').timePicker(AgenDAVConf.timepicker_base); - $(ced + ' input.end_time').timePicker(AgenDAVConf.timepicker_base); - $(ced + ' input.start_date').datepicker(start_datepicker_opts); - $(ced + ' input.end_date').datepicker(); - $(ced + ' input.recurrence_until').datepicker(); - - // Untouched value - $(ced + ' input.end_time').data('untouched', true); - - // First time datepicker is run we need to set minDate on end date - set_end_minDate(); - - // And recurrence options have to be enabled/disabled - update_recurrence_options($(ced + ' select.recurrence_type').val()); - - // All day checkbox - $(ced).on('change', 'input.allday', function() { - // TODO: timepickers should update their values - var current = $(ced + " input.start_date").datepicker('getDate'); - set_end_minDate(); - - if ($(this).is(':checked')) { - $(ced + ' input.start_time').hide(); - $(ced + ' input.end_time').hide(); - } else { - $(ced + ' input.end_date').removeAttr('disabled'); - $(ced + ' input.end_date').removeClass('ui-state-disabled'); - $(ced + ' input.end_date').datepicker('setDate', current); - - $(ced + ' input.start_time').show(); - $(ced + ' input.end_time').show(); - } - }); - - // Recurrence type - $(ced).on('change', 'select.recurrence_type', function() { - var newval = $(this).val(); - - update_recurrence_options($(this).val()); - }); - - // Avoid having a value in both recurrence options (count / until) - $(ced) - .on('keyup', 'input.recurrence_count', function() { - enforce_exclusive_recurrence_field('recurrence_count', 'recurrence_until'); - }) - .on('keyup change', 'input.recurrence_until', function() { - enforce_exclusive_recurrence_field('recurrence_until', 'recurrence_count'); - }); - - // Timepicker: keep 1h between start-end if on the same day - // and end_time hasn't been changed by hand - var origStart = $.timePicker(ced + ' input.start_time').getTime(); - var origDur = $.timePicker(ced + ' input.end_time').getTime() - origStart.getTime(); - - - $(ced).on('change', 'input.start_time', function() { - if ($(ced + ' input.end_time').data('untouched')) { - - var start = $.timePicker(ced + ' input.start_time').getTime(); - - var dur = $.timePicker(ced + ' input.end_time').getTime() - - origStart.getTime(); - $.timePicker(ced + ' input.end_time').setTime(new Date(start.getTime() + dur)); - origStart = start; - } - }); - - $(ced).on('change', 'input.end_time', function() { - var durn = $.timePicker(this).getTime() - - $.timePicker(ced + ' input.start_time').getTime(); - if (durn != origDur) { - $(this).data('untouched', false); - } - }); - - // Focus first field on creation - if (type == 'new') { - $('input[name="summary"]').focus(); - } - - // Show 'Reminders' tab contents - dust.render('reminders_table', dustbase.push(data), function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - $('#tabs-reminders').html(out); - reminders_manager(); - } - }); - - - }, - title, - [ - { - 'text': t('labels', 'save'), - 'class': 'addicon btn-icon-event-edit', - 'click': function() { - var thisform = $('#com_form'); - proceed_send_ajax_form(thisform, - function(data) { - // Reload only affected calendars - $.each(data, function(k, cal) { - reload_event_source(cal); - }); - - destroy_dialog(ced); - }, - function(data) { - // Problem with form data - show_error(t('messages', 'error_invalidinput'), data); - }, - function(data) { - // Do nothing - }); - - } - }, - { - 'text': t('labels', 'cancel'), - 'class': 'addicon btn-icon-cancel', - 'click': function() { destroy_dialog(ced); } - } - ], - 'com_event_dialog', 550); -}; - -/* - * Updates a single event fetching it from server - */ -var update_single_event = function update_single_event(event, new_data) { - $.each(new_data, function (i, v) { - event[i] = v; - }); - - $('#calendar_view').fullCalendar('updateEvent', event); -}; - -// Triggers a dialog for creating calendars -var calendar_create_dialog = function calendar_create_dialog() { - - var form_url = base_app_url + 'calendar/create'; - var title = t('labels', 'newcalendar'); - - var data = { - applyid: 'calendar_create_form', - frm: { - action: form_url, - method: 'post', - csrf: get_csrf_token() - } - }; - - show_dialog('calendar_create_dialog', - data, - title, - [ - { - 'text': t('labels', 'create'), - 'class': 'addicon btn-icon-calendar-add', - 'click': function() { - var thisform = $('#calendar_create_form'); - proceed_send_ajax_form(thisform, - function(data) { - destroy_dialog('#calendar_create_dialog'); - update_calendar_list(false); - }, - function(data) { - // Problem with form data - show_error(t('messages', 'error_invalidinput'), data); - }, - function(data) { - // Do nothing - }); - } - }, - { - 'text': t('labels', 'cancel'), - 'class': 'addicon btn-icon-cancel', - 'click': function() { destroy_dialog('#calendar_create_dialog'); } - } - ], - 'calendar_create_dialog', - 400, - function() { - $('input.pick_color').colorPicker(); - }); -}; - -// Triggers a dialog for editing calendars -var calendar_modify_dialog = function calendar_modify_dialog(calendar_obj) { - - var form_url = base_app_url + 'calendar/modify'; - var title = t('labels', 'modifycalendar'); - - var data = calendar_obj; - $.extend(data, { - applyid: 'calendar_modify_form', - frm: { - action: form_url, - method: 'post', - csrf: get_csrf_token() - } - }); - - // Buttons for modification dialog - var buttons_and_actions = - [ - { - 'text': t('labels', 'deletecalendar'), - 'class': 'addicon btn-icon-calendar-delete', - 'click': function() { - calendar_delete_dialog(calendar_obj); - } - }, - { - 'text': t('labels', 'save'), - 'class': 'addicon btn-icon-calendar-edit', - 'click': function() { - var thisform = $('#calendar_modify_form'); - - proceed_send_ajax_form(thisform, - function(data) { - destroy_dialog('#calendar_modify_dialog'); - // TODO remove specific calendar and update only its events - update_calendar_list(false); - }, - function(data) { - // Problem with form data - show_error(t('messages', 'error_invalidinput'), data); - }, - function(data) { - // Do nothing - }); - } - }, - { - 'text': t('labels', 'cancel'), - 'class': 'addicon btn-icon-cancel', - 'click': function() { destroy_dialog('#calendar_modify_dialog'); } - } - ]; - - // On shared calendars, don't show 'Remove calendar' - if (data.shared === true) { - buttons_and_actions.splice(0, 1); - } - - - show_dialog('calendar_modify_dialog', - data, - title, - buttons_and_actions, - 'calendar_modify_dialog', - 500, - function() { - $('input.pick_color').colorPicker(); - $('#calendar_modify_dialog_tabs').tabs(); - - if (enable_calendar_sharing === true && data.shared !== true) { - share_manager(); - } - }); -}; - - -/** - * Shows the 'Delete calendar' dialog - */ -var calendar_delete_dialog = function calendar_delete_dialog(calendar_obj) { - destroy_dialog('#calendar_modify_dialog'); - var form_url = base_app_url + 'calendar/delete'; - var title = t('labels', 'deletecalendar'); - - var data = calendar_obj; - $.extend(data, { - applyid: 'calendar_delete_form', - frm: { - action: form_url, - method: 'post', - csrf: get_csrf_token() - } - }); - - show_dialog('calendar_delete_dialog', - data, - title, - [ - { - 'text': t('labels', 'yes'), - 'class': 'addicon btn-icon-calendar-delete', - 'click': function() { - var thisform = $('#calendar_delete_form'); - proceed_send_ajax_form(thisform, - function(removed_calendar) { - // Just remove deleted calendar - $('.calendar_list li.available_calendar').each(function(index) { - var thiscal = $(this).data(); - if (thiscal.calendar == removed_calendar) { - $('#calendar_view').fullCalendar('removeEventSource', thiscal.eventsource); - $(this).remove(); - return false; // stop looking for calendar - } - }); - }, - function(data) { - show_error(t('messages', 'error_caldelete'), data); - }, - function() {}); - - // Destroy dialog - destroy_dialog('#calendar_delete_dialog'); - } - }, - { - 'text': t('labels', 'cancel'), - 'class': 'addicon btn-icon-cancel', - 'click': function() { destroy_dialog('#calendar_delete_dialog'); } - } - ], - 'calendar_delete_dialog', - 500, - function() { }); -}; - -/* - * Updates the calendar list and generates eventSources for fullcalendar - */ - -var update_calendar_list = function update_calendar_list(maskbody) { - if (maskbody) { - loading(true); - } - - var updcalendar_ajax_req = $.ajax({ - url: base_app_url + 'calendar/all', - cache: false, - dataType: 'json', - async: false // Let's wait - }); - - updcalendar_ajax_req.then(function() { - if (maskbody) { - loading(false); - } - }); - - updcalendar_ajax_req.fail(function(jqXHR, textStatus, errorThrown) { - show_error(t('messages', 'error_loading_calendar_list'), - t('messages', 'error_oops') + textStatus); - }); - - updcalendar_ajax_req.done(function(data, textStatus, jqXHR) { - var was_transparent = {}; - - // Remove old eventSources and remove every list item - $('.calendar_list li.available_calendar').each(function(index) { - var data = $(this).data(); - $('#calendar_view').fullCalendar('removeEventSource', - data.eventsource); - - if ($(this).hasClass('transparent')) { - was_transparent[data.calendar] = true; - } - - $(this).remove(); - }); - - var count = 0, - count_shared = 0, - own_calendars = document.createDocumentFragment(), - shared_calendars = document.createDocumentFragment(), - collected_event_sources = []; - - $.each(data, function(key, calendar) { - count++; - - // Some values need to be generated - if (calendar.color === undefined || calendar.color === false || calendar.color == null) { - calendar.color = default_calendar_color; - } else { - calendar.color = calendar.color.substr(0,7); - } - calendar.fg = fg_for_bg(calendar.color); - calendar.bordercolor = $.color.parse(calendar.color).scale('rgb', - (calendar.fg == '#000000' ? 0.8 : 1.8)).toString(); - - var li = generate_calendar_entry(calendar); - - if (was_transparent[calendar.calendar]) { - li.addClass('transparent'); - } else { - collected_event_sources.push($(li).data().eventsource); - } - - if (calendar.shared == true) { - count_shared++; - shared_calendars.appendChild(li[0]); - } else { - own_calendars.appendChild(li[0]); - } - - }); - - // No calendars? - if (count == 0) { - // Some CalDAV servers (e.g. DAViCal) create first calendar on first - // login. Let's reload calendar list again - var last_calendar_count = get_data('last_calendar_count'); - if (last_calendar_count === undefined || - last_calendar_count != '0') { - set_data('last_calendar_count', 0); - setTimeout(function() { - update_calendar_list(false); - }, 1); - } else { - // Calendar list received empty twice - show_error(t('messages','notice_no_calendars'), ''); - $('#shortcut_add_event').button('disable'); - } - } else { - set_data('last_calendar_count', count); - - $('#own_calendar_list ul')[0] - .appendChild(own_calendars); - - // Hide unused block - if (count_shared == 0) { - $('#shared_calendar_list').hide(); - } else { - $('#shared_calendar_list ul')[0] - .appendChild(shared_calendars); - $('#shared_calendar_list').show(); - } - - // Add event sources - while (count--) { - $('#calendar_view').fullCalendar('addEventSource', - collected_event_sources[count]); - } - - $('#shortcut_add_event').button('enable'); - - } - }); -}; - -/** - * Function used to query the server for events - */ -var generate_event_source = function generate_event_source(calendar) { - var ajax_options = { - // If #calendar is not used, Fullcalendar will be confused when - // calling removeEventSource, and will remove all calendars - url: base_app_url + 'event/all#' + calendar, - cache: false, - // TODO make timezone configurable - data: { - calendar: calendar - }, - error: function (jqXHR, textStatus, errorThrown) { - if (jqXHR.status !== undefined && jqXHR.status == 401) { - session_expired(); - } else { - show_error(t('messages', 'error_interfacefailure'), - t('messages', - 'error_loadevents', { '%cal' : calendar })); - } - }, - - startParamUTC: true, - endParamUTC: true - }; - - return ajax_options; -}; - -/** - * Keeps session alive - * - * n = refresh interval in miliseconds - */ -var session_refresh = function session_refresh(n) { - var sessrefresh_ajax_req = $.ajax({ - url: base_app_url + 'js_generator/keepalive', - cache: false, - method: 'GET', - dataType: 'html' - }); - - sessrefresh_ajax_req.done(function(data, textStatus, jqXHR) { - if (data !== '') { - // When data is not empty, it's usually JavaScript code - // TODO think about using dataType: script here - $('body').append(data); - } else { - setTimeout(function() { - session_refresh(n); - }, n); - } - }); - - sessrefresh_ajax_req.fail(function(jqXHR, textStatus, errorThrown) { - session_expired(); - }); -}; - -/** - * Adds button icons - */ -var add_button_icons = function add_button_icons(buttons) { - buttons.filter('button.addicon') - .removeClass('addicon') - .removeClass('ui-button-text-only') - .addClass('ui-button-text-icon-primary') - .each(function(k, v) { - var classes = $(v).attr('class').split(' '); - $.each(classes, function(i, j) { - if (j.match(/^btn-icon-/)) { - $(v).prepend(''); - $(v).removeClass(j); - return false; - } - }); - }); -}; - -/** - * Generates a new calendar entry - */ -var generate_calendar_entry = function generate_calendar_entry(data) { - var eventsource = generate_event_source(data.calendar); - eventsource.ignoreTimezone = true; // Ignore UTC offsets - eventsource.color = data.color; - eventsource.textColor = data.fg; - eventsource.borderColor = data.bordercolor; - - // Shared calendars - if (data.shared !== undefined && data.shared == true && data.write_access == '0') { - eventsource.editable = false; - } - - data.eventsource = eventsource; - - var $out; - - dust.render('calendar_list_entry', dustbase.push(data), function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - $out = $(out); - - // Associate data + eventsource to new list item - $out.data(data); - - // Disable text selection on this (useful for dblclick) - $out.disableSelection(); - - $out.find('span[title],i[title]').qtip({ - position: { - my: 'top left', - at: 'bottom left' - }, - show: { - delay: 600 - }, - style: { - classes: 'ui-tooltip-bootstrap', - tip: true - } - }); - } - }); - - return $out; -}; - -/** - * Gets calendar data from its internal name - */ -var get_calendar_data = function get_calendar_data(c) { - var data = undefined; - - $('.calendar_list li.available_calendar').each(function(index) { - var thiscal = $(this).data(); - if (thiscal.calendar == c) { - data = thiscal; - return false; // stop looking for calendar - } - }); - - return data; -}; - -/** - * Gets calendar display name from its internal name - */ -var get_calendar_displayname = function get_calendar_displayname(c) { - var data = get_calendar_data(c); - - if (data === undefined || data.displayname === undefined) { - return '(?)'; - } else { - return data.displayname; - } -}; - -/* - * Reloads an event source - */ -var reload_event_source = function reload_event_source(cal) { - var eventsource = undefined; - - $('.calendar_list li.available_calendar').each(function(index) { - var thiscal = $(this).data(); - if (thiscal.calendar == cal) { - eventsource = thiscal.eventsource; - return false; // stop looking for calendar - } - }); - - if (eventsource !== undefined) { - $('#calendar_view').fullCalendar('removeEventSource', eventsource); - $('#calendar_view').fullCalendar('addEventSource', eventsource); - } else { - show_error(t('messages', 'error_interfacefailure'), - t('messages', 'error_calendarnotfound', {'%calendar' : cal })); - } - -}; - -/* - * Enforces the use of only one recurrence fields - */ -var enforce_exclusive_recurrence_field = function enforce_exclusive_recurrence_field(current, other) { - if ($(ced + ' input.' + current).val() == '') { - $(ced + ' input.' + other).removeAttr('disabled'); - $(ced + ' input.' + other).removeClass('ui-state-disabled'); - $(ced + ' label[for="' + other + '"]').removeClass('ui-state-disabled'); - if (other == 'recurrence_until') { - $(ced + ' input.' + other).datepicker('enable'); - } - } else { - $(ced + ' input.' + other).attr('disabled', 'disabled'); - $(ced + ' input.' + other).addClass('ui-state-disabled'); - $(ced + ' input.' + other).val(''); - $(ced + ' label[for="' + other + '"]').addClass('ui-state-disabled'); - if (other == 'recurrence_until') { - $(ced + ' input.' + other).datepicker('disable'); - } - } -}; - -/* - * Round a Date timestamp - */ -var timestamp = function timestamp(d) { - return Math.round(d.getTime()/1000); -}; - -/* - * Returns a full date+time string which is easily parseable - */ -var fulldatetimestring = function fulldatetimestring(d) { - if (d != undefined) { - return $.fullCalendar.formatDate(d, 'yyyyMMddHHmmss'); - } else { - return undefined; - } -}; - -/** - * Returns a foreground color for a given background - */ -var fg_for_bg = function fg_for_bg(color) { - var colr = parseInt(color.substr(1), 16); - - var is_dark = (colr >>> 16) // R - + ((colr >>> 8) & 0x00ff) // G - + (colr & 0x0000ff) // B - < 500; - - return (is_dark) ? '#ffffff' : '#000000'; -}; - - -/** - * This method is called when a session has expired - */ -var session_expired = function session_expired() { - $('.ui-dialog-content').dialog('close'); - - show_error(t('messages', 'error_sessexpired'), - t('messages', 'error_loginagain')); - setTimeout(function() { - window.location = base_url; - }, 2000); -}; - -/** - * Handles events on share calendar dialog - */ -var share_manager = function share_manager() { - var manager = $('#calendar_share_table'); - var new_entry_form = $('#calendar_share_add'); - - share_manager_no_entries_placeholder(); - - manager.on('click', - '.calendar_share_delete', function(event) { - $(this).parent().parent() - .fadeOut('fast', function() { - $(this).remove(); - share_manager_no_entries_placeholder(); - }); - }); - - // Autocomplete caching - var user_autocomplete_cache = {}, lastXhr; - - new_entry_form.find('#calendar_share_add_username') - .autocomplete({ - minLength: 3, - source: function(request, response) { - var term = request.term; - - if (term in user_autocomplete_cache) { - response(user_autocomplete_cache[term]); - return; - } - - lastXhr = $.getJSON(base_app_url + 'caldav2json/principal_search', - request, function(data, status, xhr) { - user_autocomplete_cache[term] = data; - if (xhr === lastXhr) { - response(data); - } - }); - }, - focus: function( event, ui ) { - $(this).val(ui.item.username); - return false; - }, - select: function( event, ui ) { - $(this).val(ui.item.username); - return false; - } - }) - .data('autocomplete')._renderItem = function(ul, item) { - return $('
  • ') - .data('item.autocomplete', item) - .append(' ' + item.displayname - + '' - + ' <' + item.email + '>') - .appendTo(ul); - }; - - new_entry_form.on('click', - '#calendar_share_add_button', function(event) { - var new_user = $('#calendar_share_add_username').val(); - var access = $('#calendar_share_add_write_access').val(); - if (new_user != '') { - // Check if new_user is already on list - var already_added = false; - manager.find('span.username') - .each(function(index) { - if (!already_added && $(this).text() == new_user) { - already_added = true; - $(this).parent().parent().effect('highlight', {}, 'slow'); - } - }); - - if (!already_added) { - var new_row_data = { - username: new_user, - write_access: access - }; - - dust.render('calendar_share_row', - dustbase.push(new_row_data), - function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - manager.find('tbody').append(out); - - // Reset form - $('#calendar_share_add_username').val(''); - $('#calendar_share_add_write_access').val('0'); - - share_manager_no_entries_placeholder(); - } - }); - } - } - - }); -}; - -/** - * Shows the placeholder for empty share lists - */ -var share_manager_no_entries_placeholder = function share_manager_no_entries_placeholder() { - var manager = $('#calendar_share_table'); - if (manager.find('tbody tr').length == 1) { - $('#calendar_share_no_rows').show(); - } else { - $('#calendar_share_no_rows').hide(); - } -}; - - -/* - * Reminders manager - */ - -var reminders_manager = function reminders_manager() { - - var tab_reminders = $('#tabs-reminders'); - var manager = $('#reminders_table'); - - initialize_date_and_time_pickers(tab_reminders); - - reminders_manager_no_entries_placeholder(); - - manager.on('click', - '.reminder_delete', function(event) { - $(this).parent().parent() - .fadeOut('fast', function() { - $(this).remove(); - reminders_manager_no_entries_placeholder(); - }); - }); - - manager.parent().on('click', 'img.reminder_add_button', function(event) { - var formdata = $(this).closest('tbody').serializeObject(); - // Basic validations - var proceed = false; - var regexp_num = /^[0-9]+$/; - - if (formdata.is_absolute === false) { - if (formdata.qty !== '' && regexp_num.test(formdata.qty) && - formdata.interval !== '' && formdata.before !== '') { - - proceed = true; - } - } else { - if (formdata.tdate !== '' && formdata.ttime !== '') { - proceed = true; - } - } - - if (proceed === true) { - var $new_reminder_row = $(this).closest('tr'); - - dust.render('reminder_row', - dustbase.push(formdata), function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - manager.find('tbody').append(out); - - $new_reminder_row.find('input').val(''); - $new_reminder_row.find('select').val(''); - - initialize_date_and_time_pickers(tab_reminders); - reminders_manager_no_entries_placeholder(); - } - }); - - } - }); -}; - -/* - * Shows/hides reminders placeholder when no reminders are set up - */ - -var reminders_manager_no_entries_placeholder = function reminders_manager_no_entries_placeholder() { - var manager = $('#reminders_table'); - if (manager.find('tbody tr').length == 1) { - $('#reminders_no_rows').show(); - } else { - $('#reminders_no_rows').hide(); - } -} - - - -/** - * Event render - */ -var event_render_callback = function event_render_callback(event, element) { - var caldata = get_calendar_data(event.calendar); - var data = $.extend({}, - event, - { caldata: caldata }); - - if (caldata !== undefined && caldata.shared === true && - caldata.write_access == '0') { - $.extend(data, { disable_actions: true }); - } - - // Icons - var icons = []; - - if (event.rrule != undefined) { - icons.push('icon-repeat'); - } - if (event.reminders.length > 0) { - icons.push('icon-bell'); - } - - // Prepend icons - if (icons.length != 0) { - var icon_html = $(''); - $.each(icons, function(n, i) { - icon_html.append(''); - }); - - if (!element.hasClass('fc-event-row')) { - element.find('.fc-event-title').after(icon_html); - } - } - - dust.render('event_details_popup', dustbase.push(data), function(err, out) { - if (err != null) { - show_error(t('messages', 'error_interfacefailure'), - err.message); - } else { - element.qtip({ - content: { - text: out, - title: { - text: event.title, - button: true - } - }, - position: { - my: 'bottom center', - at: 'top center', - viewport: $('#calendar_view') - }, - style: { - classes: 'view_event_details ui-tooltip-bootstrap', - tip: true - }, - show: { - target: $('#calendar_view'), - event: false, - solo: $('#calendar_view'), - effect: false - }, - hide: { - fixed: true, - event: 'unfocus', - effect: false - }, - - events: { - show: function (event, api) { - // Attach modify and delete events - $(this) - .find('button.link_delete_event') - .off('click') - .on('click', function() { - event_delete_dialog(); - }) - .end() - .find('button.link_modify_event') - .off('click') - .on('click', function() { - modify_event_handler(); - }); - - $(window).on('keydown.tooltipevents', function(e) { - if(e.keyCode === $.ui.keyCode.ESCAPE) { - api.hide(e); - } - }) - - // Icons - var links = api.elements.tooltip.find('div.actions').find('button.addicon').button(); - add_button_icons(links); - }, - - hide: function (event, api) { - remove_data('current_event'); - $(window).off('keydown.tooltipevents'); - } - } - }); - } - }); -}; - -/** - * Event click - */ -var event_click_callback = function event_click_callback(event, - jsEvent, view) { - var current_event = get_data('current_event'); - - if (current_event == event) { - $(ved).qtip('hide'); - remove_data('current_event'); - } else { - set_data('current_event', event); - $(this).qtip('show', jsEvent); - } - -}; - -/** - * Calendar slots dragging - */ -var slots_drag_callback = function slots_drag_callback(startDate, endDate, allDay, jsEvent, view) { - var pass_allday = (view.name == 'month') ? false : allDay; - var data = { - start: fulldatetimestring(startDate), - end: fulldatetimestring(endDate), - allday: pass_allday, - view: view.name - }; - - // Unselect every single day/slot - $('#calendar_view').fullCalendar('unselect'); - event_field_form('new', data); -}; - -/** - * Select helper - */ - -var select_helper = function select_helper(start,end) { - return $('
    ') - .text( - $.fullCalendar.formatDates(start, end, - AgenDAVConf.prefs_timeformat + '{ - ' + AgenDAVConf.prefs_timeformat + '}')); -}; - -/** - * Event resizing - */ - -var event_resize_callback = function event_resize_callback(event, dayDelta, minuteDelta, revertFunc, - jsEvent, ui, view ) { - - // Generate on-the-fly form - var formid = generate_on_the_fly_form( - base_app_url + 'event/alter', - { - uid: event.uid, - calendar: event.calendar, - etag: event.etag, - view: view.name, - dayDelta: dayDelta, - minuteDelta: minuteDelta, - allday: event.allDay, - was_allday: event.was_allday, - timezone: event.timezone, - type: 'resize' - }); - - if (get_data('formcreation') == 'ok') { - var thisform = $('#' + formid); - - proceed_send_ajax_form(thisform, - function(data) { - // Users just want to know if something fails - update_single_event(event, data); - }, - function(data) { - show_error(t('messages', 'error_modfailed'), data); - revertFunc(); - }, - function() { - revertFunc(); - }); - } - - // Remove generated form - $(thisform).remove(); -}; - -/** - * Event drag and drop - */ - -var event_drop_callback = function event_drop_callback(event, dayDelta, minuteDelta, allDay, - revertFunc, jsEvent, ui, view) { - - // Generate on-the-fly form - var formid = generate_on_the_fly_form( - base_app_url + 'event/alter', - { - uid: event.uid, - calendar: event.calendar, - etag: event.etag, - view: view.name, - dayDelta: dayDelta, - minuteDelta: minuteDelta, - allday: event.allDay, - was_allday: event.orig_allday, - timezone: event.timezone, - type: 'drag' - }); - - if (get_data('formcreation') == 'ok') { - var thisform = $('#' + formid); - - proceed_send_ajax_form(thisform, - function(data) { - // Users just want to know if something fails - update_single_event(event, data); - }, - function(data) { - show_error(t('messages', 'error_modfailed'), data); - revertFunc(); - }, - function() { - revertFunc(); - }); - } - - // Remove generated form - $(thisform).remove(); -}; - -// Delete link -// TODO: check for rrule/recurrence-id (EXDATE, etc) -var event_delete_dialog = function event_delete_dialog() { - var form_url = base_app_url + 'event/delete'; - var title = t('labels', 'deleteevent'); - - var data = get_data('current_event'); - - if (data === undefined) { - show_error(t('messages', 'error_interfacefailure'), - t('messages', 'error_current_event_not_loaded')); - return; - } - - $.extend(data, { - applyid: 'event_delete_form', - frm: { - action: form_url, - method: 'post', - csrf: get_csrf_token() - } - }); - - show_dialog('event_delete_dialog', - data, - title, - [ - { - 'text': t('labels', 'yes'), - 'class': 'addicon btn-icon-event-delete', - 'click': function() { - var thisform = $('#event_delete_form'); - proceed_send_ajax_form(thisform, - function(rdata) { - $('#calendar_view').fullCalendar('removeEvents', data.id); - }, - function(rdata) { - show_error(t('messages', 'error_event_not_deleted'), data); - }, - function() {}); - - // Destroy dialog - destroy_dialog('#event_delete_dialog'); - } - }, - { - 'text': t('labels', 'cancel'), - 'class': 'addicon btn-icon-cancel', - 'click': function() { destroy_dialog('#event_delete_dialog'); } - } - ], - 'event_delete_dialog', - 400, - function() {}); - - // Close tooltip - $(ved).qtip('hide'); - return false; -}; - -// Edit/Modify link -var modify_event_handler = function modify_event_handler() { - // TODO: check for rrule/recurrence-id - // Data about this event - var event_data = get_data('current_event'); - if (event_data === undefined) { - show_error(t('messages', 'error_interfacefailure'), - t('messages', 'error_current_event_not_loaded')); - return; - } - - var data = { - uid: event_data.uid, - calendar: event_data.calendar, - href: event_data.href, - etag: event_data.etag, - start: fulldatetimestring(event_data.start), - end: fulldatetimestring(event_data.end), - summary: event_data.title, - location: event_data.location, - allday: event_data.allDay, - description: event_data.description, - rrule: event_data.rrule, - rrule_serialized: event_data.rrule_serialized, - rrule_explained: event_data.rrule_explained, - icalendar_class: event_data.icalendar_class, - transp: event_data.transp, - recurrence_id: event_data.recurrence_id, - reminders: event_data.reminders, - visible_reminders: event_data.visible_reminders, - orig_start: fulldatetimestring($.fullCalendar.parseDate(event_data.orig_start)), - orig_end: fulldatetimestring($.fullCalendar.parseDate(event_data.orig_end)) - }; - // Close tooltip - $(ved).qtip('hide'); - - event_field_form('modify', data); - - return false; -}; - -// Shows a calendar -var show_calendar = function show_calendar(calendar_obj) { - $('#calendar_view').fullCalendar('addEventSource', calendar_obj.data().eventsource); - calendar_obj.removeClass('transparent'); -}; - -// Hides a calendar -var hide_calendar = function hide_calendar(calendar_obj) { - $('#calendar_view').fullCalendar('removeEventSource', calendar_obj.data().eventsource); - calendar_obj.addClass('transparent'); -}; - -// Toggles calendar visibility -var toggle_calendar = function toggle_calendar(calendar_obj) { - if (calendar_obj.hasClass('transparent')) { - show_calendar(calendar_obj); - } else { - hide_calendar(calendar_obj); - } -}; - -// Initializes datepickers and timepickers -var initialize_date_and_time_pickers = function initialize_date_and_time_pickers(obj) { - obj.find('.needs-datepicker').datepicker(); - obj.find('.needs-timepicker').timePicker(AgenDAVConf.timepicker_base); -}; - - -// Gets csrf token value -var get_csrf_token = function get_csrf_token() { - return $.cookie(AgenDAVConf.prefs_csrf_cookie_name); -} - -// Loading indicator -var loading = function loading(status) { - if (status === false) { - $('#loading').hide(); - } else { - $('#loading').show(); - } -} - -// Printing helpers - -var beforePrint = function beforePrint() { - // Prepare calendar for printing - $('#calendar_view').addClass('printing'); - $('#calendar_view').fullCalendar('render'); -}; - -var afterPrint = function afterPrint() { - $('#calendar_view').removeClass('printing'); - $('#calendar_view').fullCalendar('render'); -}; - - -// Apply printing helpers to document -var setup_print_tweaks = function setup_print_tweaks() { - if (window.matchMedia) { - var mediaQueryList = window.matchMedia('print'); - mediaQueryList.addListener(function(mql) { - if (mql.matches) { - beforePrint(); - } else { - afterPrint(); - } - }); - } - - window.onbeforeprint = beforePrint; - window.onafterprint = afterPrint; -}; - - -// vim: sw=2 tabstop=2 diff --git a/sources/web/public/js/jquery-base-1.2.6.2.js b/sources/web/public/js/jquery-base-1.2.6.2.js deleted file mode 100644 index 96e66d7..0000000 --- a/sources/web/public/js/jquery-base-1.2.6.2.js +++ /dev/null @@ -1,128 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
    "+""+"
    ",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
    t
    ",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
    ",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.core.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.23",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a("").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.curCSS||(a.curCSS=a.css),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.position.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),a.curCSS||(a.curCSS=a.css),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.draggable.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.23"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.selectable.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
    ")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.23",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.autocomplete.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("
      ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("
      ").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.dialog.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
      ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),f=a("
      ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(f);a.each(d,function(a,b){if(a==="click")return;a in e?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.23",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.tabs.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
    • #{label}
    • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.23"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.23"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
      ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a)),this._attachHandlers(a);var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+(c?0:$(document).scrollLeft()),i=document.documentElement.clientHeight+(c?0:$(document).scrollTop());return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_attachHandlers:function(a){var b=this._get(a,"stepMonths"),c="#"+a.id.replace(/\\\\/g,"\\");a.dpDiv.find("[data-handler]").map(function(){var a={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,-b,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,+b,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(c)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(c,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),a[this.getAttribute("data-handler")])})},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
      '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
      ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
      '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
      '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
      "+(j?"
      "+(g[0]>0&&N==g[1]-1?'
      ':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
      ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
      ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.23",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.progressbar.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
      ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.core.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.23",save:function(a,b){for(var c=0;c
      ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}});var m={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,b){m[b]=function(b){return Math.pow(b,a+2)}}),a.extend(m,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return a===0||a===1?a:-Math.pow(2,8*(a-1))*Math.sin(((a-1)*80-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){var b,c=4;while(a<((b=Math.pow(2,--c))-1)/11);return 1/Math.pow(4,3-c)-7.5625*Math.pow((b*3-2)/22-a,2)}}),a.each(m,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return a<.5?c(a*2)/2:c(a*-2+2)/-2+1}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.blind.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.bounce.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m
      ").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.fade.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.fold.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.highlight.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.pulsate.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/sources/web/public/js/libs/dust-core-1.0.0.js b/sources/web/public/js/libs/dust-core-1.0.0.js deleted file mode 100644 index c4d5cd0..0000000 --- a/sources/web/public/js/libs/dust-core-1.0.0.js +++ /dev/null @@ -1,727 +0,0 @@ -// -// Dust - Asynchronous Templating v1.0.0 -// http://akdubya.github.com/dustjs -// -// Copyright (c) 2010, Aleksander Williams -// Released under the MIT License. -// - -var dust = {}; - -function getGlobal(){ - return (function(){ - return this.dust; - }).call(null); -} - -(function(dust) { - -dust.cache = {}; - -dust.register = function(name, tmpl) { - if (!name) return; - dust.cache[name] = tmpl; -}; - -dust.render = function(name, context, callback) { - var chunk = new Stub(callback).head; - dust.load(name, chunk, Context.wrap(context)).end(); -}; - -dust.stream = function(name, context) { - var stream = new Stream(); - dust.nextTick(function() { - dust.load(name, stream.head, Context.wrap(context)).end(); - }); - return stream; -}; - -dust.renderSource = function(source, context, callback) { - return dust.compileFn(source)(context, callback); -}; - -dust.compileFn = function(source, name) { - var tmpl = dust.loadSource(dust.compile(source, name)); - return function(context, callback) { - var master = callback ? new Stub(callback) : new Stream(); - dust.nextTick(function() { - tmpl(master.head, Context.wrap(context)).end(); - }); - return master; - } -}; - -dust.load = function(name, chunk, context) { - var tmpl = dust.cache[name]; - if (tmpl) { - return tmpl(chunk, context); - } else { - if (dust.onLoad) { - return chunk.map(function(chunk) { - dust.onLoad(name, function(err, src) { - if (err) return chunk.setError(err); - if (!dust.cache[name]) dust.loadSource(dust.compile(src, name)); - dust.cache[name](chunk, context).end(); - }); - }); - } - return chunk.setError(new Error("Template Not Found: " + name)); - } -}; - -dust.loadSource = function(source, path) { - return eval(source); -}; - -if (Array.isArray) { - dust.isArray = Array.isArray; -} else { - dust.isArray = function(arr) { - return Object.prototype.toString.call(arr) == "[object Array]"; - }; -} - -dust.nextTick = (function() { - if (typeof process !== "undefined") { - return process.nextTick; - } else { - return function(callback) { - setTimeout(callback,0); - } - } -} )(); - -dust.isEmpty = function(value) { - if (dust.isArray(value) && !value.length) return true; - if (value === 0) return false; - return (!value); -}; - -dust.filter = function(string, auto, filters) { - if (filters) { - for (var i=0, len=filters.length; i\"\']/), - AMP = /&/g, - LT = //g, - QUOT = /\"/g, - SQUOT = /\'/g; - -dust.escapeHtml = function(s) { - if (typeof s === "string") { - if (!HCHARS.test(s)) { - return s; - } - return s.replace(AMP,'&').replace(LT,'<').replace(GT,'>').replace(QUOT,'"').replace(SQUOT, '''); - } - return s; -}; - -var BS = /\\/g, - CR = /\r/g, - LS = /\u2028/g, - PS = /\u2029/g, - NL = /\n/g, - LF = /\f/g, - SQ = /'/g, - DQ = /"/g, - TB = /\t/g; - -dust.escapeJs = function(s) { - if (typeof s === "string") { - return s - .replace(BS, '\\\\') - .replace(DQ, '\\"') - .replace(SQ, "\\'") - .replace(CR, '\\r') - .replace(LS, '\\u2028') - .replace(PS, '\\u2029') - .replace(NL, '\\n') - .replace(LF, '\\f') - .replace(TB, "\\t"); - } - return s; -}; - -})(dust); - -if (typeof exports !== "undefined") { - //TODO: Remove the helpers from dust core in the next release. - dust.helpers = require("../dust-helpers/lib/dust-helpers").helpers; - if (typeof process !== "undefined") { - require('./server')(dust); - } - module.exports = dust; -} -(function(dust){ - -/* make a safe version of console if it is not available - * currently supporting: - * _console.log - * */ -var _console = (typeof console !== 'undefined')? console: { - log: function(){ - /* a noop*/ - } -}; - -function isSelect(context) { - var value = context.current(); - return typeof value === "object" && value.isSelect === true; -} - -function filter(chunk, context, bodies, params, filter) { - var params = params || {}, - actual, - expected; - if (params.key) { - actual = helpers.tap(params.key, chunk, context); - } else if (isSelect(context)) { - actual = context.current().selectKey; - if (context.current().isResolved) { - filter = function() { return false; }; - } - } else { - throw "No key specified for filter and no key found in context from select statement"; - } - expected = helpers.tap(params.value, chunk, context); - if (filter(expected, coerce(actual, params.type, context))) { - if (isSelect(context)) { - context.current().isResolved = true; - } - return chunk.render(bodies.block, context); - } else if (bodies['else']) { - return chunk.render(bodies['else'], context); - } - - return chunk.write(''); -} - -function coerce (value, type, context) { - if (value) { - switch (type || typeof(value)) { - case 'number': return +value; - case 'string': return String(value); - case 'boolean': return Boolean(value); - case 'date': return new Date(value); - case 'context': return context.get(value); - } - } - - return value; -} - -var helpers = { - - sep: function(chunk, context, bodies) { - if (context.stack.index === context.stack.of - 1) { - return chunk; - } - return bodies.block(chunk, context); - }, - - idx: function(chunk, context, bodies) { - return bodies.block(chunk, context.push(context.stack.index)); - }, - - contextDump: function(chunk, context, bodies) { - _console.log(JSON.stringify(context.stack)); - return chunk; - }, - - // Utility helping to resolve dust references in the given chunk - tap: function( input, chunk, context ){ - // return given input if there is no dust reference to resolve - var output = input; - // dust compiles a string to function, if there are references - if( typeof input === "function"){ - output = ''; - chunk.tap(function(data){ - output += data; - return ''; - }).render(input, context).untap(); - if( output === '' ){ - output = false; - } - } - return output; - }, - - /** - if helper - @param cond, either a string literal value or a dust reference - a string literal value, is enclosed in double quotes, e.g. cond="2>3" - a dust reference is also enclosed in double quotes, e.g. cond="'{val}'' > 3" - cond argument should evaluate to a valid javascript expression - **/ - - "if": function( chunk, context, bodies, params ){ - if( params && params.cond ){ - var cond = params.cond; - cond = this.tap(cond, chunk, context); - // eval expressions with given dust references - if( eval( cond ) ){ - return chunk.render( bodies.block, context ); - } - if( bodies['else'] ){ - return chunk.render( bodies['else'], context ); - } - } - // no condition - else { - _console.log( "No condition given in the if helper!" ); - } - return chunk; - }, - - /** - select/eq/lt/lte/gt/gte/default helper - @param key, either a string literal value or a dust reference - a string literal value, is enclosed in double quotes, e.g. key="foo" - a dust reference may or may not be enclosed in double quotes, e.g. key="{val}" and key=val are both valid - @param type (optiona), supported types are number, boolean, string, date, context, defaults to string - **/ - select: function(chunk, context, bodies, params) { - if( params && params.key){ - // returns given input as output, if the input is not a dust reference, else does a context lookup - var key = this.tap(params.key, chunk, context); - return chunk.render(bodies.block, context.push({ isSelect: true, isResolved: false, selectKey: key })); - } - // no key - else { - _console.log( "No key given in the select helper!" ); - } - return chunk; - }, - - eq: function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return actual === expected; }); - }, - - lt: function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return actual < expected; }); - }, - - lte: function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return actual <= expected; }); - }, - - gt: function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return actual > expected; }); - }, - - gte: function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return actual >= expected; }); - }, - - "default": function(chunk, context, bodies, params) { - return filter(chunk, context, bodies, params, function(expected, actual) { return true; }); - } -}; - -dust.helpers = helpers; - -})(typeof exports !== 'undefined' ? exports : getGlobal()); diff --git a/sources/web/public/js/libs/fullcalendar.min.js b/sources/web/public/js/libs/fullcalendar.min.js deleted file mode 100644 index b0a2587..0000000 --- a/sources/web/public/js/libs/fullcalendar.min.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - - FullCalendar v1.5.3-rcube-0.7.1 - https://github.com/roundcube/fullcalendar - - Use fullcalendar.css for basic styling. - For event drag & drop, requires jQuery UI draggable. - For event resizing, requires jQuery UI resizable. - - Copyright (c) 2011 Adam Shaw - Copyright (c) 2011, Kolab Systems AG - Dual licensed under the MIT and GPL licenses, located in - MIT-LICENSE.txt and GPL-LICENSE.txt respectively. - - Date: Wed Mar 21 22:49:40 2012 +0100 - -*/ -(function(o,sa){function Ab(a){o.extend(true,$a,a)}function $b(a,b,g){function c(l){if(H){u();R();aa();O(l)}else f()}function f(){P=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");H=o("
      ").prependTo(a);y=new ac(A,b);(Q=y.render())&&a.prepend(Q);r(b.defaultView);o(window).resize(la);d()||k()}function k(){setTimeout(function(){!i.start&&d()&&O()},0)}function q(){o(window).unbind("resize",la);y.destroy(); -H.remove();a.removeClass("fc fc-rtl ui-widget")}function h(){return ma.offsetWidth!==0}function d(){return o("body")[0].offsetWidth!==0}function r(l){if(!i||l!=i.name){m++;ja();var s=i,da;if(s){(s.beforeHide||Bb)();ab(H,H.height());s.element.hide()}else ab(H,1);H.css("overflow","hidden");if(i=F[l])i.element.show();else i=F[l]=new Ha[l](da=ya=o("
      ").appendTo(H),A);s&&y.deactivateButton(s.name);y.activateButton(l);O();H.css("overflow",""); -s&&ab(H,1);da||(i.afterShow||Bb)();m--}}function O(l){if(h()){m++;ja();fa===sa&&u();var s=false;if(!i.start||l||t=i.end){i.render(t,l||0);B(true);s=true}else if(i.sizeDirty){i.clearEvents();B();s=true}else if(i.eventsDirty){i.clearEvents();s=true}i.sizeDirty=false;i.eventsDirty=false;ea(s);ga=a.outerWidth();y.updateTitle(i.title);l=new Date;l>=i.start&&l").append(o("").append(f("left")).append(f("center")).append(f("right")))} -function c(){L.remove()}function f(u){var B=o("");(u=b.header[u])&&o.each(u.split(" "),function(la){la>0&&B.append("");var ea;o.each(this.split(","),function(na,T){if(T=="title"){B.append("

       

      ");ea&&ea.addClass(R+"-corner-right");ea=null}else{var N;if(a[T])N=a[T];else if(Ha[T])N=function(){aa.removeClass(R+"-state-hover");a.changeView(T)};if(N){na=b.theme?mb(b.buttonIcons,T):null;var V=mb(b.buttonText, -T),aa=o(""+(na?"":V)+"");if(aa){aa.click(function(){aa.hasClass(R+"-state-disabled")||N()}).mousedown(function(){aa.not("."+R+"-state-active").not("."+R+"-state-disabled").addClass(R+"-state-down")}).mouseup(function(){aa.removeClass(R+ -"-state-down")}).hover(function(){aa.not("."+R+"-state-active").not("."+R+"-state-disabled").addClass(R+"-state-hover")},function(){aa.removeClass(R+"-state-hover").removeClass(R+"-state-down")}).appendTo(B);ea||aa.addClass(R+"-corner-left");ea=aa}}}});ea&&ea.addClass(R+"-corner-right")});return B}function k(u){L.find("h2").html(u)}function q(u){L.find("span.fc-button-"+u).addClass(R+"-state-active")}function h(u){L.find("span.fc-button-"+u).removeClass(R+"-state-active")}function d(u){L.find("span.fc-button-"+ -u).addClass(R+"-state-disabled")}function r(u){L.find("span.fc-button-"+u).removeClass(R+"-state-disabled")}var O=this;O.render=g;O.destroy=c;O.updateTitle=k;O.activateButton=q;O.deactivateButton=h;O.disableButton=d;O.enableButton=r;var L=o([]),R}function bc(a,b){function g(e,M){return!C||eba}function c(e,M,A){C=e;ba=M;W=e.getTimezoneOffset()*60*1E3;w=M.getTimezoneOffset()*60*1E3;ca=typeof A!="undefined"?o.grep(ca,function(E){return!na(E.source,A)}):[];e=++p;M=v.length;I=typeof A=="undefined"? -M:1;for(var ha=0;haq;r--)if(O=fc[g.substring(q,r)]){if(f)L+=O(f,c);q=r-1;break}if(r==q)if(f)L+=d}}return L}function Wa(a){return a.end?gc(a.end,a.allDay):ka(G(a.start),1)}function gc(a,b){a=G(a);return b||a.getHours()||a.getMinutes()?ka(a,1):Ia(a)}function hc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Fb(a,b){return a.end>b.start&&a.startg&&dc){r=G(c);L=false}else{r=r;L=true}f.push({event:h,start:d,end:r,isStart:O,isEnd:L,msLength:r-d})}}return f.sort(hc)}function rb(a){var b=[],g,c=a.length,f,k,q,h;for(g=0;g=0;g--){c=a[b[g].toLowerCase()];if(c!== -sa)return c}return a[""]}function Ea(a){return a.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
      ")}function Lb(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function tb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function Sa(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")} -function ub(a,b){a.each(function(g,c){c.className=c.className.replace(/^fc-\w*/,"fc-"+Mb[b.getDay()])})}function cb(a,b){var g=a.source||{},c=a.color,f=g.color,k=b("eventColor"),q=a.backgroundColor||c||g.backgroundColor||f||b("eventBackgroundColor")||k;c=a.borderColor||c||g.borderColor||f||b("eventBorderColor")||k;a=a.textColor||g.textColor||b("eventTextColor");b=[];q&&b.push("background-color:"+q);c&&b.push("border-color:"+c);a&&b.push("color:"+a);return b.join(";")}function bb(a,b,g){if(o.isFunction(a))a= -[a];if(a){var c,f;for(c=0;c";for(ia=0;ia";$+="";for(ia=0;ia";for(S=0;S
      "+(J?"
      ":"")+"
       
      ";$+=""}$+=""; -x=o($).appendTo(a);E=x.find("thead");ma=E.find("th");y=x.find("tbody");Q=y.find("tr");H=y.find("td");P=H.filter(":first-child");i=Q.eq(0).find("div.fc-day-content div");Sa(E.add(E.find("tr")));Sa(Q);Q.eq(0).addClass("fc-first");r(H);F=o("
      ").appendTo(a)}function q(x){var J=x||j==1,$=p.start.getMonth(),S=Ia(new Date),oa,ia,va;J&&ma.each(function(wa,Ca){oa=o(Ca);ia=C(wa);oa.html(ha(ia,ua));ub(oa,ia)});H.each(function(wa,Ca){oa=o(Ca);ia=C(wa);ia.getMonth()== -$?oa.removeClass("fc-other-month"):oa.addClass("fc-other-month");+ia==+S?oa.addClass(qa+"-state-highlight fc-today"):oa.removeClass(qa+"-state-highlight fc-today");oa.find("div.fc-day-number").text(ia.getDate());J&&ub(oa,ia)});Q.each(function(wa,Ca){va=o(Ca);if(wa div"),(oa==j-1?$:J)-Ua(S))}})}function d(x){ga=x;z.clear();ya=Math.floor(ga/m);Xa(ma.slice(0,-1),ya)}function r(x){x.click(O).mousedown(A)}function O(x){if(!I("selectable")){var J=parseInt(this.className.match(/fc\-day(\d+)/)[1]);J=C(J);Y("dayClick",this,J,true,x)}}function L(x,J,$){$&&t.build();$=G(p.visStart);for(var S=ka(G($),m),oa=0;oa ";for(D=0;D";K+="  ";for(D=0;D
       
      "; -K+=" ";j=o(K).appendTo(a);m=j.find("thead");t=m.find("th").slice(1,-1);X=j.find("tbody");z=X.find("td").slice(0,-1);l=z.find("div.fc-day-content div");s=z.eq(0);da=s.find("> div");Sa(m.add(m.find("tr")));Sa(X.add(X.find("tr")));ia=m.find("th:first");va=j.find(".fc-agenda-gutter");pa=o("
      ").appendTo(a);if(ma("allDaySlot")){ra=o("
      ").appendTo(pa); -K="
      "+ma("allDayText")+"
       
      ";qa=o(K).appendTo(pa);ua=qa.find("tr");R(ua.find("td"));ia=ia.add(qa.find("th:first"));va=va.add(qa.find("th.fc-agenda-gutter"));pa.append("
      ")}else ra=o([]); -x=o("
      ").appendTo(pa);J=o("
      ").appendTo(x);$=o("
      ").appendTo(J);K="";ta=Db();za=xa(G(ta),eb);xa(ta,Ma);for(D=xb=0;ta";xa(ta,ma("slotMinutes"));xb++}K+="
      "+(!Ga||!Fa? -ya(ta,ma("axisFormat")):" ")+"
       
      ";S=o(K).appendTo(J);oa=S.find("div:first");u(S.find("td"));ia=ia.add(S.find("th:first"))}function q(){var n,U,K,D,ta=Ia(new Date);for(n=0;n=0&&xa(U,Ma+n*ma("slotMinutes"));return U}function Z(n){return ka(G(E.visStart),n*Ka+La)}function ja(n){return ma("allDaySlot")&&!n.row}function v(n){return(n-Math.max(Ub,Tb)+Da)%Da*Ka+La}function C(n,U){n=G(n,true);if(U=xa(G(n),eb))return S.height();n=ma("slotMinutes"); -U=U.getHours()*60+U.getMinutes()-Ma;var K=Math.floor(U/n),D=yb[K];if(D===sa)D=yb[K]=S.find("tr:eq("+K+") td div")[0].offsetTop;return Math.max(0,Math.round(D-1+Za*(U%n/n)))}function ba(){return{left:Na,right:Ca-zb}}function W(){return ua}function w(n){var U=G(n.start);if(n.allDay)return U;return xa(U,ma("defaultEventMinutes"))}function p(n,U){if(U)return G(n);return xa(G(n),ma("slotMinutes"))}function I(n,U,K){if(K)ma("allDaySlot")&&la(n,ka(G(U),1),true);else Y(n,U)}function Y(n,U){var K=ma("selectHelper"); -Oa.build();if(K){var D=Ba(n,E.visStart)*Ka+La;if(D>=0&&Dta){D.top=ta;D.height=za-ta;D.left+=2;D.width-=5;if(o.isFunction(K)){if(n=K(n,U)){D.position="absolute";D.zIndex=8;wa=o(n).css(D).appendTo(J)}}else{D.isStart=true;D.isEnd=true;wa=o(fa({title:"",start:n,end:U,className:["fc-select-helper"],editable:false},D));wa.css("opacity",ma("dragOpacity"))}if(wa){u(wa);J.append(wa);Xa(wa,D.width,true);Hb(wa,D.height,true)}}}}else na(n,U)}function ca(){P(); -if(wa){wa.remove();wa=null}}function e(n){if(n.which==1&&ma("selectable")){F(n);var U,K=ma("selectHelper");Ta.start(function(D,ta){ca();if(D&&(D.col==ta.col||!K)&&!ja(D)){ta=aa(ta);D=aa(D);U=[ta,xa(G(ta),ma("slotMinutes")),D,xa(G(D),ma("slotMinutes"))].sort(Jb);Y(U[0],U[3])}else U=null},n);o(document).one("mouseup",function(D){Ta.stop();if(U){+U[0]==+U[1]&&M(U[0],false,D);i(U[0],U[3],false,D)}})}}function M(n,U,K){y("dayClick",z[v(n.getDay())],n,U,K)}function A(n,U){Ta.start(function(K){P();if(K)if(ja(K))ea(K.row, -K.col,K.row,K.col);else{K=aa(K);var D=xa(G(K),ma("defaultEventMinutes"));na(K,D)}},U)}function ha(n,U,K){var D=Ta.stop();P();D&&y("drop",n,aa(D),ja(D),U,K)}var E=this;E.renderAgenda=c;E.setWidth=d;E.setHeight=h;E.beforeHide=O;E.afterShow=L;E.defaultEventEnd=w;E.timePosition=C;E.dayOfWeekCol=v;E.dateCell=V;E.cellDate=aa;E.cellIsAllDay=ja;E.allDayRow=W;E.allDayBounds=ba;E.getHoverListener=function(){return Ta};E.colContentLeft=T;E.colContentRight=N;E.getDaySegmentContainer=function(){return ra};E.getSlotSegmentContainer= -function(){return $};E.getMinMinute=function(){return Ma};E.getMaxMinute=function(){return eb};E.getBodyContent=function(){return J};E.getRowCnt=function(){return 1};E.getColCnt=function(){return Da};E.getColWidth=function(){return gb};E.getSlotHeight=function(){return Za};E.defaultSelectionEnd=p;E.renderDayOverlay=la;E.renderSelection=I;E.clearSelection=ca;E.reportDayClick=M;E.dragStart=A;E.dragStop=ha;db.call(E,a,b,g);Nb.call(E);Ob.call(E);tc.call(E);var ma=E.opt,y=E.trigger,Q=E.clearEvents,H=E.renderOverlay, -P=E.clearOverlays,i=E.reportSelection,F=E.unselect,ga=E.daySelectionMousedown,fa=E.slotSegHtml,ya=b.formatDate,j,m,t,X,z,l,s,da,pa,ra,qa,ua,x,J,$,S,oa,ia,va,wa,Ca,Xb,Na,gb,zb,Za,Yb,Da,xb,Oa,Ta,fb,yb={},Ya,Ub,Tb,Vb,Ka,La,Ma,eb,Wb;tb(a.addClass("fc-agenda"));Oa=new Pb(function(n,U){function K(hb){return Math.max(Ga,Math.min(uc,hb))}var D,ta,za;t.each(function(hb,vc){D=o(vc);ta=D.offset().left;if(hb)za[1]=ta;za=[ta];U[hb]=za});za[1]=ta+D.outerWidth();if(ma("allDaySlot")){D=ua;ta=D.offset().top;n[0]= -[ta,ta+D.outerHeight()]}for(var Fa=J.offset().top,Ga=x.offset().top,uc=Ga+x.outerHeight(),ib=0;ib1;if($=B("isRTL")){S=-1;wa=t-1}else{S=1;wa=0}for(t=0;t
      "+Ea(fa(j.start,j.end,B("timeFormat")))+"
      "+Ea(j.title)+"
      "; -if(m.isEnd&&na(j))t+="
      =
      ";t+="";return t}function h(j,m,t){ea(j)&&O(j,m,t.isStart);t.isEnd&&na(j)&&ca(j,m,t);aa(j,m)}function d(j,m,t){var X=m.find("div.fc-event-time");ea(j)&&L(j,m,X);t.isEnd&&na(j)&&R(j,m,X);aa(j,m)}function r(){var j=ha(),m=j.children(".fc-timeline");if(m.length==0)m=o("
      ").addClass("fc-timeline").appendTo(j);var t=new Date;if(u.visStartt){m.show();t=(t.getHours()*60*60+t.getMinutes()*60+t.getSeconds())/ -86400;m.css("top",Math.floor(j.height()*t-1)+"px");if(u.name=="agendaWeek"){t=o(".fc-today",u.element);j=t.position().left+1;t=t.width();m.css({left:j+"px",width:t+"px"})}}else m.hide()}function O(j,m,t){function X(){if(!s){m.width(z).height("").draggable("option","grid",null);s=true}}var z,l,s=true,da,pa=B("isRTL")?-1:1,ra=C(),qa=M(),ua=A(),x=W();m.draggable({zIndex:9,opacity:B("dragOpacity","month"),revertDuration:B("dragRevertDuration"),start:function(J,$){la("eventDragStart",m,j,J,$);y(j,m);z= -m.width();ra.start(function(S,oa,ia,va){i();if(S){l=false;da=va*pa;if(S.row)if(t){if(s){m.width(qa-10);Hb(m,ua*Math.round((j.end?(j.end-j.start)/xc:B("defaultEventMinutes"))/B("slotMinutes")));m.draggable("option","grid",[qa,1]);s=false}}else l=true;else{P(ka(G(j.start),da),ka(Wa(j),da));X()}l=l||s&&!da}else{X();l=true}m.draggable("option","revert",l)},J,"drag")},stop:function(J,$){ra.stop();i();la("eventDragStop",m,j,J,$);if(l){X();m.css("filter","");ma(j,m)}else{var S=0;s||(S=Math.round((m.offset().top- -ha().offset().top)/ua)*B("slotMinutes")+x-(j.start.getHours()*60+j.start.getMinutes()));Q(this,j,da,S,s,J,$)}}})}function L(j,m,t){function X(S){var oa=xa(G(j.start),S),ia;if(j.end)ia=xa(G(j.end),S);t.text(fa(oa,ia,B("timeFormat")))}function z(){if(s){t.css("display","");m.draggable("option","grid",[J,$]);s=false}}var l,s=false,da,pa,ra,qa=B("isRTL")?-1:1,ua=C(),x=e(),J=M(),$=A();m.draggable({zIndex:9,scroll:false,grid:[J,$],axis:x==1?"y":false,opacity:B("dragOpacity"),revertDuration:B("dragRevertDuration"), -start:function(S,oa){la("eventDragStart",m,j,S,oa);y(j,m);l=m.position();pa=ra=0;ua.start(function(ia,va,wa,Ca){m.draggable("option","revert",!ia);i();if(ia){da=Ca*qa;if(B("allDaySlot")&&!ia.row){if(!s){s=true;t.hide();m.draggable("option","grid",null)}P(ka(G(j.start),da),ka(Wa(j),da))}else z()}},S,"drag")},drag:function(S,oa){pa=Math.round((oa.position.top-l.top)/$)*B("slotMinutes");if(pa!=ra){s||X(pa);ra=pa}},stop:function(S,oa){var ia=ua.stop();i();la("eventDragStop",m,j,S,oa);if(ia&&(da||pa|| -s))Q(this,j,da,s?0:pa,s,S,oa);else{z();m.css("filter","");m.css(l);X(0);ma(j,m)}}})}function R(j,m,t){var X,z,l=A();m.resizable({handles:{s:"div.ui-resizable-s"},grid:l,start:function(s,da){X=z=0;y(j,m);m.css("z-index",9);la("eventResizeStart",this,j,s,da)},resize:function(s,da){X=Math.round((Math.max(l,m.height())-da.originalSize.height)/l);if(X!=z){t.text(fa(j.start,!X&&!j.end?null:xa(T(j),B("slotMinutes")*X),B("timeFormat")));z=X}},stop:function(s,da){la("eventResizeStop",this,j,s,da);if(X)H(this, -j,0,B("slotMinutes")*X,s,da);else{m.css("z-index",8);ma(j,m)}}})}var u=this;u.renderEvents=a;u.compileDaySegs=g;u.clearEvents=b;u.slotSegHtml=q;u.bindDaySeg=h;wb.call(u);var B=u.opt,la=u.trigger,ea=u.isEventDraggable,na=u.isEventResizable,T=u.eventEnd,N=u.reportEvents,V=u.reportEventClear,aa=u.eventElementHandlers,Z=u.setHeight,ja=u.getDaySegmentContainer,v=u.getSlotSegmentContainer,C=u.getHoverListener,ba=u.getMaxMinute,W=u.getMinMinute,w=u.timePosition,p=u.colContentLeft,I=u.colContentRight,Y=u.renderDaySegs, -ca=u.resizableDayEvent,e=u.getColCnt,M=u.getColWidth,A=u.getSlotHeight,ha=u.getBodyContent,E=u.reportEventElement,ma=u.showEvents,y=u.hideEvents,Q=u.eventDrop,H=u.eventResize,P=u.renderDayOverlay,i=u.clearOverlays,F=u.calendar,ga=F.formatDate,fa=F.formatDates,ya}function wc(a){var b,g,c,f,k,q;for(b=a.length-1;b>0;b--){f=a[b];for(g=0;gz)j.overflow=true;else{j.top=fa;fa+=j.outerHeight}for(m=j.startCol;m1){i=o("").addClass("fc-more-link").html("+"+F.count).appendTo(H);i[0].style.position="absolute";i[0].style.left=F.seg.left+"px";i[0].style.top=F.top+Q[0].offsetTop+"px";F=ea("overflowRender",F,{count:F.count,date:F.date},i);F===false&&i.remove()}else{F.seg.top=F.top;F.seg.overflow=false}}function g(y,Q,H){var P=o("
      "),i=e(),F=y.length,ga;P[0].innerHTML=c(y);P=P.children();i.append(P);f(y,P);h(y);d(y);r(y);R(y,L(O()));P=[];for(i=0;i
      ";if(!F.allDay&&i.isStart)s+=""+Ea(A(F.start,F.end,la("timeFormat")))+"";s+=""+ -Ea(F.title)+"
      ";if(i.isEnd&&T(F))s+="
         
      ";s+="";i.left=X;i.outerWidth=z-X;i.startCol=m;i.endCol=t+1}return s}function f(y,Q){var H,P=y.length,i,F,ga;for(H=0;H div");return H}function L(y){var Q,H=y.length,P=[];for(Q=0;Q"));h[0].parentNode!=q[0]&&h.appendTo(q);c.push(h.css(k).show()); -return h}function b(){for(var k;k=c.shift();)f.push(k.hide().unbind())}var g=this;g.renderOverlay=a;g.clearOverlays=b;var c=[],f=[]}function Pb(a){var b=this,g,c;b.build=function(){g=[];c=[];a(g,c)};b.cell=function(f,k){var q=g.length,h=c.length,d,r=-1,O=-1;for(d=0;d=g[d][0]&&k=c[d][0]&&f=0&&O>=0?{row:r,col:O}:null};b.rect=function(f,k,q,h,d){d=d.offset();return{top:g[f][0]-d.top,left:c[k][0]-d.left,width:c[h][1]-c[k][0], -height:g[q][1]-g[f][0]}}}function Qb(a){function b(h){yc(h);h=a.cell(h.pageX,h.pageY);if(!h!=!q||h&&(h.row!=q.row||h.col!=q.col)){if(h){k||(k=h);f(h,k,h.row-k.row,h.col-k.col)}else f(h,k);q=h}}var g=this,c,f,k,q;g.start=function(h,d,r){f=h;k=q=null;a.build();b(d);c=r||"mousemove";o(document).bind(c,b)};g.stop=function(){o(document).unbind(c,b);return q}}function yc(a){if(a.pageX===sa){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Rb(a){function b(q){return c[q]=c[q]||a(q)} -var g=this,c={},f={},k={};g.left=function(q){return f[q]=f[q]===sa?b(q).position().left:f[q]};g.right=function(q){return k[q]=k[q]===sa?g.left(q)+b(q).width():k[q]};g.clear=function(){c={};f={};k={}}}function Zb(){function a(){L();B().empty()}function b(T,N){T.sort(c);O(T);f(g(T),N)}function g(T){var N=[],V=d("titleFormat","day"),aa=d("firstDay"),Z=d("listSections"),ja,v,C,ba,W,w,p,I=-1,Y=Ia(new Date),ca=ka(G(Y),-((Y.getDay()-aa+7)%7));for(ja=0;ja -h.visEnd)){p=G(aa.starth.start?h.start:aa.start,true);v=Ba(p,Y);C=Math.floor(Ba(p,ca)/7);ba=p.getMonth()+(p.getYear()-Y.getYear())*12-Y.getMonth();if(Z=="smart")if(v<0)W=d("listTexts","past");else if(v==0)W=d("listTexts","today");else if(v==1)W=d("listTexts","tomorrow");else if(C==0)W=d("listTexts","thisWeek");else if(C==1)W=d("listTexts","nextWeek");else if(ba==0)W=d("listTexts","thisMonth");else if(ba==1)W=d("listTexts","nextMonth");else{if(ba>1)W=d("listTexts","future")}else W= -Z=="month"?ea(p,"MMMM yyyy"):Z=="week"?d("listTexts","week")+ea(p," W"):Z=="day"?ea(p,V):"";if(W!=w){N[++I]={events:[],start:p,title:W,daydiff:v,weekdiff:C,monthdiff:ba};w=W}N[I].events.push(aa)}}return N}function c(T,N){var V=T.start.getTime()-N.start.getTime();return V+(V?0:T.end.getTime()-N.end.getTime())}function f(T,N){var V=d("theme")?"ui":"fc",aa=V+"-widget-header";V=V+"-widget-content";var Z,ja,v,C,ba,W,w,p,I;for(ja=0;ja'+ -Ea(v.title)+"
      ").appendTo(B());I=o("
      ").addClass("fc-list-section "+V).appendTo(B());W="";for(Z=0;Z
      "+ -(ba[0]?''+ba[0]+" ":"")+(ba[1]?''+ba[1]+"":"")+"
      "+Ea(C.title)+"
      "}I[0].innerHTML=W;W=I.children();for(Z=0;ZQa)v=na(T.start,T.end,aa+"{ - "+aa+"}");else if(N.daydiff==0)v=d("listTexts","today");else if(N.daydiff==1)v=d("listTexts","tomorrow");else if(N.weekdiff==0||N.weekdiff==1)v=ea(T.start,"dddd");else{if(N.daydiff>1||N.daydiff<0)v=ea(T.start, -aa)}else if(Z!="day")v=na(T.start,T.end,aa+(ja>Qa?"{ - "+aa+"}":""));if(!v&&T.allDay)C=d("allDayText");else if((ja").addClass("fc-list-content").appendTo(a)}function k(na){r("listNoHeight")||R.css("height",na-1+"px").css("overflow","auto")}function q(){}function h(){}var d=this;d.render=g;d.select=h;d.unselect=h;d.getDaySegmentContainer=function(){return R};db.call(d,a,b,"list");Zb.call(d);var r=d.opt,O=d.clearEvents,L=b.formatDates;d.setWidth=q;d.setHeight=k;var R,u,B,la,ea}function Ac(){function a(){r();u().children("tbody").remove()}function b(la, -ea){la.sort(k);d(la);g(h(la),ea);u().removeClass("fc-list-smart fc-list-day fc-list-month fc-list-week").addClass("fc-list-"+f("listSections"))}function g(la,ea){var na=f("theme")?"ui":"fc",T=u(),N=na+"-widget-header";na=na+"-widget-content";var V=f("tableCols"),aa=o.inArray("time",V)>=0,Z,ja,v,C,ba,W,w,p,I,Y;for(ja=0;ja'+Ea(v.title)+"").appendTo(T);Y=o("").addClass("fc-list-section "+ -na).appendTo(T);W="";for(Z=0;Z";for(var ca=0;ca
      ";else if(I=="date")W+=""+Ea(ba[0])+"";else if(I=="time"){if(ba[1])W+=""+Ea(ba[1])+""}else W+=""+(C[I]?Ea(C[I]):" ")+""}W+="";if(document.all){o(W).appendTo(Y);W=""}}if(!document.all)Y[0].innerHTML=W;ba=Y.children();for(Z=0;Z",aa=0;aa";V+="";u=o("
      ").addClass("fc-list-content").appendTo(a); -B=o(V).appendTo(u)}function k(N){r("listNoHeight")||u.css("height",N-1+"px").css("overflow","auto")}function q(){}function h(){}var d=this;d.render=g;d.select=h;d.unselect=h;d.getDaySegmentContainer=function(){return B};db.call(d,a,b,"table");Ac.call(d);var r=d.opt,O=d.clearEvents,L=b.formatDates,R=b.formatDate;d.setWidth=q;d.setHeight=k;var u,B,la,ea,na,T}var $a={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:true,currentTimeIndicator:false, -allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '—'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy",list:"MMM d, yyyy",table:"MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d",list:"dddd, MMM d, yyyy",table:"MMM d, yyyy"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"], -monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:" ◄ ",next:" ► ",prevYear:" << ",nextYear:" >> ",today:"today",month:"month",week:"week",day:"day",list:"list",table:"table"},listTexts:{until:"until",past:"Past events",today:"Today",tomorrow:"Tomorrow", -thisWeek:"This week",nextWeek:"Next week",thisMonth:"This month",nextMonth:"Next month",future:"Future events",week:"W"},listSections:"month",listRange:30,listPage:7,tableCols:["handle","date","time","title"],theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},Cc={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "}, -buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=o.fullCalendar={version:"1.5.3-rcube-0.7.1"},Ha=Aa.views={};o.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),g;this.each(function(){var f=o.data(this,"fullCalendar");if(f&&o.isFunction(f[a])){f=f[a].apply(f,b);if(g===sa)g=f;a=="destroy"&&o.removeData(this,"fullCalendar")}});if(g!==sa)return g;return this}var c=a.eventSources||[];delete a.eventSources;if(a.events){c.push(a.events); -delete a.events}a=o.extend(true,{},$a,a.isRTL||a.isRTL===sa&&$a.isRTL?Cc:{},a);this.each(function(f,k){f=o(k);k=new $b(f,a,c);f.data("fullCalendar",k);k.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var cc={dataType:"json",cache:false},dc=1;Aa.addDays=ka;Aa.cloneDate=G;Aa.parseDate=nb;Aa.parseISO8601=Eb;Aa.parseTime=pb;Aa.formatDate=Pa;Aa.formatDates=lb;var Mb=["sun","mon","tue","wed","thu","fri","sat"],Qa=864E5,ec=36E5,xc=6E4,fc={s:function(a){return a.getSeconds()},ss:function(a){return Ra(a.getSeconds())}, -m:function(a){return a.getMinutes()},mm:function(a){return Ra(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Ra(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Ra(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Ra(a.getDate())},ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Ra(a.getMonth()+1)},MMM:function(a, -b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Pa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st", -"nd","rd"][a%10-1]||"th"},W:function(a){return Dc(a)}},Dc=function(a){a=G(a);a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1};Aa.applyAll=bb;Ha.month=nc;Ha.basicWeek=oc;Ha.basicDay=pc;Ab({weekMode:"fixed"});Ha.agendaWeek=rc;Ha.agendaDay=sc;Ab({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0, -maxTime:24});Ha.list=zc;Ha.table=Bc})(jQuery); diff --git a/sources/web/public/js/libs/jquery-1.7.2.min.js b/sources/web/public/js/libs/jquery-1.7.2.min.js deleted file mode 100644 index 16ad06c..0000000 --- a/sources/web/public/js/libs/jquery-1.7.2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.2 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
      a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
      "+""+"
      ",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
      t
      ",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
      ",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/sources/web/public/js/libs/jquery-ui-1.8.23.custom.min.js b/sources/web/public/js/libs/jquery-ui-1.8.23.custom.min.js deleted file mode 100644 index 7835454..0000000 --- a/sources/web/public/js/libs/jquery-ui-1.8.23.custom.min.js +++ /dev/null @@ -1,125 +0,0 @@ -/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.core.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.23",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a("").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.curCSS||(a.curCSS=a.css),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.position.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),a.curCSS||(a.curCSS=a.css),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.draggable.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
      ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h
      ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.23"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.selectable.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
      ")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.23",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.autocomplete.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("
        ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("
        ").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.dialog.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
        ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
        ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("
        ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),f=a("
        ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(f);a.each(d,function(a,b){if(a==="click")return;a in e?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.23",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.tabs.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
        ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.23"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.23"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
        ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a)),this._attachHandlers(a);var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+(c?0:$(document).scrollLeft()),i=document.documentElement.clientHeight+(c?0:$(document).scrollTop());return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_attachHandlers:function(a){var b=this._get(a,"stepMonths"),c="#"+a.id.replace(/\\\\/g,"\\");a.dpDiv.find("[data-handler]").map(function(){var a={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,-b,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,+b,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(c)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(c,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),a[this.getAttribute("data-handler")])})},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
        '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
        ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
        '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
        '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
        '+this._get(a,"weekHeader")+"
        '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
        "+(j?"
        "+(g[0]>0&&N==g[1]-1?'
        ':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
        ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
        ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.23",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.progressbar.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
        ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.core.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.23",save:function(a,b){for(var c=0;c
        ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}});var m={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,b){m[b]=function(b){return Math.pow(b,a+2)}}),a.extend(m,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return a===0||a===1?a:-Math.pow(2,8*(a-1))*Math.sin(((a-1)*80-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){var b,c=4;while(a<((b=Math.pow(2,--c))-1)/11);return 1/Math.pow(4,3-c)-7.5625*Math.pow((b*3-2)/22-a,2)}}),a.each(m,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return a<.5?c(a*2)/2:c(a*-2+2)/-2+1}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.blind.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.bounce.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m
        ").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.fade.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.fold.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.highlight.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15 -* https://github.com/jquery/jquery-ui -* Includes: jquery.effects.pulsate.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i
        ').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);; \ No newline at end of file diff --git a/sources/web/public/js/libs/jquery.colorPicker.js b/sources/web/public/js/libs/jquery.colorPicker.js deleted file mode 100644 index 070d26d..0000000 --- a/sources/web/public/js/libs/jquery.colorPicker.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Really Simple Color Picker in jQuery - * - * Copyright (c) 2008 Lakshan Perera (www.laktek.com) - * Licensed under the MIT (MIT-LICENSE.txt) licenses. - * - */ - -(function($){ - $.fn.colorPicker = function(){ - if(this.length > 0) buildSelector(); - return this.each(function(i) { - buildPicker(this)}); - }; - - var selectorOwner; - var selectorShowing = false; - - buildPicker = function(element){ - //build color picker - control = $("
         
        ") - control.css('background-color', $(element).val()); - - //bind click event to color picker - control.bind("click", toggleSelector); - - //add the color picker section - $(element).after(control); - - //add even listener to input box - $(element).bind("change", function() { - selectedValue = toHex($(element).val()); - $(element).next(".color_picker").css("background-color", selectedValue); - }); - - //hide the input box - $(element).hide(); - - }; - - buildSelector = function(){ - selector = $("
        "); - - //add color pallete - $.each($.fn.colorPicker.defaultColors, function(i){ - swatch = $("
         
        ") - swatch.css("background-color", "#" + this); - swatch.bind("click", function(e){ changeColor($(this).css("background-color")) }); - swatch.bind("mouseover", function(e){ - $(this).css("border-color", "#598FEF"); - $("input#color_value").val(toHex($(this).css("background-color"))); - }); - swatch.bind("mouseout", function(e){ - $(this).css("border-color", "#000"); - $("input#color_value").val(toHex($(selectorOwner).css("background-color"))); - }); - - swatch.appendTo(selector); - }); - - //add HEX value field - hex_field = $(""); - hex_field.bind("keydown", function(event){ - if(event.keyCode == 13) {changeColor($(this).val());} - if(event.keyCode == 27) {toggleSelector()} - }); - - $("
        ").append(hex_field).appendTo(selector); - - $("body").append(selector); - selector.hide(); - }; - - checkMouse = function(event){ - //check the click was on selector itself or on selectorOwner - var selector = "div#color_selector"; - var selectorParent = $(event.target).parents(selector).length; - if(event.target == $(selector)[0] || event.target == selectorOwner || selectorParent > 0) return - - hideSelector(); - } - - hideSelector = function(){ - var selector = $("div#color_selector"); - - $(document).unbind("mousedown", checkMouse); - selector.hide(); - selectorShowing = false - } - - showSelector = function(){ - var selector = $("div#color_selector"); - - //alert($(selectorOwner).offset().top); - - selector.css({ - top: $(selectorOwner).offset().top + ($(selectorOwner).outerHeight()), - left: $(selectorOwner).offset().left - }); - hexColor = $(selectorOwner).prev("input").val(); - $("input#color_value").val(hexColor); - selector.show(); - - //bind close event handler - $(document).bind("mousedown", checkMouse); - selectorShowing = true - } - - toggleSelector = function(event){ - selectorOwner = this; - selectorShowing ? hideSelector() : showSelector(); - } - - changeColor = function(value){ - if(selectedValue = toHex(value)){ - $(selectorOwner).css("background-color", selectedValue); - $(selectorOwner).prev("input").val(selectedValue).change(); - - //close the selector - hideSelector(); - } - }; - - //converts RGB string to HEX - inspired by http://code.google.com/p/jquery-color-utils - toHex = function(color){ - //valid HEX code is entered - if(color.match(/[0-9a-fA-F]{3}$/) || color.match(/[0-9a-fA-F]{6}$/)){ - color = (color.charAt(0) == "#") ? color : ("#" + color); - } - //rgb color value is entered (by selecting a swatch) - else if(color.match(/^rgb\(([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5]),[ ]{0,1}([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5]),[ ]{0,1}([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|[2][5][0-5])\)$/)){ - var c = ([parseInt(RegExp.$1),parseInt(RegExp.$2),parseInt(RegExp.$3)]); - - var pad = function(str){ - if(str.length < 2){ - for(var i = 0,len = 2 - str.length ; i= 1.0) { - return "rgb("+[o.r, o.g, o.b].join(",")+")"; - } else { - return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")"; - } - }; - - o.normalize = function () { - function clamp(min, value, max) { - return value < min ? min: (value > max ? max: value); - } - - o.r = clamp(0, parseInt(o.r), 255); - o.g = clamp(0, parseInt(o.g), 255); - o.b = clamp(0, parseInt(o.b), 255); - o.a = clamp(0, o.a, 1); - return o; - }; - - o.clone = function () { - return $.color.make(o.r, o.b, o.g, o.a); - }; - - return o.normalize(); - } - - // extract CSS color property from element, going up in the DOM - // if it's "transparent" - $.color.extract = function (elem, css) { - var c; - do { - c = elem.css(css).toLowerCase(); - // keep going until we find an element that has color, or - // we hit the body - if (c != '' && c != 'transparent') - break; - elem = elem.parent(); - } while (!$.nodeName(elem.get(0), "body")); - - // catch Safari's way of signalling transparent - if (c == "rgba(0, 0, 0, 0)") - c = "transparent"; - - return $.color.parse(c); - } - - // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), - // returns color object, if parsing failed, you get black (0, 0, - // 0) out - $.color.parse = function (str) { - var res, m = $.color.make; - - // Look for rgb(num,num,num) - if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); - - // Look for rgba(num,num,num,num) - if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); - - // Look for rgb(num%,num%,num%) - if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) - return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55); - - // Look for rgba(num%,num%,num%,num) - if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) - return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4])); - - // Look for #a0b1c2 - if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) - return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); - - // Look for #fff - if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) - return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16)); - - // Otherwise, we're most likely dealing with a named color - var name = $.trim(str).toLowerCase(); - if (name == "transparent") - return m(255, 255, 255, 0); - else { - // default to black - res = lookupColors[name] || [0, 0, 0]; - return m(res[0], res[1], res[2]); - } - } - - var lookupColors = { - aqua:[0,255,255], - azure:[240,255,255], - beige:[245,245,220], - black:[0,0,0], - blue:[0,0,255], - brown:[165,42,42], - cyan:[0,255,255], - darkblue:[0,0,139], - darkcyan:[0,139,139], - darkgrey:[169,169,169], - darkgreen:[0,100,0], - darkkhaki:[189,183,107], - darkmagenta:[139,0,139], - darkolivegreen:[85,107,47], - darkorange:[255,140,0], - darkorchid:[153,50,204], - darkred:[139,0,0], - darksalmon:[233,150,122], - darkviolet:[148,0,211], - fuchsia:[255,0,255], - gold:[255,215,0], - green:[0,128,0], - indigo:[75,0,130], - khaki:[240,230,140], - lightblue:[173,216,230], - lightcyan:[224,255,255], - lightgreen:[144,238,144], - lightgrey:[211,211,211], - lightpink:[255,182,193], - lightyellow:[255,255,224], - lime:[0,255,0], - magenta:[255,0,255], - maroon:[128,0,0], - navy:[0,0,128], - olive:[128,128,0], - orange:[255,165,0], - pink:[255,192,203], - purple:[128,0,128], - violet:[128,0,128], - red:[255,0,0], - silver:[192,192,192], - white:[255,255,255], - yellow:[255,255,0] - }; -})(jQuery); diff --git a/sources/web/public/js/libs/jquery.cookie.js b/sources/web/public/js/libs/jquery.cookie.js deleted file mode 100644 index 6d5974a..0000000 --- a/sources/web/public/js/libs/jquery.cookie.js +++ /dev/null @@ -1,47 +0,0 @@ -/*! - * jQuery Cookie Plugin - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2011, Klaus Hartl - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://www.opensource.org/licenses/mit-license.php - * http://www.opensource.org/licenses/GPL-2.0 - */ -(function($) { - $.cookie = function(key, value, options) { - - // key and at least value given, set cookie... - if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) { - options = $.extend({}, options); - - if (value === null || value === undefined) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // key and possibly options given, get cookie... - options = value || {}; - var decode = options.raw ? function(s) { return s; } : decodeURIComponent; - - var pairs = document.cookie.split('; '); - for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { - if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined - } - return null; - }; -})(jQuery); diff --git a/sources/web/public/js/libs/jquery.freeow.min.js b/sources/web/public/js/libs/jquery.freeow.min.js deleted file mode 100644 index 54dcf56..0000000 --- a/sources/web/public/js/libs/jquery.freeow.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Freeow! - * Stylish, Growl-like message boxes - * - * Copyright (c) 2011 PJ Dietz - * Version: 1.00 - * Licensed under the MIT license: - * http://www.opensource.org/licenses/mit-license.php - * - * http://pjdietz.com/jquery-plugins/freeow/ - */ -(function($){"use strict";var Freeow;Freeow=function(title,message,options){var startStyle,i,u;this.options=$.extend({},$.fn.freeow.defaults,options);this.element=$(this.options.template(title,message));if(this.options.startStyle){startStyle=this.options.startStyle;} -else{startStyle=this.options.hideStyle;} -this.element.css(startStyle);this.element.data("freeow",this);for(i=0,u=this.options.classes.length;i0){this.autoHide=true;self=this;delay=this.options.autoHideDelay;fn=function(){if(self.autoHide){self.hide();}};opts.complete=function(){setTimeout(fn,delay);};} -this.element.animate(this.options.showStyle,opts);},hide:function(){var self=this;this.element.animate(this.options.hideStyle,{duration:this.options.hideDuration,complete:function(){self.destroy();}});},destroy:function(){this.element.data("freeow",undefined);this.element.remove();}};if(typeof $.fn.freeow==="undefined"){$.fn.extend({freeow:function(title,message,options){return this.each(function(){var f;f=new Freeow(title,message,options);f.attach(this);});}});$.fn.freeow.defaults={autoHide:true,autoHideDelay:3000,classes:[],startStyle:null,showStyle:{opacity:1.0},showDuration:250,hideStyle:{opacity:0.0},hideDuration:500,onClick:function(event){$(this).data("freeow").hide();},onHover:function(event){$(this).data("freeow").autoHide=false;},template:function(title,message){var e;e=['
        ','
        ','
        ','

        '+title+'

        ','

        '+message+'

        ','
        ','
        ','','','
        '].join("");return e;}};}}(jQuery)); \ No newline at end of file diff --git a/sources/web/public/js/libs/jquery.qtip.min.js b/sources/web/public/js/libs/jquery.qtip.min.js deleted file mode 100644 index a9c3309..0000000 --- a/sources/web/public/js/libs/jquery.qtip.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! qTip2 v2.0.0 | http://craigsworks.com/projects/qtip2/ | Licensed MIT, GPL */ -(function(a){"use strict",typeof define=="function"&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.qtip&&a(jQuery)})(function(a){function G(){G.history=G.history||[],G.history.push(arguments);if("object"==typeof console){var a=console[console.warn?"warn":"log"],b=Array.prototype.slice.call(arguments),c;typeof arguments[0]=="string"&&(b[0]="qTip2: "+b[0]),c=a.apply?a.apply(console,b):a(b)}}function H(b){var e=function(a){return a===d||"object"!=typeof a},f=function(b){return!a.isFunction(b)&&(!b&&!b.attr||b.length<1||"object"==typeof b&&!b.jquery)};if(!b||"object"!=typeof b)return c;e(b.metadata)&&(b.metadata={type:b.metadata});if("content"in b){if(e(b.content)||b.content.jquery)b.content={text:b.content};f(b.content.text||c)&&(b.content.text=c),"title"in b.content&&(e(b.content.title)&&(b.content.title={text:b.content.title}),f(b.content.title.text||c)&&(b.content.title.text=c))}return"position"in b&&e(b.position)&&(b.position={my:b.position,at:b.position}),"show"in b&&e(b.show)&&(b.show=b.show.jquery?{target:b.show}:{event:b.show}),"hide"in b&&e(b.hide)&&(b.hide=b.hide.jquery?{target:b.hide}:{event:b.hide}),"style"in b&&e(b.style)&&(b.style={classes:b.style}),a.each(r,function(){this.sanitize&&this.sanitize(b)}),b}function I(e,f,n,o){function N(a){var b=0,c,d=f,e=a.split(".");while(d=d[e[b++]])b",{"class":"ui-state-default ui-tooltip-close "+(f.style.widget?"":u+"-icon"),title:e,"aria-label":e}).prepend(a("",{"class":"ui-icon ui-icon-close",html:"×"})),L.button.appendTo(L.titlebar).attr("role","button").click(function(a){return J.hasClass(w)||p.hide(a),c}),p.redraw()}function R(){var c=D+"-title";L.titlebar&&P(),L.titlebar=a("
        ",{"class":u+"-titlebar "+(f.style.widget?"ui-widget-header":"")}).append(L.title=a("
        ",{id:c,"class":u+"-title","aria-atomic":b})).insertBefore(L.content).delegate(".ui-tooltip-close","mousedown keydown mouseup keyup mouseout",function(b){a(this).toggleClass("ui-state-active ui-state-focus",b.type.substr(-4)==="down")}).delegate(".ui-tooltip-close","mouseover mouseout",function(b){a(this).toggleClass("ui-state-hover",b.type==="mouseover")}),f.content.title.button?Q():p.rendered&&p.redraw()}function S(a){var b=L.button,d=L.title;if(!p.rendered)return c;a?(d||R(),Q()):b.remove()}function T(b,d){var f=L.title;if(!p.rendered||!b)return c;a.isFunction(b)&&(b=b.call(e,M.event,p));if(b===c||!b&&b!=="")return P(c);b.jquery&&b.length>0?f.empty().append(b.css({display:"block"})):f.html(b),p.redraw(),d!==c&&p.rendered&&J[0].offsetWidth>0&&p.reposition(M.event)}function U(b,d){function g(b){function h(e){e&&(delete g[e.src],clearTimeout(p.timers.img[e.src]),a(e).unbind(K)),a.isEmptyObject(g)&&(p.redraw(),d!==c&&p.reposition(M.event),b())}var e,g={};if((e=f.find("img[src]:not([height]):not([width])")).length===0)return h();e.each(function(b,c){if(g[c.src]!==undefined)return;var d=0,e=3;(function f(){if(c.height||c.width||d>e)return h(c);d+=1,p.timers.img[c.src]=setTimeout(f,700)})(),a(c).bind("error"+K+" load"+K,function(){h(this)}),g[c.src]=c})}var f=L.content;return!p.rendered||!b?c:(a.isFunction(b)&&(b=b.call(e,M.event,p)||""),b.jquery&&b.length>0?f.empty().append(b.css({display:"block"})):f.html(b),p.rendered<0?J.queue("fx",g):(I=0,g(a.noop)),p)}function V(){function j(a){if(J.hasClass(w))return c;clearTimeout(p.timers.show),clearTimeout(p.timers.hide);var d=function(){p.toggle(b,a)};f.show.delay>0?p.timers.show=setTimeout(d,f.show.delay):d()}function k(b){if(J.hasClass(w)||G||I)return c;var e=a(b.relatedTarget||b.target),h=e.closest(x)[0]===J[0],i=e[0]===g.show[0];clearTimeout(p.timers.show),clearTimeout(p.timers.hide);if(d.target==="mouse"&&h||f.hide.fixed&&/mouse(out|leave|move)/.test(b.type)&&(h||i)){try{b.preventDefault(),b.stopImmediatePropagation()}catch(j){}return}f.hide.delay>0?p.timers.hide=setTimeout(function(){p.hide(b)},f.hide.delay):p.hide(b)}function l(a){if(J.hasClass(w))return c;clearTimeout(p.timers.inactive),p.timers.inactive=setTimeout(function(){p.hide(a)},f.hide.inactive)}function m(a){p.rendered&&J[0].offsetWidth>0&&p.reposition(a)}var d=f.position,g={show:f.show.target,hide:f.hide.target,viewport:a(d.viewport),document:a(document),body:a(document.body),window:a(window)},h={show:a.trim(""+f.show.event).split(" "),hide:a.trim(""+f.hide.event).split(" ")},i=a.browser.msie&&parseInt(a.browser.version,10)===6;J.bind("mouseenter"+K+" mouseleave"+K,function(a){var b=a.type==="mouseenter";b&&p.focus(a),J.toggleClass(A,b)}),/mouse(out|leave)/i.test(f.hide.event)&&f.hide.leave==="window"&&g.window.bind("mouseout"+K+" blur"+K,function(a){!/select|option/.test(a.target.nodeName)&&!a.relatedTarget&&p.hide(a)}),f.hide.fixed?(g.hide=g.hide.add(J),J.bind("mouseover"+K,function(){J.hasClass(w)||clearTimeout(p.timers.hide)})):/mouse(over|enter)/i.test(f.show.event)&&g.hide.bind("mouseleave"+K,function(a){clearTimeout(p.timers.show)}),(""+f.hide.event).indexOf("unfocus")>-1&&d.container.closest("html").bind("mousedown"+K,function(b){var c=a(b.target),d=p.rendered&&!J.hasClass(w)&&J[0].offsetWidth>0,f=c.parents(x).filter(J[0]).length>0;c[0]!==e[0]&&c[0]!==J[0]&&!f&&!e.has(c[0]).length&&!c.attr("disabled")&&p.hide(b)}),"number"==typeof f.hide.inactive&&(g.show.bind("qtip-"+n+"-inactive",l),a.each(q.inactiveEvents,function(a,b){g.hide.add(L.tooltip).bind(b+K+"-inactive",l)})),a.each(h.hide,function(b,c){var d=a.inArray(c,h.show),e=a(g.hide);d>-1&&e.add(g.show).length===e.length||c==="unfocus"?(g.show.bind(c+K,function(a){J[0].offsetWidth>0?k(a):j(a)}),delete h.show[d]):g.hide.bind(c+K,k)}),a.each(h.show,function(a,b){g.show.bind(b+K,j)}),"number"==typeof f.hide.distance&&g.show.add(J).bind("mousemove"+K,function(a){var b=M.origin||{},c=f.hide.distance,d=Math.abs;(d(a.pageX-b.pageX)>=c||d(a.pageY-b.pageY)>=c)&&p.hide(a)}),d.target==="mouse"&&(g.show.bind("mousemove"+K,function(a){s={pageX:a.pageX,pageY:a.pageY,type:"mousemove"}}),d.adjust.mouse&&(f.hide.event&&(J.bind("mouseleave"+K,function(a){(a.relatedTarget||a.target)!==g.show[0]&&p.hide(a)}),L.target.bind("mouseenter"+K+" mouseleave"+K,function(a){M.onTarget=a.type==="mouseenter"})),g.document.bind("mousemove"+K,function(a){p.rendered&&M.onTarget&&!J.hasClass(w)&&J[0].offsetWidth>0&&p.reposition(a||s)}))),(d.adjust.resize||g.viewport.length)&&(a.event.special.resize?g.viewport:g.window).bind("resize"+K,m),(g.viewport.length||i&&J.css("position")==="fixed")&&g.viewport.bind("scroll"+K,m)}function W(){var b=[f.show.target[0],f.hide.target[0],p.rendered&&L.tooltip[0],f.position.container[0],f.position.viewport[0],window,document];p.rendered?a([]).pushStack(a.grep(b,function(a){return typeof a=="object"})).unbind(K):f.show.target.unbind(K+"-create")}var p=this,C=document.body,D=u+"-"+n,G=0,I=0,J=a(),K=".qtip-"+n,L,M;p.id=n,p.rendered=c,p.destroyed=c,p.elements=L={target:e},p.timers={img:{}},p.options=f,p.checks={},p.plugins={},p.cache=M={event:{},target:a(),disabled:c,attr:o,onTarget:c,lastClass:""},p.checks.builtin={"^id$":function(d,e,f){var g=f===b?q.nextid:f,h=u+"-"+g;g!==c&&g.length>0&&!a("#"+h).length&&(J[0].id=h,L.content[0].id=h+"-content",L.title[0].id=h+"-title")},"^content.text$":function(a,b,c){U(c)},"^content.title.text$":function(a,b,c){if(!c)return P();!L.title&&c&&R(),T(c)},"^content.title.button$":function(a,b,c){S(c)},"^position.(my|at)$":function(a,b,c){"string"==typeof c&&(a[b]=new r.Corner(c))},"^position.container$":function(a,b,c){p.rendered&&J.appendTo(c)},"^show.ready$":function(){p.rendered?p.toggle(b):p.render(1)},"^style.classes$":function(a,b,c){J.attr("class",u+" qtip ui-helper-reset "+c)},"^style.widget|content.title":O,"^events.(render|show|move|hide|focus|blur)$":function(b,c,d){J[(a.isFunction(d)?"":"un")+"bind"]("tooltip"+c,d)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){var a=f.position;J.attr("tracking",a.target==="mouse"&&a.adjust.mouse),W(),V()}},a.extend(p,{render:function(d){if(p.rendered)return p;var g=f.content.text,h=f.content.title.text,i=f.position,j=a.Event("tooltiprender");return a.attr(e[0],"aria-describedby",D),J=L.tooltip=a("
        ",{id:D,"class":u+" qtip ui-helper-reset "+y+" "+f.style.classes+" "+u+"-pos-"+f.position.my.abbrev(),width:f.style.width||"",height:f.style.height||"",tracking:i.target==="mouse"&&i.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":c,"aria-describedby":D+"-content","aria-hidden":b}).toggleClass(w,M.disabled).data("qtip",p).appendTo(f.position.container).append(L.content=a("
        ",{"class":u+"-content",id:D+"-content","aria-atomic":b})),p.rendered=-1,I=1,G=1,h&&(R(),a.isFunction(h)||T(h,c)),a.isFunction(g)||U(g,c),p.rendered=b,O(),a.each(f.events,function(b,c){a.isFunction(c)&&J.bind(b==="toggle"?"tooltipshow tooltiphide":"tooltip"+b,c)}),a.each(r,function(){this.initialize==="render"&&this(p)}),V(),J.queue("fx",function(a){j.originalEvent=M.event,J.trigger(j,[p]),I=0,G=0,p.redraw(),(f.show.ready||d)&&p.toggle(b,M.event,c),a()}),p},get:function(a){var b,c;switch(a.toLowerCase()){case"dimensions":b={height:J.outerHeight(),width:J.outerWidth()};break;case"offset":b=r.offset(J,f.position.container);break;default:c=N(a.toLowerCase()),b=c[0][c[1]],b=b.precedance?b.string():b}return b},set:function(e,g){function n(a,b){var c,d,e;for(c in l)for(d in l[c])if(e=(new RegExp(d,"i")).exec(a))b.push(e),l[c][d].apply(p,b)}var h=/^position\.(my|at|adjust|target|container)|style|content|show\.ready/i,i=/^content\.(title|attr)|style/i,j=c,k=c,l=p.checks,m;return"string"==typeof e?(m=e,e={},e[m]=g):e=a.extend(b,{},e),a.each(e,function(b,c){var d=N(b.toLowerCase()),f;f=d[0][d[1]],d[0][d[1]]="object"==typeof c&&c.nodeType?a(c):c,e[b]=[d[0],d[1],c,f],j=h.test(b)||j,k=i.test(b)||k}),H(f),G=I=1,a.each(e,n),G=I=0,p.rendered&&J[0].offsetWidth>0&&(j&&p.reposition(f.position.target==="mouse"?d:M.event),k&&p.redraw()),p},toggle:function(e,g){function u(){e?(a.browser.msie&&J[0].style.removeAttribute("filter"),J.css("overflow",""),"string"==typeof i.autofocus&&a(i.autofocus,J).focus(),i.target.trigger("qtip-"+n+"-inactive")):J.css({display:"",visibility:"",opacity:"",left:"",top:""}),t=a.Event("tooltip"+(e?"visible":"hidden")),t.originalEvent=g?M.event:d,J.trigger(t,[p])}if(!p.rendered)return e?p.render(1):p;var h=e?"show":"hide",i=f[h],j=f[e?"hide":"show"],k=f.position,l=f.content,m=J[0].offsetWidth>0,o=e||i.target.length===1,q=!g||i.target.length<2||M.target[0]===g.target,r,t;(typeof e).search("boolean|number")&&(e=!m);if(!J.is(":animated")&&m===e&&q)return p;if(g){if(/over|enter/.test(g.type)&&/out|leave/.test(M.event.type)&&f.show.target.add(g.target).length===f.show.target.length&&J.has(g.relatedTarget).length)return p;M.event=a.extend({},g)}return t=a.Event("tooltip"+h),t.originalEvent=g?M.event:d,J.trigger(t,[p,90]),t.isDefaultPrevented()?p:(a.attr(J[0],"aria-hidden",!e),e?(M.origin=a.extend({},s),p.focus(g),a.isFunction(l.text)&&U(l.text,c),a.isFunction(l.title.text)&&T(l.title.text,c),!F&&k.target==="mouse"&&k.adjust.mouse&&(a(document).bind("mousemove.qtip",function(a){s={pageX:a.pageX,pageY:a.pageY,type:"mousemove"}}),F=b),p.reposition(g,arguments[2]),(t.solo=!!i.solo)&&a(x,i.solo).not(J).qtip("hide",t)):(clearTimeout(p.timers.show),delete M.origin,F&&!a(x+'[tracking="true"]:visible',i.solo).not(J).length&&(a(document).unbind("mousemove.qtip"),F=c),p.blur(g)),i.effect===c||o===c?(J[h](),u.call(J)):a.isFunction(i.effect)?(J.stop(1,1),i.effect.call(J,p),J.queue("fx",function(a){u(),a()})):J.fadeTo(90,e?1:0,u),e&&i.target.trigger("qtip-"+n+"-inactive"),p)},show:function(a){return p.toggle(b,a)},hide:function(a){return p.toggle(c,a)},focus:function(b){if(!p.rendered)return p;var c=a(x),d=parseInt(J[0].style.zIndex,10),e=q.zindex+c.length,f=a.extend({},b),g,h;return J.hasClass(z)||(h=a.Event("tooltipfocus"),h.originalEvent=f,J.trigger(h,[p,e]),h.isDefaultPrevented()||(d!==e&&(c.each(function(){this.style.zIndex>d&&(this.style.zIndex=this.style.zIndex-1)}),c.filter("."+z).qtip("blur",f)),J.addClass(z)[0].style.zIndex=e)),p},blur:function(b){var c=a.extend({},b),d;return J.removeClass(z),d=a.Event("tooltipblur"),d.originalEvent=c,J.trigger(d,[p]),p},reposition:function(b,d){if(!p.rendered||G)return p;G=1;var e=f.position.target,g=f.position,h=g.my,n=g.at,o=g.adjust,q=o.method.split(" "),t=J.outerWidth(),u=J.outerHeight(),v=0,w=0,x=a.Event("tooltipmove"),y=J.css("position")==="fixed",z=g.viewport,A={left:0,top:0},B=g.container,C=J[0].offsetWidth>0,D,E,F;if(a.isArray(e)&&e.length===2)n={x:j,y:i},A={left:e[0],top:e[1]};else if(e==="mouse"&&(b&&b.pageX||M.event.pageX))n={x:j,y:i},b=(b&&(b.type==="resize"||b.type==="scroll")?M.event:b&&b.pageX&&b.type==="mousemove"?b:s&&s.pageX&&(o.mouse||!b||!b.pageX)?{pageX:s.pageX,pageY:s.pageY}:!o.mouse&&M.origin&&M.origin.pageX&&f.show.distance?M.origin:b)||b||M.event||s||{},A={top:b.pageY,left:b.pageX};else{e==="event"&&b&&b.target&&b.type!=="scroll"&&b.type!=="resize"?M.target=a(b.target):e!=="event"&&(M.target=a(e.jquery?e:L.target)),e=M.target,e=a(e).eq(0);if(e.length===0)return p;e[0]===document||e[0]===window?(v=r.iOS?window.innerWidth:e.width(),w=r.iOS?window.innerHeight:e.height(),e[0]===window&&(A={top:(z||e).scrollTop(),left:(z||e).scrollLeft()})):r.imagemap&&e.is("area")?D=r.imagemap(p,e,n,r.viewport?q:c):r.svg&&typeof e[0].xmlbase=="string"?D=r.svg(p,e,n,r.viewport?q:c):(v=e.outerWidth(),w=e.outerHeight(),A=r.offset(e,B)),D&&(v=D.width,w=D.height,E=D.offset,A=D.position);if(r.iOS>3.1&&r.iOS<4.1||r.iOS>=4.3&&r.iOS<4.33||!r.iOS&&y)F=a(window),A.left-=F.scrollLeft(),A.top-=F.scrollTop();A.left+=n.x===l?v:n.x===m?v/2:0,A.top+=n.y===k?w:n.y===m?w/2:0}return A.left+=o.x+(h.x===l?-t:h.x===m?-t/2:0),A.top+=o.y+(h.y===k?-u:h.y===m?-u/2:0),r.viewport?(A.adjusted=r.viewport(p,A,g,v,w,t,u),E&&A.adjusted.left&&(A.left+=E.left),E&&A.adjusted.top&&(A.top+=E.top)):A.adjusted={left:0,top:0},x.originalEvent=a.extend({},b),J.trigger(x,[p,A,z.elem||z]),x.isDefaultPrevented()?p:(delete A.adjusted,d===c||!C||isNaN(A.left)||isNaN(A.top)||e==="mouse"||!a.isFunction(g.effect)?J.css(A):a.isFunction(g.effect)&&(g.effect.call(J,p,a.extend({},A)),J.queue(function(b){a(this).css({opacity:"",height:""}),a.browser.msie&&this.style.removeAttribute("filter"),b()})),G=0,p)},redraw:function(){if(p.rendered<1||I)return p;var a=f.position.container,b,c,d,e;return I=1,f.style.height&&J.css(h,f.style.height),f.style.width?J.css(g,f.style.width):(J.css(g,"").addClass(B),c=J.width()+1,d=J.css("max-width")||"",e=J.css("min-width")||"",b=(d+e).indexOf("%")>-1?a.width()/100:0,d=(d.indexOf("%")>-1?b:1)*parseInt(d,10)||c,e=(e.indexOf("%")>-1?b:1)*parseInt(e,10)||0,c=d+e?Math.min(Math.max(c,e),d):c,J.css(g,Math.round(c)).removeClass(B)),I=0,p},disable:function(b){return"boolean"!=typeof b&&(b=!J.hasClass(w)&&!M.disabled),p.rendered?(J.toggleClass(w,b),a.attr(J[0],"aria-disabled",b)):M.disabled=!!b,p},enable:function(){return p.disable(c)},destroy:function(){var c=e[0],d=a.attr(c,E),g=e.data("qtip");p.destroyed=b,p.rendered&&(J.stop(1,0).remove(),a.each(p.plugins,function(){this.destroy&&this.destroy()})),clearTimeout(p.timers.show),clearTimeout(p.timers.hide),W();if(!g||p===g)a.removeData(c,"qtip"),f.suppress&&d&&(a.attr(c,"title",d),e.removeAttr(E)),e.removeAttr("aria-describedby");return e.unbind(".qtip-"+n),delete t[p.id],e}})}function J(e,f){var g,h,i,j,k,l=a(this),m=a(document.body),n=this===document?m:l,o=l.metadata?l.metadata(f.metadata):d,p=f.metadata.type==="html5"&&o?o[f.metadata.name]:d,s=l.data(f.metadata.name||"qtipopts");try{s=typeof s=="string"?a.parseJSON(s):s}catch(t){G("Unable to parse HTML5 attribute data: "+s)}j=a.extend(b,{},q.defaults,f,typeof s=="object"?H(s):d,H(p||o)),h=j.position,j.id=e;if("boolean"==typeof j.content.text){i=l.attr(j.content.attr);if(j.content.attr!==c&&i)j.content.text=i;else return G("Unable to locate content for tooltip! Aborting render of tooltip on element: ",l),c}h.container.length||(h.container=m),h.target===c&&(h.target=n),j.show.target===c&&(j.show.target=n),j.show.solo===b&&(j.show.solo=h.container.closest("body")),j.hide.target===c&&(j.hide.target=n),j.position.viewport===b&&(j.position.viewport=h.container),h.container=h.container.eq(0),h.at=new r.Corner(h.at),h.my=new r.Corner(h.my);if(a.data(this,"qtip"))if(j.overwrite)l.qtip("destroy");else if(j.overwrite===c)return c;return j.suppress&&(k=a.attr(this,"title"))&&a(this).removeAttr("title").attr(E,k).attr("title",""),g=new I(l,j,e,!!i),a.data(this,"qtip",g),l.bind("remove.qtip-"+e+" removeqtip.qtip-"+e,function(){g.destroy()}),g}function K(d){var e=this,f=d.elements.tooltip,g=d.options.content.ajax,h=q.defaults.content.ajax,i=".qtip-ajax",j=/)<[^<]*)*<\/script>/gi,k=b,l=c,m;d.checks.ajax={"^content.ajax":function(a,b,c){b==="ajax"&&(g=c),b==="once"?e.init():g&&g.url?e.load():f.unbind(i)}},a.extend(e,{init:function(){return g&&g.url&&f.unbind(i)[g.once?"one":"bind"]("tooltipshow"+i,e.load),e},load:function(f){function r(){var e;if(d.destroyed)return;k=c,p&&(l=b,d.show(f.originalEvent)),(e=h.complete||g.complete)&&a.isFunction(e)&&e.apply(g.context||d,arguments)}function s(b,c,e){var f;if(d.destroyed)return;o&&(b=a("
        ").append(b.replace(j,"")).find(o)),(f=h.success||g.success)&&a.isFunction(f)?f.call(g.context||d,b,c,e):d.set("content.text",b)}function t(a,b,c){if(d.destroyed||a.status===0)return;d.set("content.text",b+": "+c)}if(l){l=c;return}var i=g.url.indexOf(" "),n=g.url,o,p=!g.loading&&k;if(p)try{f.preventDefault()}catch(q){}else if(f&&f.isDefaultPrevented())return e;m&&m.abort&&m.abort(),i>-1&&(o=n.substr(i),n=n.substr(0,i)),m=a.ajax(a.extend({error:h.error||t,context:d},g,{url:n,success:s,complete:r}))},destroy:function(){m&&m.abort&&m.abort(),d.destroyed=b}}),e.init()}function L(a,b,c){var d=Math.ceil(b/2),e=Math.ceil(c/2),f={bottomright:[[0,0],[b,c],[b,0]],bottomleft:[[0,0],[b,0],[0,c]],topright:[[0,c],[b,0],[b,c]],topleft:[[0,0],[0,c],[b,c]],topcenter:[[0,c],[d,0],[b,c]],bottomcenter:[[0,0],[b,0],[d,c]],rightcenter:[[0,0],[b,e],[0,c]],leftcenter:[[b,0],[b,c],[0,e]]};return f.lefttop=f.bottomright,f.righttop=f.bottomleft,f.leftbottom=f.topright,f.rightbottom=f.topleft,f[a.string()]}function M(n,o){function C(){w.width=s.height,w.height=s.width}function D(){w.width=s.width,w.height=s.height}function E(a,d,g,h){if(!t.tip)return;var o=q.corner.clone(),r=g.adjusted,u=n.options.position.adjust.method.split(" "),w=u[0],x=u[1]||u[0],y={left:c,top:c,x:0,y:0},z,A={},B;q.corner.fixed!==b&&(w===p&&o.precedance===e&&r.left&&o.y!==m?o.precedance=o.precedance===e?f:e:w!==p&&r.left&&(o.x=o.x===m?r.left>0?j:l:o.x===j?l:j),x===p&&o.precedance===f&&r.top&&o.x!==m?o.precedance=o.precedance===f?e:f:x!==p&&r.top&&(o.y=o.y===m?r.top>0?i:k:o.y===i?k:i),o.string()!==v.corner.string()&&(v.top!==r.top||v.left!==r.left)&&q.update(o,c)),z=q.position(o,r),z[o.x]+=F(o,o.x,b),z[o.y]+=F(o,o.y,b),z.right!==undefined&&(z.left=-z.right),z.bottom!==undefined&&(z.top=-z.bottom),z.user=Math.max(0,s.offset);if(y.left=w===p&&!!r.left)o.x===m?A["margin-left"]=y.x=z["margin-left"]-r.left:(B=z.right!==undefined?[r.left,-z.left]:[-r.left,z.left],(y.x=Math.max(B[0],B[1]))>B[0]&&(g.left-=r.left,y.left=c),A[z.right!==undefined?l:j]=y.x);if(y.top=x===p&&!!r.top)o.y===m?A["margin-top"]=y.y=z["margin-top"]-r.top:(B=z.bottom!==undefined?[r.top,-z.top]:[-r.top,z.top],(y.y=Math.max(B[0],B[1]))>B[0]&&(g.top-=r.top,y.top=c),A[z.bottom!==undefined?k:i]=y.y);t.tip.css(A).toggle(!(y.x&&y.y||o.x===m&&y.y||o.y===m&&y.x)),g.left-=z.left.charAt?z.user:w!==p||y.top||!y.left&&!y.top?z.left:0,g.top-=z.top.charAt?z.user:x!==p||y.left||!y.left&&!y.top?z.top:0,v.left=r.left,v.top=r.top,v.corner=o.clone()}function F(a,b,c){b=b?b:a[a.precedance];var d=u.hasClass(B),e=t.titlebar&&a.y===i,f=e?t.titlebar:t.tooltip,g="border-"+b+"-width",h;return u.addClass(B),h=parseInt(f.css(g),10),h=(c?h||parseInt(u.css(g),10):h)||0,u.toggleClass(B,d),h}function G(b){function j(a){return parseInt(d.css(a),10)||parseInt(u.css(a),10)}var c=t.titlebar&&b.y===i,d=c?t.titlebar:t.content,e=a.browser.mozilla,f=e?"-moz-":a.browser.webkit?"-webkit-":"",g="border-radius-"+b.y+b.x,h="border-"+b.y+"-"+b.x+"-radius";return j(h)||j(f+h)||j(f+g)||j(g)||0}function H(a){var b=a.precedance===f,c=w[b?g:h],d=w[b?h:g],e=a.string().indexOf(m)>-1,i=c*(e?.5:1),j=Math.pow,k=Math.round,l,n,o,p=Math.sqrt(j(i,2)+j(d,2)),q=[y/i*p,y/d*p];return q[2]=Math.sqrt(j(q[0],2)-j(y,2)),q[3]=Math.sqrt(j(q[1],2)-j(y,2)),l=p+q[2]+q[3]+(e?0:q[0]),n=l/p,o=[k(n*d),k(n*c)],{height:o[b?0:1],width:o[b?1:0]}}var q=this,s=n.options.style.tip,t=n.elements,u=t.tooltip,v={top:0,left:0},w={width:s.width,height:s.height},x={},y=s.border||0,z=".qtip-tip",A=!!(a("")[0]||{}).getContext;q.corner=d,q.mimic=d,q.border=y,q.offset=s.offset,q.size=w,n.checks.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){q.init()||q.destroy(),n.reposition()},"^style.tip.(height|width)$":function(){w={width:s.width,height:s.height},q.create(),q.update(),n.reposition()},"^content.title.text|style.(classes|widget)$":function(){t.tip&&t.tip.length&&q.update()}},a.extend(q,{init:function(){var b=q.detectCorner()&&(A||a.browser.msie);return b&&(q.create(),q.update(),u.unbind(z).bind("tooltipmove"+z,E)),b},detectCorner:function(){var a=s.corner,d=n.options.position,e=d.at,f=d.my.string?d.my.string():d.my;return a===c||f===c&&e===c?c:(a===b?q.corner=new r.Corner(f):a.string||(q.corner=new r.Corner(a),q.corner.fixed=b),v.corner=new r.Corner(q.corner.string()),q.corner.string()!=="centercenter")},detectColours:function(b){var c,d,e,f=t.tip.css("cssText",""),g=b||q.corner,h=g[g.precedance],j="border-"+h+"-color",k="border"+h.charAt(0)+h.substr(1)+"Color",l=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i,n="background-color",o="transparent",p=" !important",r=t.titlebar&&(g.y===i||g.y===m&&f.position().top+w.height/2+s.offset",{"class":"ui-tooltip-tip"}).css({width:b,height:c}).prependTo(u),A?a("").appendTo(t.tip)[0].getContext("2d").save():(d='',t.tip.html(d+d),a("*",t.tip).bind("click mousedown",function(a){a.stopPropagation()}))},update:function(g,h){var n=t.tip,o=n.children(),p=w.width,z=w.height,B="px solid ",E="px dashed transparent",G=s.mimic,I=Math.round,J,K,M,N,O;g||(g=v.corner||q.corner),G===c?G=g:(G=new r.Corner(G),G.precedance=g.precedance,G.x==="inherit"?G.x=g.x:G.y==="inherit"?G.y=g.y:G.x===G.y&&(G[g.precedance]=g[g.precedance])),J=G.precedance,g.precedance===e?C():D(),t.tip.css({width:p=w.width,height:z=w.height}),q.detectColours(g),x.border!=="transparent"?(y=F(g,d,b),s.border===0&&y>0&&(x.fill=x.border),q.border=y=s.border!==b?s.border:y):q.border=y=0,M=L(G,p,z),q.size=O=H(g),n.css(O),g.precedance===f?N=[I(G.x===j?y:G.x===l?O.width-p-y:(O.width-p)/2),I(G.y===i?O.height-z:0)]:N=[I(G.x===j?O.width-p:0),I(G.y===i?y:G.y===k?O.height-z-y:(O.height-z)/2)],A?(o.attr(O),K=o[0].getContext("2d"),K.restore(),K.save(),K.clearRect(0,0,3e3,3e3),K.fillStyle=x.fill,K.strokeStyle=x.border,K.lineWidth=y*2,K.lineJoin="miter",K.miterLimit=100,K.translate(N[0],N[1]),K.beginPath(),K.moveTo(M[0][0],M[0][1]),K.lineTo(M[1][0],M[1][1]),K.lineTo(M[2][0],M[2][1]),K.closePath(),y&&(u.css("background-clip")==="border-box"&&(K.strokeStyle=x.fill,K.stroke()),K.strokeStyle=x.border,K.stroke()),K.fill()):(M="m"+M[0][0]+","+M[0][1]+" l"+M[1][0]+","+M[1][1]+" "+M[2][0]+","+M[2][1]+" xe",N[2]=y&&/^(r|b)/i.test(g.string())?parseFloat(a.browser.version,10)===8?2:1:0,o.css({antialias:""+(G.string().indexOf(m)>-1),left:N[0]-N[2]*Number(J===e),top:N[1]-N[2]*Number(J===f),width:p+y,height:z+y}).each(function(b){var c=a(this);c[c.prop?"prop":"attr"]({coordsize:p+y+" "+(z+y),path:M,fillcolor:x.fill,filled:!!b,stroked:!b}).css({display:y||b?"block":"none"}),!b&&c.html()===""&&c.html('')})),h!==c&&q.position(g)},position:function(b){var d=t.tip,k={},l=Math.max(0,s.offset),n,o,p;return s.corner===c||!d?c:(b=b||q.corner,n=b.precedance,o=H(b),p=[b.x,b.y],n===e&&p.reverse(),a.each(p,function(a,c){var d,e;c===m?(d=n===f?j:i,k[d]="50%",k["margin-"+d]=-Math.round(o[n===f?g:h]/2)+l):(d=F(b,c),e=G(b),k[c]=a?0:l+(e>d?e:-d))}),k[b[n]]-=o[n===e?g:h],d.css({top:"",bottom:"",left:"",right:"",margin:""}).css(k),k)},destroy:function(){t.tip&&t.tip.remove(),t.tip=!1,u.unbind(z)}}),q.init()}function N(d){function q(){o=a(n,h).not("[disabled]").map(function(){return typeof this.focus=="function"?this:null})}function s(a){o.length<1&&a.length?a.not("body").blur():o.first().focus()}function t(b){var d=a(b.target),e=d.closest(".qtip"),f;f=e.length<1?c:parseInt(e[0].style.zIndex,10)>parseInt(h[0].style.zIndex,10),!f&&a(b.target).closest(x)[0]!==h[0]&&s(d)}var e=this,f=d.options.show.modal,g=d.elements,h=g.tooltip,i="#qtip-overlay",j=".qtipmodal",k=j+d.id,l="is-modal-qtip",m=a(document.body),n=r.modal.focusable.join(","),o={},p;d.checks.modal={"^show.modal.(on|blur)$":function(){e.init(),g.overlay.toggle(h.is(":visible"))},"^content.text$":function(){q()}},a.extend(e,{init:function(){return f.on?(p=e.create(),h.attr(l,b).css("z-index",r.modal.zindex+a(x+"["+l+"]").length).unbind(j).unbind(k).bind("tooltipshow"+j+" tooltiphide"+j,function(b,c,d){var f=b.originalEvent;if(b.target===h[0])if(f&&b.type==="tooltiphide"&&/mouse(leave|enter)/.test(f.type)&&a(f.relatedTarget).closest(p[0]).length)try{b.preventDefault()}catch(g){}else(!f||f&&!f.solo)&&e[b.type.replace("tooltip","")](b,d)}).bind("tooltipfocus"+j,function(b){if(b.isDefaultPrevented()||b.target!==h[0])return;var c=a(x).filter("["+l+"]"),d=r.modal.zindex+c.length,e=parseInt(h[0].style.zIndex,10);p[0].style.zIndex=d-2,c.each(function(){this.style.zIndex>e&&(this.style.zIndex-=1)}),c.end().filter("."+z).qtip("blur",b.originalEvent),h.addClass(z)[0].style.zIndex=d;try{b.preventDefault()}catch(f){}}).bind("tooltiphide"+j,function(b){b.target===h[0]&&a("["+l+"]").filter(":visible").not(h).last().qtip("focus",b)}),f.escape&&a(document).unbind(k).bind("keydown"+k,function(a){a.keyCode===27&&h.hasClass(z)&&d.hide(a)}),f.blur&&g.overlay.unbind(k).bind("click"+k,function(a){h.hasClass(z)&&d.hide(a)}),q(),e):e},create:function(){function d(){p.css({height:a(window).height(),width:a(window).width()})}var b=a(i);return b.length?g.overlay=b.insertAfter(a(x).last()):(p=g.overlay=a("
        ",{id:i.substr(1),html:"
        ",mousedown:function(){return c}}).hide().insertAfter(a(x).last()),a(window).unbind(j).bind("resize"+j,d),d(),p)},toggle:function(d,g,i){if(d&&d.isDefaultPrevented())return e;var j=f.effect,n=g?"show":"hide",o=p.is(":visible"),q=a("["+l+"]").filter(":visible").not(h),r;return p||(p=e.create()),p.is(":animated")&&o===g||!g&&q.length?e:(g?(p.css({left:0,top:0}),p.toggleClass("blurs",f.blur),f.stealfocus!==c&&(m.bind("focusin"+k,t),s(a("body *")))):m.unbind("focusin"+k),p.stop(b,c),a.isFunction(j)?j.call(p,g):j===c?p[n]():p.fadeTo(parseInt(i,10)||90,g?1:0,function(){g||a(this).hide()}),g||p.queue(function(a){p.css({left:"",top:""}),a()}),e)},show:function(a,c){return e.toggle(a,b,c)},hide:function(a,b){return e.toggle(a,c,b)},destroy:function(){var b=p;return b&&(b=a("["+l+"]").not(h).length<1,b?(g.overlay.remove(),a(document).unbind(j)):g.overlay.unbind(j+d.id),m.undelegate("*","focusin"+k)),h.removeAttr(l).unbind(j)}}),e.init()}function O(b){var c=this,d=b.elements,e=d.tooltip,f=".bgiframe-"+b.id;a.extend(c,{init:function(){d.bgiframe=a(''),d.bgiframe.appendTo(e),e.bind("tooltipmove"+f,c.adjust)},adjust:function(){var a=b.get("dimensions"),c=b.plugins.tip,f=d.tip,g,h;h=parseInt(e.css("border-left-width"),10)||0,h={left:-h,top:-h},c&&f&&(g=c.corner.precedance==="x"?["width","left"]:["height","top"],h[g[1]]-=f[g[0]]()),d.bgiframe.css(h).css(a)},destroy:function(){d.bgiframe.remove(),e.unbind(f)}}),c.init()}"use strict";var b=!0,c=!1,d=null,e="x",f="y",g="width",h="height",i="top",j="left",k="bottom",l="right",m="center",n="flip",o="flipinvert",p="shift",q,r,s,t={},u="ui-tooltip",v="ui-widget",w="ui-state-disabled",x="div.qtip."+u,y=u+"-default",z=u+"-focus",A=u+"-hover",B=u+"-fluid",C="-31000px",D="_replacedByqTip",E="oldtitle",F;q=a.fn.qtip=function(e,f,g){var h=(""+e).toLowerCase(),i=d,j=a.makeArray(arguments).slice(1),k=j[j.length-1],l=this[0]?a.data(this[0],"qtip"):d;if(!arguments.length&&l||h==="api")return l;if("string"==typeof e)return this.each(function(){var d=a.data(this,"qtip");if(!d)return b;k&&k.timeStamp&&(d.cache.event=k);if(h!=="option"&&h!=="options"||!f)d[h]&&d[h].apply(d[h],j);else if(a.isPlainObject(f)||g!==undefined)d.set(f,g);else return i=d.get(f),c}),i!==d?i:this;if("object"==typeof e||!arguments.length)return l=H(a.extend(b,{},e)),q.bind.call(this,l,k)},q.bind=function(d,e){return this.each(function(f){function m(b){function d(){k.render(typeof b=="object"||g.show.ready),h.show.add(h.hide).unbind(j)}if(k.cache.disabled)return c;k.cache.event=a.extend({},b),k.cache.target=b?a(b.target):[undefined],g.show.delay>0?(clearTimeout(k.timers.show),k.timers.show=setTimeout(d,g.show.delay),i.show!==i.hide&&h.hide.bind(i.hide,function(){clearTimeout(k.timers.show)})):d()}var g,h,i,j,k,l;l=a.isArray(d.id)?d.id[f]:d.id,l=!l||l===c||l.length<1||t[l]?q.nextid++:t[l]=l,j=".qtip-"+l+"-create",k=J.call(this,l,d);if(k===c)return b;g=k.options,a.each(r,function(){this.initialize==="initialize"&&this(k)}),h={show:g.show.target,hide:g.hide.target},i={show:a.trim(""+g.show.event).replace(/ /g,j+" ")+j,hide:a.trim(""+g.hide.event).replace(/ /g,j+" ")+j},/mouse(over|enter)/i.test(i.show)&&!/mouse(out|leave)/i.test(i.hide)&&(i.hide+=" mouseleave"+j),h.show.bind("mousemove"+j,function(a){s={pageX:a.pageX,pageY:a.pageY,type:"mousemove"},k.cache.onTarget=b}),h.show.bind(i.show,m),(g.show.ready||g.prerender)&&m(e)})},r=q.plugins={Corner:function(a){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,m).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase();var b=a.charAt(0);this.precedance=b==="t"||b==="b"?f:e,this.string=function(){return this.precedance===f?this.y+this.x:this.x+this.y},this.abbrev=function(){var a=this.x.substr(0,1),b=this.y.substr(0,1);return a===b?a:this.precedance===f?b+a:a+b},this.invertx=function(a){this.x=this.x===j?l:this.x===l?j:a||this.x},this.inverty=function(a){this.y=this.y===i?k:this.y===k?i:a||this.y},this.clone=function(){return{x:this.x,y:this.y,precedance:this.precedance,string:this.string,abbrev:this.abbrev,clone:this.clone,invertx:this.invertx,inverty:this.inverty}}},offset:function(b,c){function j(a,b){d.left+=b*a.scrollLeft(),d.top+=b*a.scrollTop()}var d=b.offset(),e=b.closest("body")[0],f=c,g,h,i;if(f){do f.css("position")!=="static"&&(h=f.position(),d.left-=h.left+(parseInt(f.css("borderLeftWidth"),10)||0)+(parseInt(f.css("marginLeft"),10)||0),d.top-=h.top+(parseInt(f.css("borderTopWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0),!g&&(i=f.css("overflow"))!=="hidden"&&i!=="visible"&&(g=f));while((f=a(f[0].offsetParent)).length);g&&g[0]!==e&&j(g,1)}return d},iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||c,fn:{attr:function(b,c){if(this.length){var d=this[0],e="title",f=a.data(d,"qtip");if(b===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?a.attr(d,E):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",c),this.attr(E,c))}return a.fn["attr"+D].apply(this,arguments)},clone:function(b){var c=a([]),d="title",e=a.fn["clone"+D].apply(this,arguments);return b||e.filter("["+E+"]").attr("title",function(){return a.attr(this,E)}).removeAttr(E),e}}},a.each(r.fn,function(c,d){if(!d||a.fn[c+D])return b;var e=a.fn[c+D]=a.fn[c];a.fn[c]=function(){return d.apply(this,arguments)||e.apply(this,arguments)}}),a.ui||(a["cleanData"+D]=a.cleanData,a.cleanData=function(b){for(var c=0,d;(d=b[c])!==undefined;c++)try{a(d).triggerHandler("removeqtip")}catch(e){}a["cleanData"+D](b)}),q.version="@VERSION",q.nextid=0,q.inactiveEvents="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),q.zindex=15e3,q.defaults={prerender:c,id:c,overwrite:b,suppress:b,content:{text:b,attr:"title",title:{text:c,button:c}},position:{my:"top left",at:"bottom right",target:c,container:c,viewport:c,adjust:{x:0,y:0,mouse:b,resize:b,method:"flip flip"},effect:function(b,d,e){a(this).animate(d,{duration:200,queue:c})}},show:{target:c,event:"mouseenter",effect:b,delay:90,solo:c,ready:c,autofocus:c},hide:{target:c,event:"mouseleave",effect:b,delay:0,fixed:c,inactive:c,leave:"window",distance:c},style:{classes:"",widget:c,width:c,height:c,def:b},events:{render:d,move:d,show:d,hide:d,toggle:d,visible:d,hidden:d,focus:d,blur:d}},r.svg=function(b,c,d,e){var f=a(document),g=c[0],h={width:0,height:0,position:{top:1e10,left:1e10}},i,j,k,l,m;while(!g.getBBox)g=g.parentNode;if(g.getBBox&&g.parentNode){i=g.getBBox(),j=g.getScreenCTM(),k=g.farthestViewportElement||g;if(!k.createSVGPoint)return h;l=k.createSVGPoint(),l.x=i.x,l.y=i.y,m=l.matrixTransform(j),h.position.left=m.x,h.position.top=m.y,l.x+=i.width,l.y+=i.height,m=l.matrixTransform(j),h.width=m.x-h.position.left,h.height=m.y-h.position.top,h.position.left+=f.scrollLeft(),h.position.top+=f.scrollTop()}return h},r.ajax=function(a){var b=a.plugins.ajax;return"object"==typeof b?b:a.plugins.ajax=new K(a)},r.ajax.initialize="render",r.ajax.sanitize=function(a){var b=a.content,c;b&&"ajax"in b&&(c=b.ajax,typeof c!="object"&&(c=a.content.ajax={url:c}),"boolean"!=typeof c.once&&c.once&&(c.once=!!c.once))},a.extend(b,q.defaults,{content:{ajax:{loading:b,once:b}}}),r.tip=function(a){var b=a.plugins.tip;return"object"==typeof b?b:a.plugins.tip=new M(a)},r.tip.initialize="render",r.tip.sanitize=function(a){var c=a.style,d;c&&"tip"in c&&(d=a.style.tip,typeof d!="object"&&(a.style.tip={corner:d}),/string|boolean/i.test(typeof d.corner)||(d.corner=b),typeof d.width!="number"&&delete d.width,typeof d.height!="number"&&delete d.height,typeof d.border!="number"&&d.border!==b&&delete d.border,typeof d.offset!="number"&&delete d.offset)},a.extend(b,q.defaults,{style:{tip:{corner:b,mimic:c,width:6,height:6,border:b,offset:0}}}),r.modal=function(a){var b=a.plugins.modal;return"object"==typeof b?b:a.plugins.modal=new N(a)},r.modal.initialize="render",r.modal.sanitize=function(a){a.show&&(typeof a.show.modal!="object"?a.show.modal={on:!!a.show.modal}:typeof a.show.modal.on=="undefined"&&(a.show.modal.on=b))},r.modal.zindex=q.zindex-200,r.modal.focusable=["a[href]","area[href]","input","select","textarea","button","iframe","object","embed","[tabindex]","[contenteditable]"],a.extend(b,q.defaults,{show:{modal:{on:c,effect:b,blur:b,stealfocus:b,escape:b}}}),r.viewport=function(a,b,c,d,n,q,r){function J(a,c,d,e,f,g,h,i,j){var k=b[f],l=v[a],n=w[a],q=d===p,r=-C.offset[f]+B.offset[f]+B["scroll"+f],s=l===f?j:l===g?-j:-j/2,t=n===f?i:n===g?-i:-i/2,u=E&&E.size?E.size[h]||0:0,x=E&&E.corner&&E.corner.precedance===a&&!q?u:0,y=r-k+x,z=k+j-B[h]-r+x,A=s-(v.precedance===a||l===v[c]?t:0)-(n===m?i/2:0);return q?(x=E&&E.corner&&E.corner.precedance===c?u:0,A=(l===f?1:-1)*s-x,b[f]+=y>0?y:z>0?-z:0,b[f]=Math.max(-C.offset[f]+B.offset[f]+(x&&E.corner[a]===m?E.offset:0),k-A,Math.min(Math.max(-C.offset[f]+B.offset[f]+B[h],k+A),b[f]))):(e*=d===o?2:0,y>0&&(l!==f||z>0)?(b[f]-=A+e,H["invert"+a](f)):z>0&&(l!==g||y>0)&&(b[f]-=(l===m?-A:A)+e,H["invert"+a](g)),b[f]z&&(b[f]=k,H=undefined)),b[f]-k}var s=c.target,t=a.elements.tooltip,v=c.my,w=c.at,x=c.adjust,y=x.method.split(" "),z=y[0],A=y[1]||y[0],B=c.viewport,C=c.container,D=a.cache,E=a.plugins.tip,F={left:0,top:0},G,H,I;if(!B.jquery||s[0]===window||s[0]===document.body||x.method==="none")return F;G=t.css("position")==="fixed",B={elem:B,height:B[(B[0]===window?"h":"outerH")+"eight"](),width:B[(B[0]===window?"w":"outerW")+"idth"](),scrollleft:G?0:B.scrollLeft(),scrolltop:G?0:B.scrollTop(),offset:B.offset()||{left:0,top:0}},C={elem:C,scrollLeft:C.scrollLeft(),scrollTop:C.scrollTop(),offset:C.offset()||{left:0,top:0}};if(z!=="shift"||A!=="shift")H=v.clone();return F={left:z!=="none"?J(e,f,z,x.x,j,l,g,d,q):0,top:A!=="none"?J(f,e,A,x.y,i,k,h,n,r):0},H&&D.lastClass!==(I=u+"-pos-"+H.abbrev())&&t.removeClass(a.cache.lastClass).addClass(a.cache.lastClass=I),F},r.imagemap=function(b,c,d,e){function v(a,b,c){var d=0,e=1,f=1,g=0,h=0,n=a.width,o=a.height;while(n>0&&o>0&&e>0&&f>0){n=Math.floor(n/2),o=Math.floor(o/2),c.x===j?e=n:c.x===l?e=a.width-n:e+=Math.floor(n/2),c.y===i?f=o:c.y===k?f=a.height-o:f+=Math.floor(o/2),d=b.length;while(d--){if(b.length<2)break;g=b[d][0]-a.position.left,h=b[d][1]-a.position.top,(c.x===j&&g>=e||c.x===l&&g<=e||c.x===m&&(ga.width-e)||c.y===i&&h>=f||c.y===k&&h<=f||c.y===m&&(ha.height-f))&&b.splice(d,1)}}return{left:b[0][0],top:b[0][1]}}c.jquery||(c=a(c));var f=b.cache.areas={},g=(c[0].shape||c.attr("shape")).toLowerCase(),h=c[0].coords||c.attr("coords"),n=h.split(","),o=[],p=a('img[usemap="#'+c.parent("map").attr("name")+'"]'),q=p.offset(),r={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10}},s=0,t=0,u;q.left+=Math.ceil((p.outerWidth()-p.width())/2),q.top+=Math.ceil((p.outerHeight()-p.height())/2);if(g==="poly"){s=n.length;while(s--)t=[parseInt(n[--s],10),parseInt(n[s+1],10)],t[0]>r.position.right&&(r.position.right=t[0]),t[0]r.position.bottom&&(r.position.bottom=t[1]),t[1]
        '); - var $tpList = $('
          '); - - // Build the list. - for(var i = 0; i < times.length; i++) { - $tpList.append("
        • " + times[i] + "
        • "); - } - $tpDiv.append($tpList); - // Append the timPicker to the body and position it. - $tpDiv.appendTo('body').hide(); - - // Store the mouse state, used by the blur event. Use mouseover instead of - // mousedown since Opera fires blur before mousedown. - $tpDiv.mouseover(function() { - tpOver = true; - }).mouseout(function() { - tpOver = false; - }); - - $("li", $tpList).mouseover(function() { - if (!keyDown) { - $(selectedSelector, $tpDiv).removeClass(selectedClass); - $(this).addClass(selectedClass); - } - }).mousedown(function() { - tpOver = true; - }).click(function() { - setTimeVal(elm, this, $tpDiv, settings); - tpOver = false; - }); - - var showPicker = function() { - if ($tpDiv.is(":visible")) { - return false; - } - $("li", $tpDiv).removeClass(selectedClass); - - // Position - var elmOffset = $(elm).offset(); - $tpDiv.css({'top':elmOffset.top + elm.offsetHeight, 'left':elmOffset.left}); - - // Show picker. This has to be done before scrollTop is set since that - // can't be done on hidden elements. - $tpDiv.show(); - - // Try to find a time in the list that matches the entered time. - var time = elm.value ? timeStringToDate(elm.value, settings) : startTime; - var startMin = startTime.getHours() * 60 + startTime.getMinutes(); - var min = (time.getHours() * 60 + time.getMinutes()) - startMin; - var steps = Math.round(min / settings.step); - var roundTime = normaliseTime(new Date(0, 0, 0, 0, (steps * settings.step + startMin), 0)); - roundTime = (startTime < roundTime && roundTime <= endTime) ? roundTime : startTime; - var $matchedTime = $("li:contains(" + formatTime(roundTime, settings) + ")", $tpDiv); - - if ($matchedTime.length) { - $matchedTime.addClass(selectedClass); - // Scroll to matched time. - $tpDiv[0].scrollTop = $matchedTime[0].offsetTop; - } - return true; - }; - // Attach to click as well as focus so timePicker can be shown again when - // clicking on the input when it already has focus. - $(elm).focus(showPicker).click(showPicker); - // Hide timepicker on blur - $(elm).blur(function() { - if (!tpOver) { - $tpDiv.hide(); - } - }); - // Keypress doesn't repeat on Safari for non-text keys. - // Keydown doesn't repeat on Firefox and Opera on Mac. - // Using kepress for Opera and Firefox and keydown for the rest seems to - // work with up/down/enter/esc. - var event = ($.browser.opera || $.browser.mozilla) ? 'keypress' : 'keydown'; - $(elm)[event](function(e) { - var $selected; - keyDown = true; - var top = $tpDiv[0].scrollTop; - switch (e.keyCode) { - case 38: // Up arrow. - // Just show picker if it's hidden. - if (showPicker()) { - return false; - }; - $selected = $(selectedSelector, $tpList); - var prev = $selected.prev().addClass(selectedClass)[0]; - if (prev) { - $selected.removeClass(selectedClass); - // Scroll item into view. - if (prev.offsetTop < top) { - $tpDiv[0].scrollTop = top - prev.offsetHeight; - } - } - else { - // Loop to next item. - $selected.removeClass(selectedClass); - prev = $("li:last", $tpList).addClass(selectedClass)[0]; - $tpDiv[0].scrollTop = prev.offsetTop - prev.offsetHeight; - } - return false; - break; - case 40: // Down arrow, similar in behaviour to up arrow. - if (showPicker()) { - return false; - }; - $selected = $(selectedSelector, $tpList); - var next = $selected.next().addClass(selectedClass)[0]; - if (next) { - $selected.removeClass(selectedClass); - if (next.offsetTop + next.offsetHeight > top + $tpDiv[0].offsetHeight) { - $tpDiv[0].scrollTop = top + next.offsetHeight; - } - } - else { - $selected.removeClass(selectedClass); - next = $("li:first", $tpList).addClass(selectedClass)[0]; - $tpDiv[0].scrollTop = 0; - } - return false; - break; - case 13: // Enter - if ($tpDiv.is(":visible")) { - var sel = $(selectedSelector, $tpList)[0]; - setTimeVal(elm, sel, $tpDiv, settings); - } - return false; - break; - case 27: // Esc - $tpDiv.hide(); - return false; - break; - } - return true; - }); - $(elm).keyup(function(e) { - keyDown = false; - }); - // Helper function to get an inputs current time as Date object. - // Returns a Date object. - this.getTime = function() { - return timeStringToDate(elm.value, settings); - }; - // Helper function to set a time input. - // Takes a Date object or string. - this.setTime = function(time) { - elm.value = formatTime(timeToDate(time, settings), settings); - // Trigger element's change events. - $(elm).change(); - }; - - }; // End fn; - - // Plugin defaults. - $.fn.timePicker.defaults = { - step:30, - startTime: new Date(0, 0, 0, 0, 0, 0), - endTime: new Date(0, 0, 0, 23, 30, 0), - separator: ':', - show24Hours: true - }; - - // Private functions. - - function setTimeVal(elm, sel, $tpDiv, settings) { - // Update input field - elm.value = $(sel).text(); - // Trigger element's change events. - $(elm).change(); - // Keep focus for all but IE (which doesn't like it) - if (!$.browser.msie) { - elm.focus(); - } - // Hide picker - $tpDiv.hide(); - } - - function formatTime(time, settings) { - var h = time.getHours(); - var hours = settings.show24Hours ? h : (((h + 11) % 12) + 1); - var minutes = time.getMinutes(); - return formatNumber(hours) + settings.separator + formatNumber(minutes) + (settings.show24Hours ? '' : ((h < 12) ? ' AM' : ' PM')); - } - - function formatNumber(value) { - return (value < 10 ? '0' : '') + value; - } - - function timeToDate(input, settings) { - return (typeof input == 'object') ? normaliseTime(input) : timeStringToDate(input, settings); - } - - function timeStringToDate(input, settings) { - if (input) { - var array = input.split(settings.separator); - var hours = parseFloat(array[0]); - var minutes = parseFloat(array[1]); - - // Convert AM/PM hour to 24-hour format. - if (!settings.show24Hours) { - if (hours === 12 && input.indexOf('AM') !== -1) { - hours = 0; - } - else if (hours !== 12 && input.indexOf('PM') !== -1) { - hours += 12; - } - } - var time = new Date(0, 0, 0, hours, minutes, 0); - return normaliseTime(time); - } - return null; - } - - /* Normalise time object to a common date. */ - function normaliseTime(time) { - time.setFullYear(2001); - time.setMonth(0); - time.setDate(0); - return time; - } - -})(jQuery); diff --git a/sources/web/public/js/templates/templates.js b/sources/web/public/js/templates/templates.js deleted file mode 100644 index d349ba4..0000000 --- a/sources/web/public/js/templates/templates.js +++ /dev/null @@ -1 +0,0 @@ -(function(){dust.register("form_open",body_0);function body_0(chk,ctx){return chk.write("
          ");}function body_1(chk,ctx){return chk.write("class=\"").reference(ctx.get("applyclass"),ctx,"h").write("\"");}function body_2(chk,ctx){return chk.write(" id=\"").reference(ctx.get("applyid"),ctx,"h").write("\"");}return body_0;})();(function(){dust.register("calendar_share_access_options",body_0);function body_0(chk,ctx){return chk.write(" ");}function body_1(chk,ctx){return chk.write(" selected=\"true\"");}function body_2(chk,ctx){return chk.reference(ctx.get("write_access"),ctx,"h");}function body_3(chk,ctx){return chk.write(" selected=\"true\"");}function body_4(chk,ctx){return chk.reference(ctx.get("write_access"),ctx,"h");}return body_0;})();(function(){dust.register("calendar_create_dialog",body_0);function body_0(chk,ctx){return chk.write("
          ").partial("form_open",ctx,{"applyclass":"form-horizontal","applyid":"calendar_create_form"}).partial("calendar_basic_form_part",ctx,null).partial("form_close",ctx,null).write("
          ");}return body_0;})();(function(){dust.register("form_close",body_0);function body_0(chk,ctx){return chk.write("
          ");}return body_0;})();(function(){dust.register("calendar_delete_dialog",body_0);function body_0(chk,ctx){return chk.write("
          ").partial("form_open",ctx,null).write("

          ").helper("i18n",ctx,{},{"type":"messages","name":"info_confirmcaldelete"}).write("

          ").reference(ctx.get("displayname"),ctx,"h").write("

          ").helper("i18n",ctx,{},{"type":"messages","name":"info_permanentremoval"}).write("

          ").partial("form_close",ctx,null).write("
          ");}return body_0;})();(function(){dust.register("reminders_table",body_0);function body_0(chk,ctx){return chk.section(ctx.get("visible_reminders"),ctx,{"block":body_1},null).write("").section(ctx.get("reminders"),ctx,{"block":body_2},null).write("
          ").helper("i18n",ctx,{},{"type":"messages","name":"info_noreminders"}).write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"newreminder"}).write("").partial("reminder_row",ctx,{"add":"true"}).write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"newreminder"}).write("").partial("reminder_row",ctx,{"add":"true","is_absolute":"true"}).write("
          ");}function body_1(chk,ctx){return chk.write("");}function body_2(chk,ctx){return chk.partial("reminder_row",ctx,null);}return body_0;})();(function(){dust.register("calendar_share_table",body_0);function body_0(chk,ctx){return chk.write("").section(ctx.get("share_with"),ctx,{"block":body_1},null).write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"username"}).write("").helper("i18n",ctx,{},{"type":"labels","name":"access"}).write("
          ").helper("i18n",ctx,{},{"type":"messages","name":"info_notshared"}).write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"sharewith"}).write("
          ");}function body_1(chk,ctx){return chk.partial("calendar_share_row",ctx,null);}return body_0;})();(function(){dust.register("event_details_popup",body_0);function body_0(chk,ctx){return chk.write("

          ").reference(ctx.get("formatted_start"),ctx,"h").write(" ").reference(ctx.get("formatted_end"),ctx,"h").write("

          ").helper("i18n",ctx,{},{"type":"labels","name":"calendar"}).write("
          ").reference(ctx.getPath(false,["caldata","displayname"]),ctx,"h").write("
          ").exists(ctx.get("location"),ctx,{"block":body_1},null).exists(ctx.get("description"),ctx,{"block":body_2},null).exists(ctx.get("rrule"),ctx,{"block":body_3},null).section(ctx.get("reminders"),ctx,{"block":body_7},null).notexists(ctx.get("disable_actions"),ctx,{"block":body_8},null).write("
          ");}function body_1(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"location"}).write("
          ").reference(ctx.get("location"),ctx,"h").write("
          ");}function body_2(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"description"}).write("
          ").reference(ctx.get("formatted_description"),ctx,"h").write("
          ");}function body_3(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"repeat"}).write("
          ").exists(ctx.get("rrule_explained"),ctx,{"else":body_4,"block":body_5},null);}function body_4(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"messages","name":"info_repetition_unparseable"}).write(" ").reference(ctx.get("rrule"),ctx,"h").write("
          ");}function body_5(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"messages","name":"info_repetition_human","explanation":body_6}).write("
          ");}function body_6(chk,ctx){return chk.reference(ctx.get("rrule_explained"),ctx,"h");}function body_7(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"labels","name":"reminder"}).write("
          ").partial("reminder_description",ctx,null).write("
          ");}function body_8(chk,ctx){return chk.write("
          ");}return body_0;})();(function(){dust.register("datepicker_button",body_0);function body_0(chk,ctx){return chk.write("");}return body_0;})();(function(){dust.register("calendar_modify_dialog",body_0);function body_0(chk,ctx){return chk.write("
          ").partial("form_open",ctx,{"applyclass":"form-horizontal","applyid":"calendar_modify_form"}).write("
          ").exists(ctx.get("user_from"),ctx,{"block":body_3},null).partial("calendar_basic_form_part",ctx,null).write("
          ").exists(ctx.get("enable_calendar_sharing"),ctx,{"block":body_7},null).partial("form_close",ctx,null).write("
          ");}function body_1(chk,ctx){return chk.notexists(ctx.get("shared"),ctx,{"block":body_2},null);}function body_2(chk,ctx){return chk.write("
        • ").helper("i18n",ctx,{},{"type":"labels","name":"shareoptions"}).write("
        • ");}function body_3(chk,ctx){return chk.write("
          ").helper("i18n",ctx,{},{"type":"messages","name":"info_sharedby","user":body_4}).write(" ").helper("eq",ctx,{"block":body_5},{"key":body_6,"value":"0"}).write("
          ");}function body_4(chk,ctx){return chk.reference(ctx.get("user_from"),ctx,"h");}function body_5(chk,ctx){return chk.write("(").helper("i18n",ctx,{},{"type":"labels","name":"readonly"}).write(")");}function body_6(chk,ctx){return chk.reference(ctx.get("write_access"),ctx,"h");}function body_7(chk,ctx){return chk.notexists(ctx.get("shared"),ctx,{"block":body_8},null);}function body_8(chk,ctx){return chk.write("
          ").partial("calendar_share_table",ctx,null).write("
          ");}return body_0;})();(function(){dust.register("calendar_basic_form_part",body_0);function body_0(chk,ctx){return chk.exists(ctx.get("calendar"),ctx,{"block":body_1},null).write("").partial("form_element_start",ctx,{"for":"displayname","label":"displayname"}).write("").partial("form_element_end",ctx,null).partial("form_element_start",ctx,{"for":"color","label":"color"}).write("").partial("form_element_end",ctx,null).exists(ctx.get("public_url"),ctx,{"block":body_7},null);}function body_1(chk,ctx){return chk.write("");}function body_2(chk,ctx){return chk.write("false");}function body_3(chk,ctx){return chk.write("true");}function body_4(chk,ctx){return chk.reference(ctx.get("displayname"),ctx,"h");}function body_5(chk,ctx){return chk.reference(ctx.get("default_calendar_color"),ctx,"h");}function body_6(chk,ctx){return chk.reference(ctx.get("color"),ctx,"h");}function body_7(chk,ctx){return chk.write("");}return body_0;})();(function(){dust.register("form_element_start",body_0);function body_0(chk,ctx){return chk.write("
          ");}function body_1(chk,ctx){return chk.write("for=\"").reference(ctx.get("for"),ctx,"h").write("\"");}return body_0;})();(function(){dust.register("calendar_share_row",body_0);function body_0(chk,ctx){return chk.write("").reference(ctx.get("username"),ctx,"h").write("\"").helper("i18n",ctx,{},{"type":"labels","name":"delete"}).write("\"title=\"").helper("i18n",ctx,{},{"type":"labels","name":"delete"}).write("\"");}return body_0;})();(function(){dust.register("form_element_end",body_0);function body_0(chk,ctx){return chk.exists(ctx.get("input_help"),ctx,{"block":body_1},null).write("
          ");}function body_1(chk,ctx){return chk.write("

          ").reference(ctx.get("input_help"),ctx,"h").write("

          ");}return body_0;})();(function(){dust.register("reminder_row",body_0);function body_0(chk,ctx){return chk.write("").notexists(ctx.get("add"),ctx,{"block":body_5},null).exists(ctx.get("is_absolute"),ctx,{"else":body_6,"block":body_7},null).write("").exists(ctx.get("is_absolute"),ctx,{"else":body_8,"block":body_32},null).write("").exists(ctx.get("add"),ctx,{"else":body_38,"block":body_39},null).write("");}function body_1(chk,ctx){return chk.write("is_absolute");}function body_2(chk,ctx){return chk.write("reminders[is_absolute][]");}function body_3(chk,ctx){return chk.write("false");}function body_4(chk,ctx){return chk.write("true");}function body_5(chk,ctx){return chk.write("");}function body_6(chk,ctx){return chk.write("");}function body_7(chk,ctx){return chk.write("");}function body_8(chk,ctx){return chk.write("").notexists(ctx.get("add"),ctx,{"block":body_31},null);}function body_9(chk,ctx){return chk.write("qty");}function body_10(chk,ctx){return chk.write("reminders[qty][]");}function body_11(chk,ctx){return chk.write("interval");}function body_12(chk,ctx){return chk.write("reminders[interval][]");}function body_13(chk,ctx){return chk.write(" selected=\"true\"");}function body_14(chk,ctx){return chk.reference(ctx.get("interval"),ctx,"h");}function body_15(chk,ctx){return chk.write(" selected=\"true\"");}function body_16(chk,ctx){return chk.reference(ctx.get("interval"),ctx,"h");}function body_17(chk,ctx){return chk.write(" selected=\"true\"");}function body_18(chk,ctx){return chk.reference(ctx.get("interval"),ctx,"h");}function body_19(chk,ctx){return chk.write(" selected=\"true\"");}function body_20(chk,ctx){return chk.reference(ctx.get("interval"),ctx,"h");}function body_21(chk,ctx){return chk.write("before");}function body_22(chk,ctx){return chk.write("reminders[before][]");}function body_23(chk,ctx){return chk.write(" selected=\"true\"");}function body_24(chk,ctx){return chk.notexists(ctx.get("add"),ctx,{"block":body_25},null);}function body_25(chk,ctx){return chk.write(" selected=\"true\"");}function body_26(chk,ctx){return chk.write("relatedStart");}function body_27(chk,ctx){return chk.write("reminders[relatedStart][]");}function body_28(chk,ctx){return chk.write(" selected=\"true\"");}function body_29(chk,ctx){return chk.notexists(ctx.get("add"),ctx,{"block":body_30},null);}function body_30(chk,ctx){return chk.write(" selected=\"true\"");}function body_31(chk,ctx){return chk.write("");}function body_32(chk,ctx){return chk.write("").notexists(ctx.get("add"),ctx,{"block":body_37},null);}function body_33(chk,ctx){return chk.write("tdate");}function body_34(chk,ctx){return chk.write("reminders[tdate][]");}function body_35(chk,ctx){return chk.write("ttime");}function body_36(chk,ctx){return chk.write("reminders[ttime][]");}function body_37(chk,ctx){return chk.write("");}function body_38(chk,ctx){return chk.write("\"").helper("i18n",ctx,{},{"type":"labels","name":"delete"}).write("\"");}function body_39(chk,ctx){return chk.write("\"").helper("i18n",ctx,{},{"type":"labels","name":"add"}).write("\"");}return body_0;})();(function(){dust.register("event_delete_dialog",body_0);function body_0(chk,ctx){return chk.write("
          ").partial("form_open",ctx,null).write("

          ").helper("i18n",ctx,{},{"type":"messages","name":"info_confirmeventdelete"}).write("

          ").reference(ctx.get("title"),ctx,"h").write("

          ").exists(ctx.get("rrule"),ctx,{"block":body_1},null).partial("form_close",ctx,null).write("
          ");}function body_1(chk,ctx){return chk.write("

          ").helper("i18n",ctx,{},{"type":"messages","name":"info_repetitivedeleteall"}).write("

          ");}return body_0;})();(function(){dust.register("calendar_list_entry",body_0);function body_0(chk,ctx){return chk.write("
        • ").exists(ctx.get("shared"),ctx,{"else":body_4,"block":body_6},null).write("").reference(ctx.get("displayname"),ctx,"h").write("
        • ");}function body_1(chk,ctx){return chk.write(" default_calendar");}function body_2(chk,ctx){return chk.reference(ctx.get("default_calendar_color"),ctx,"h");}function body_3(chk,ctx){return chk.reference(ctx.get("color"),ctx,"h");}function body_4(chk,ctx){return chk.exists(ctx.get("share_with"),ctx,{"block":body_5},null);}function body_5(chk,ctx){return chk.write("");}function body_6(chk,ctx){return chk.helper("eq",ctx,{"block":body_7},{"key":body_8,"value":"0"});}function body_7(chk,ctx){return chk.write("");}function body_8(chk,ctx){return chk.reference(ctx.get("write_access"),ctx,"h");}function body_9(chk,ctx){return chk.write("title=\"").helper("i18n",ctx,{},{"type":"messages","name":"info_sharedby","user":body_10}).write("\"");}function body_10(chk,ctx){return chk.reference(ctx.get("user_from"),ctx,"h");}return body_0;})();(function(){dust.register("reminder_description",body_0);function body_0(chk,ctx){return chk.exists(ctx.get("is_absolute"),ctx,{"else":body_1,"block":body_12},null);}function body_1(chk,ctx){return chk.reference(ctx.get("qty"),ctx,"h").write(" ").helper("select",ctx,{"block":body_2},{"key":body_7}).write(" ").exists(ctx.get("before"),ctx,{"else":body_8,"block":body_9},null).write(" ").exists(ctx.get("relatedStart"),ctx,{"else":body_10,"block":body_11},null);}function body_2(chk,ctx){return chk.helper("eq",ctx,{"block":body_3},{"value":"min"}).helper("eq",ctx,{"block":body_4},{"value":"hour"}).helper("eq",ctx,{"block":body_5},{"value":"day"}).helper("eq",ctx,{"block":body_6},{"value":"week"});}function body_3(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"minutes"});}function body_4(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"hours"});}function body_5(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"days"});}function body_6(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"weeks"});}function body_7(chk,ctx){return chk.reference(ctx.get("interval"),ctx,"h");}function body_8(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"after"});}function body_9(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"before"});}function body_10(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"end"});}function body_11(chk,ctx){return chk.helper("i18n",ctx,{},{"type":"labels","name":"start"});}function body_12(chk,ctx){return chk.reference(ctx.get("tdate"),ctx,"h").write(" ").reference(ctx.get("ttime"),ctx,"h");}return body_0;})(); \ No newline at end of file diff --git a/sources/web/public/js/translation.js b/sources/web/public/js/translation.js deleted file mode 100644 index e090c3c..0000000 --- a/sources/web/public/js/translation.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Loads localized strings - */ -function load_i18n_strings() { - AgenDAVConf.i18n = {}; - - var i18n_ajax_req = $.ajax({ - async: false, - url: base_app_url + 'strings/load/' + agendav_version, - dataType: 'json', - method: 'GET', - ifModified: false // TODO set to true + cache - }); - - i18n_ajax_req.done(function(data, textStatus, jqXHR) { - AgenDAVConf.i18n = data; - - // Localized names - set_default_datepicker_options(); - }); - - i18n_ajax_req.fail(function(jqXHR, textStatus, errorThrown) { - show_error('Error loading translation', - 'Please, contact your system administrator'); - }); -} - -/** - * Function that translates a given label/message - */ -function t(mtype, s, params) { - var ret = '[' + mtype + ':' + s + ']'; - - if (typeof(AgenDAVConf.i18n)!= 'undefined' && (mtype == 'messages' - || mtype == 'labels')) { - if (mtype == 'labels' && AgenDAVConf.i18n.labels[s]) { - ret = AgenDAVConf.i18n.labels[s]; - } else if (mtype == 'messages' && AgenDAVConf.i18n.messages[s]) { - ret = AgenDAVConf.i18n.messages[s]; - } - } - - for (var i in params) { - ret = ret.replace(i, params[i]); - } - - return ret; -} - -/** - * Returns an array of labels using the parameter 'arr' as the index for - * the desired labels - */ -function labels_as_array(arr) { - if (!$.isArray(arr)) { - return []; - } - - var result = []; - var total_arr = arr.length - - for (var i=0; imarker[$name] = microtime(); - } - - // -------------------------------------------------------------------- - - /** - * Calculates the time difference between two marked points. - * - * If the first parameter is empty this function instead returns the - * {elapsed_time} pseudo-variable. This permits the full system - * execution time to be shown in a template. The output class will - * swap the real value for this variable. - * - * @access public - * @param string a particular marked point - * @param string a particular marked point - * @param integer the number of decimal places - * @return mixed - */ - function elapsed_time($point1 = '', $point2 = '', $decimals = 4) - { - if ($point1 == '') - { - return '{elapsed_time}'; - } - - if ( ! isset($this->marker[$point1])) - { - return ''; - } - - if ( ! isset($this->marker[$point2])) - { - $this->marker[$point2] = microtime(); - } - - list($sm, $ss) = explode(' ', $this->marker[$point1]); - list($em, $es) = explode(' ', $this->marker[$point2]); - - return number_format(($em + $es) - ($sm + $ss), $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Memory Usage - * - * This function returns the {memory_usage} pseudo-variable. - * This permits it to be put it anywhere in a template - * without the memory being calculated until the end. - * The output class will swap the real value for this variable. - * - * @access public - * @return string - */ - function memory_usage() - { - return '{memory_usage}'; - } - -} - -// END CI_Benchmark class - -/* End of file Benchmark.php */ -/* Location: ./system/core/Benchmark.php */ \ No newline at end of file diff --git a/sources/web/system/core/CodeIgniter.php b/sources/web/system/core/CodeIgniter.php deleted file mode 100755 index cd33333..0000000 --- a/sources/web/system/core/CodeIgniter.php +++ /dev/null @@ -1,402 +0,0 @@ - $assign_to_config['subclass_prefix'])); - } - -/* - * ------------------------------------------------------ - * Set a liberal script execution time limit - * ------------------------------------------------------ - */ - if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0) - { - @set_time_limit(300); - } - -/* - * ------------------------------------------------------ - * Start the timer... tick tock tick tock... - * ------------------------------------------------------ - */ - $BM =& load_class('Benchmark', 'core'); - $BM->mark('total_execution_time_start'); - $BM->mark('loading_time:_base_classes_start'); - -/* - * ------------------------------------------------------ - * Instantiate the hooks class - * ------------------------------------------------------ - */ - $EXT =& load_class('Hooks', 'core'); - -/* - * ------------------------------------------------------ - * Is there a "pre_system" hook? - * ------------------------------------------------------ - */ - $EXT->_call_hook('pre_system'); - -/* - * ------------------------------------------------------ - * Instantiate the config class - * ------------------------------------------------------ - */ - $CFG =& load_class('Config', 'core'); - - // Do we have any manually set config items in the index.php file? - if (isset($assign_to_config)) - { - $CFG->_assign_to_config($assign_to_config); - } - -/* - * ------------------------------------------------------ - * Instantiate the UTF-8 class - * ------------------------------------------------------ - * - * Note: Order here is rather important as the UTF-8 - * class needs to be used very early on, but it cannot - * properly determine if UTf-8 can be supported until - * after the Config class is instantiated. - * - */ - - $UNI =& load_class('Utf8', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the URI class - * ------------------------------------------------------ - */ - $URI =& load_class('URI', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the routing class and set the routing - * ------------------------------------------------------ - */ - $RTR =& load_class('Router', 'core'); - $RTR->_set_routing(); - - // Set any routing overrides that may exist in the main index file - if (isset($routing)) - { - $RTR->_set_overrides($routing); - } - -/* - * ------------------------------------------------------ - * Instantiate the output class - * ------------------------------------------------------ - */ - $OUT =& load_class('Output', 'core'); - -/* - * ------------------------------------------------------ - * Is there a valid cache file? If so, we're done... - * ------------------------------------------------------ - */ - if ($EXT->_call_hook('cache_override') === FALSE) - { - if ($OUT->_display_cache($CFG, $URI) == TRUE) - { - exit; - } - } - -/* - * ----------------------------------------------------- - * Load the security class for xss and csrf support - * ----------------------------------------------------- - */ - $SEC =& load_class('Security', 'core'); - -/* - * ------------------------------------------------------ - * Load the Input class and sanitize globals - * ------------------------------------------------------ - */ - $IN =& load_class('Input', 'core'); - -/* - * ------------------------------------------------------ - * Load the Language class - * ------------------------------------------------------ - */ - $LANG =& load_class('Lang', 'core'); - -/* - * ------------------------------------------------------ - * Load the app controller and local controller - * ------------------------------------------------------ - * - */ - // Load the base controller class - require BASEPATH.'core/Controller.php'; - - function &get_instance() - { - return CI_Controller::get_instance(); - } - - - if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) - { - require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; - } - - // Load the local application controller - // Note: The Router class automatically validates the controller path using the router->_validate_request(). - // If this include fails it means that the default controller in the Routes.php file is not resolving to something valid. - if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php')) - { - show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.'); - } - - include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'); - - // Set a mark point for benchmarking - $BM->mark('loading_time:_base_classes_end'); - -/* - * ------------------------------------------------------ - * Security check - * ------------------------------------------------------ - * - * None of the functions in the app controller or the - * loader class can be called via the URI, nor can - * controller functions that begin with an underscore - */ - $class = $RTR->fetch_class(); - $method = $RTR->fetch_method(); - - if ( ! class_exists($class) - OR strncmp($method, '_', 1) == 0 - OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller'))) - ) - { - if ( ! empty($RTR->routes['404_override'])) - { - $x = explode('/', $RTR->routes['404_override']); - $class = $x[0]; - $method = (isset($x[1]) ? $x[1] : 'index'); - if ( ! class_exists($class)) - { - if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) - { - show_404("{$class}/{$method}"); - } - - include_once(APPPATH.'controllers/'.$class.'.php'); - } - } - else - { - show_404("{$class}/{$method}"); - } - } - -/* - * ------------------------------------------------------ - * Is there a "pre_controller" hook? - * ------------------------------------------------------ - */ - $EXT->_call_hook('pre_controller'); - -/* - * ------------------------------------------------------ - * Instantiate the requested controller - * ------------------------------------------------------ - */ - // Mark a start point so we can benchmark the controller - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); - - $CI = new $class(); - -/* - * ------------------------------------------------------ - * Is there a "post_controller_constructor" hook? - * ------------------------------------------------------ - */ - $EXT->_call_hook('post_controller_constructor'); - -/* - * ------------------------------------------------------ - * Call the requested method - * ------------------------------------------------------ - */ - // Is there a "remap" function? If so, we call it instead - if (method_exists($CI, '_remap')) - { - $CI->_remap($method, array_slice($URI->rsegments, 2)); - } - else - { - // is_callable() returns TRUE on some versions of PHP 5 for private and protected - // methods, so we'll use this workaround for consistent behavior - if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI)))) - { - // Check and see if we are using a 404 override and use it. - if ( ! empty($RTR->routes['404_override'])) - { - $x = explode('/', $RTR->routes['404_override']); - $class = $x[0]; - $method = (isset($x[1]) ? $x[1] : 'index'); - if ( ! class_exists($class)) - { - if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) - { - show_404("{$class}/{$method}"); - } - - include_once(APPPATH.'controllers/'.$class.'.php'); - unset($CI); - $CI = new $class(); - } - } - else - { - show_404("{$class}/{$method}"); - } - } - - // Call the requested method. - // Any URI segments present (besides the class/function) will be passed to the method for convenience - call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2)); - } - - - // Mark a benchmark end point - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); - -/* - * ------------------------------------------------------ - * Is there a "post_controller" hook? - * ------------------------------------------------------ - */ - $EXT->_call_hook('post_controller'); - -/* - * ------------------------------------------------------ - * Send the final rendered output to the browser - * ------------------------------------------------------ - */ - if ($EXT->_call_hook('display_override') === FALSE) - { - $OUT->_display(); - } - -/* - * ------------------------------------------------------ - * Is there a "post_system" hook? - * ------------------------------------------------------ - */ - $EXT->_call_hook('post_system'); - -/* - * ------------------------------------------------------ - * Close the DB connection if one exists - * ------------------------------------------------------ - */ - if (class_exists('CI_DB') AND isset($CI->db)) - { - $CI->db->close(); - } - - -/* End of file CodeIgniter.php */ -/* Location: ./system/core/CodeIgniter.php */ \ No newline at end of file diff --git a/sources/web/system/core/Common.php b/sources/web/system/core/Common.php deleted file mode 100644 index d793754..0000000 --- a/sources/web/system/core/Common.php +++ /dev/null @@ -1,564 +0,0 @@ - 5 -* we'll set a static variable. -* -* @access public -* @param string -* @return bool TRUE if the current version is $version or higher -*/ -if ( ! function_exists('is_php')) -{ - function is_php($version = '5.0.0') - { - static $_is_php; - $version = (string)$version; - - if ( ! isset($_is_php[$version])) - { - $_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE; - } - - return $_is_php[$version]; - } -} - -// ------------------------------------------------------------------------ - -/** - * Tests for file writability - * - * is_writable() returns TRUE on Windows servers when you really can't write to - * the file, based on the read-only attribute. is_writable() is also unreliable - * on Unix servers if safe_mode is on. - * - * @access private - * @return void - */ -if ( ! function_exists('is_really_writable')) -{ - function is_really_writable($file) - { - // If we're on a Unix server with safe_mode off we call is_writable - if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) - { - return is_writable($file); - } - - // For windows servers and safe_mode "on" installations we'll actually - // write a file then read it. Bah... - if (is_dir($file)) - { - $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); - - if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) - { - return FALSE; - } - - fclose($fp); - @chmod($file, DIR_WRITE_MODE); - @unlink($file); - return TRUE; - } - elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) - { - return FALSE; - } - - fclose($fp); - return TRUE; - } -} - -// ------------------------------------------------------------------------ - -/** -* Class registry -* -* This function acts as a singleton. If the requested class does not -* exist it is instantiated and set to a static variable. If it has -* previously been instantiated the variable is returned. -* -* @access public -* @param string the class name being requested -* @param string the directory where the class should be found -* @param string the class name prefix -* @return object -*/ -if ( ! function_exists('load_class')) -{ - function &load_class($class, $directory = 'libraries', $prefix = 'CI_') - { - static $_classes = array(); - - // Does the class exist? If so, we're done... - if (isset($_classes[$class])) - { - return $_classes[$class]; - } - - $name = FALSE; - - // Look for the class first in the local application/libraries folder - // then in the native system/libraries folder - foreach (array(APPPATH, BASEPATH) as $path) - { - if (file_exists($path.$directory.'/'.$class.'.php')) - { - $name = $prefix.$class; - - if (class_exists($name) === FALSE) - { - require($path.$directory.'/'.$class.'.php'); - } - - break; - } - } - - // Is the request a class extension? If so we load it too - if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) - { - $name = config_item('subclass_prefix').$class; - - if (class_exists($name) === FALSE) - { - require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); - } - } - - // Did we find the class? - if ($name === FALSE) - { - // Note: We use exit() rather then show_error() in order to avoid a - // self-referencing loop with the Excptions class - exit('Unable to locate the specified class: '.$class.'.php'); - } - - // Keep track of what we just loaded - is_loaded($class); - - $_classes[$class] = new $name(); - return $_classes[$class]; - } -} - -// -------------------------------------------------------------------- - -/** -* Keeps track of which libraries have been loaded. This function is -* called by the load_class() function above -* -* @access public -* @return array -*/ -if ( ! function_exists('is_loaded')) -{ - function is_loaded($class = '') - { - static $_is_loaded = array(); - - if ($class != '') - { - $_is_loaded[strtolower($class)] = $class; - } - - return $_is_loaded; - } -} - -// ------------------------------------------------------------------------ - -/** -* Loads the main config.php file -* -* This function lets us grab the config file even if the Config class -* hasn't been instantiated yet -* -* @access private -* @return array -*/ -if ( ! function_exists('get_config')) -{ - function &get_config($replace = array()) - { - static $_config; - - if (isset($_config)) - { - return $_config[0]; - } - - // Is the config file in the environment folder? - if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) - { - $file_path = APPPATH.'config/config.php'; - } - - // Fetch the config file - if ( ! file_exists($file_path)) - { - exit('The configuration file does not exist.'); - } - - require($file_path); - - // Does the $config array exist in the file? - if ( ! isset($config) OR ! is_array($config)) - { - exit('Your config file does not appear to be formatted correctly.'); - } - - // Are any values being dynamically replaced? - if (count($replace) > 0) - { - foreach ($replace as $key => $val) - { - if (isset($config[$key])) - { - $config[$key] = $val; - } - } - } - - return $_config[0] =& $config; - } -} - -// ------------------------------------------------------------------------ - -/** -* Returns the specified config item -* -* @access public -* @return mixed -*/ -if ( ! function_exists('config_item')) -{ - function config_item($item) - { - static $_config_item = array(); - - if ( ! isset($_config_item[$item])) - { - $config =& get_config(); - - if ( ! isset($config[$item])) - { - return FALSE; - } - $_config_item[$item] = $config[$item]; - } - - return $_config_item[$item]; - } -} - -// ------------------------------------------------------------------------ - -/** -* Error Handler -* -* This function lets us invoke the exception class and -* display errors using the standard error template located -* in application/errors/errors.php -* This function will send the error page directly to the -* browser and exit. -* -* @access public -* @return void -*/ -if ( ! function_exists('show_error')) -{ - function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') - { - $_error =& load_class('Exceptions', 'core'); - echo $_error->show_error($heading, $message, 'error_general', $status_code); - exit; - } -} - -// ------------------------------------------------------------------------ - -/** -* 404 Page Handler -* -* This function is similar to the show_error() function above -* However, instead of the standard error template it displays -* 404 errors. -* -* @access public -* @return void -*/ -if ( ! function_exists('show_404')) -{ - function show_404($page = '', $log_error = TRUE) - { - $_error =& load_class('Exceptions', 'core'); - $_error->show_404($page, $log_error); - exit; - } -} - -// ------------------------------------------------------------------------ - -/** -* Error Logging Interface -* -* We use this as a simple mechanism to access the logging -* class and send messages to be logged. -* -* @access public -* @return void -*/ -if ( ! function_exists('log_message')) -{ - function log_message($level = 'error', $message, $php_error = FALSE) - { - static $_log; - - if (config_item('log_threshold') == 0) - { - return; - } - - $_log =& load_class('Log'); - $_log->write_log($level, $message, $php_error); - } -} - -// ------------------------------------------------------------------------ - -/** - * Set HTTP Status Header - * - * @access public - * @param int the status code - * @param string - * @return void - */ -if ( ! function_exists('set_status_header')) -{ - function set_status_header($code = 200, $text = '') - { - $stati = array( - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - - 400 => 'Bad Request', - 401 => 'Unauthorized', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported' - ); - - if ($code == '' OR ! is_numeric($code)) - { - show_error('Status codes must be numeric', 500); - } - - if (isset($stati[$code]) AND $text == '') - { - $text = $stati[$code]; - } - - if ($text == '') - { - show_error('No status text available. Please check your status code number or supply your own message text.', 500); - } - - $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE; - - if (substr(php_sapi_name(), 0, 3) == 'cgi') - { - header("Status: {$code} {$text}", TRUE); - } - elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0') - { - header($server_protocol." {$code} {$text}", TRUE, $code); - } - else - { - header("HTTP/1.1 {$code} {$text}", TRUE, $code); - } - } -} - -// -------------------------------------------------------------------- - -/** -* Exception Handler -* -* This is the custom exception handler that is declaired at the top -* of Codeigniter.php. The main reason we use this is to permit -* PHP errors to be logged in our own log files since the user may -* not have access to server logs. Since this function -* effectively intercepts PHP errors, however, we also need -* to display errors based on the current error_reporting level. -* We do that with the use of a PHP error template. -* -* @access private -* @return void -*/ -if ( ! function_exists('_exception_handler')) -{ - function _exception_handler($severity, $message, $filepath, $line) - { - // We don't bother with "strict" notices since they tend to fill up - // the log file with excess information that isn't normally very helpful. - // For example, if you are running PHP 5 and you use version 4 style - // class functions (without prefixes like "public", "private", etc.) - // you'll get notices telling you that these have been deprecated. - if ($severity == E_STRICT) - { - return; - } - - $_error =& load_class('Exceptions', 'core'); - - // Should we display the error? We'll get the current error_reporting - // level and add its bits with the severity bits to find out. - if (($severity & error_reporting()) == $severity) - { - $_error->show_php_error($severity, $message, $filepath, $line); - } - - // Should we log the error? No? We're done... - if (config_item('log_threshold') == 0) - { - return; - } - - $_error->log_exception($severity, $message, $filepath, $line); - } -} - -// -------------------------------------------------------------------- - -/** - * Remove Invisible Characters - * - * This prevents sandwiching null characters - * between ascii characters, like Java\0script. - * - * @access public - * @param string - * @return string - */ -if ( ! function_exists('remove_invisible_characters')) -{ - function remove_invisible_characters($str, $url_encoded = TRUE) - { - $non_displayables = array(); - - // every control character except newline (dec 10) - // carriage return (dec 13), and horizontal tab (dec 09) - - if ($url_encoded) - { - $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 - } - - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - - do - { - $str = preg_replace($non_displayables, '', $str, -1, $count); - } - while ($count); - - return $str; - } -} - -// ------------------------------------------------------------------------ - -/** -* Returns HTML escaped variable -* -* @access public -* @param mixed -* @return mixed -*/ -if ( ! function_exists('html_escape')) -{ - function html_escape($var) - { - if (is_array($var)) - { - return array_map('html_escape', $var); - } - else - { - return htmlspecialchars($var, ENT_QUOTES, config_item('charset')); - } - } -} - -/* End of file Common.php */ -/* Location: ./system/core/Common.php */ \ No newline at end of file diff --git a/sources/web/system/core/Config.php b/sources/web/system/core/Config.php deleted file mode 100755 index 714c466..0000000 --- a/sources/web/system/core/Config.php +++ /dev/null @@ -1,379 +0,0 @@ -config =& get_config(); - log_message('debug', "Config Class Initialized"); - - // Set the base_url automatically if none was provided - if ($this->config['base_url'] == '') - { - if (isset($_SERVER['HTTP_HOST'])) - { - $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http'; - $base_url .= '://'. $_SERVER['HTTP_HOST']; - $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); - } - - else - { - $base_url = 'http://localhost/'; - } - - $this->set_item('base_url', $base_url); - } - } - - // -------------------------------------------------------------------- - - /** - * Load Config File - * - * @access public - * @param string the config file name - * @param boolean if configuration values should be loaded into their own section - * @param boolean true if errors should just return false, false if an error message should be displayed - * @return boolean if the file was loaded correctly - */ - function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) - { - $file = ($file == '') ? 'config' : str_replace('.php', '', $file); - $found = FALSE; - $loaded = FALSE; - - foreach ($this->_config_paths as $path) - { - $check_locations = defined('ENVIRONMENT') - ? array(ENVIRONMENT.'/'.$file, $file) - : array($file); - - foreach ($check_locations as $location) - { - $file_path = $path.'config/'.$location.'.php'; - - if (in_array($file_path, $this->is_loaded, TRUE)) - { - $loaded = TRUE; - continue 2; - } - - if (file_exists($file_path)) - { - $found = TRUE; - break; - } - } - - if ($found === FALSE) - { - continue; - } - - include($file_path); - - if ( ! isset($config) OR ! is_array($config)) - { - if ($fail_gracefully === TRUE) - { - return FALSE; - } - show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); - } - - if ($use_sections === TRUE) - { - if (isset($this->config[$file])) - { - $this->config[$file] = array_merge($this->config[$file], $config); - } - else - { - $this->config[$file] = $config; - } - } - else - { - $this->config = array_merge($this->config, $config); - } - - $this->is_loaded[] = $file_path; - unset($config); - - $loaded = TRUE; - log_message('debug', 'Config file loaded: '.$file_path); - break; - } - - if ($loaded === FALSE) - { - if ($fail_gracefully === TRUE) - { - return FALSE; - } - show_error('The configuration file '.$file.'.php'.' does not exist.'); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item - * - * - * @access public - * @param string the config item name - * @param string the index name - * @param bool - * @return string - */ - function item($item, $index = '') - { - if ($index == '') - { - if ( ! isset($this->config[$item])) - { - return FALSE; - } - - $pref = $this->config[$item]; - } - else - { - if ( ! isset($this->config[$index])) - { - return FALSE; - } - - if ( ! isset($this->config[$index][$item])) - { - return FALSE; - } - - $pref = $this->config[$index][$item]; - } - - return $pref; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item - adds slash after item (if item is not empty) - * - * @access public - * @param string the config item name - * @param bool - * @return string - */ - function slash_item($item) - { - if ( ! isset($this->config[$item])) - { - return FALSE; - } - if( trim($this->config[$item]) == '') - { - return ''; - } - - return rtrim($this->config[$item], '/').'/'; - } - - // -------------------------------------------------------------------- - - /** - * Site URL - * Returns base_url . index_page [. uri_string] - * - * @access public - * @param string the URI string - * @return string - */ - function site_url($uri = '') - { - if ($uri == '') - { - return $this->slash_item('base_url').$this->item('index_page'); - } - - if ($this->item('enable_query_strings') == FALSE) - { - $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix'); - return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix; - } - else - { - return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri); - } - } - - // ------------------------------------------------------------- - - /** - * Base URL - * Returns base_url [. uri_string] - * - * @access public - * @param string $uri - * @return string - */ - function base_url($uri = '') - { - return $this->slash_item('base_url').ltrim($this->_uri_string($uri),'/'); - } - - // ------------------------------------------------------------- - - /** - * Build URI string for use in Config::site_url() and Config::base_url() - * - * @access protected - * @param $uri - * @return string - */ - protected function _uri_string($uri) - { - if ($this->item('enable_query_strings') == FALSE) - { - if (is_array($uri)) - { - $uri = implode('/', $uri); - } - $uri = trim($uri, '/'); - } - else - { - if (is_array($uri)) - { - $i = 0; - $str = ''; - foreach ($uri as $key => $val) - { - $prefix = ($i == 0) ? '' : '&'; - $str .= $prefix.$key.'='.$val; - $i++; - } - $uri = $str; - } - } - return $uri; - } - - // -------------------------------------------------------------------- - - /** - * System URL - * - * @access public - * @return string - */ - function system_url() - { - $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH)); - return $this->slash_item('base_url').end($x).'/'; - } - - // -------------------------------------------------------------------- - - /** - * Set a config file item - * - * @access public - * @param string the config item key - * @param string the config item value - * @return void - */ - function set_item($item, $value) - { - $this->config[$item] = $value; - } - - // -------------------------------------------------------------------- - - /** - * Assign to Config - * - * This function is called by the front controller (CodeIgniter.php) - * after the Config class is instantiated. It permits config items - * to be assigned or overriden by variables contained in the index.php file - * - * @access private - * @param array - * @return void - */ - function _assign_to_config($items = array()) - { - if (is_array($items)) - { - foreach ($items as $key => $val) - { - $this->set_item($key, $val); - } - } - } -} - -// END CI_Config class - -/* End of file Config.php */ -/* Location: ./system/core/Config.php */ diff --git a/sources/web/system/core/Controller.php b/sources/web/system/core/Controller.php deleted file mode 100644 index fddb81e..0000000 --- a/sources/web/system/core/Controller.php +++ /dev/null @@ -1,64 +0,0 @@ - $class) - { - $this->$var =& load_class($class); - } - - $this->load =& load_class('Loader', 'core'); - - $this->load->initialize(); - - log_message('debug', "Controller Class Initialized"); - } - - public static function &get_instance() - { - return self::$instance; - } -} -// END Controller class - -/* End of file Controller.php */ -/* Location: ./system/core/Controller.php */ \ No newline at end of file diff --git a/sources/web/system/core/Exceptions.php b/sources/web/system/core/Exceptions.php deleted file mode 100755 index 869739a..0000000 --- a/sources/web/system/core/Exceptions.php +++ /dev/null @@ -1,193 +0,0 @@ - 'Error', - E_WARNING => 'Warning', - E_PARSE => 'Parsing Error', - E_NOTICE => 'Notice', - E_CORE_ERROR => 'Core Error', - E_CORE_WARNING => 'Core Warning', - E_COMPILE_ERROR => 'Compile Error', - E_COMPILE_WARNING => 'Compile Warning', - E_USER_ERROR => 'User Error', - E_USER_WARNING => 'User Warning', - E_USER_NOTICE => 'User Notice', - E_STRICT => 'Runtime Notice' - ); - - - /** - * Constructor - */ - public function __construct() - { - $this->ob_level = ob_get_level(); - // Note: Do not log messages from this constructor. - } - - // -------------------------------------------------------------------- - - /** - * Exception Logger - * - * This function logs PHP generated error messages - * - * @access private - * @param string the error severity - * @param string the error string - * @param string the error filepath - * @param string the error line number - * @return string - */ - function log_exception($severity, $message, $filepath, $line) - { - $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; - - log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * 404 Page Not Found Handler - * - * @access private - * @param string the page - * @param bool log error yes/no - * @return string - */ - function show_404($page = '', $log_error = TRUE) - { - $heading = "404 Page Not Found"; - $message = "The page you requested was not found."; - - // By default we log this, but allow a dev to skip it - if ($log_error) - { - log_message('error', '404 Page Not Found --> '.$page); - } - - echo $this->show_error($heading, $message, 'error_404', 404); - exit; - } - - // -------------------------------------------------------------------- - - /** - * General Error Page - * - * This function takes an error message as input - * (either as a string or an array) and displays - * it using the specified template. - * - * @access private - * @param string the heading - * @param string the message - * @param string the template name - * @param int the status code - * @return string - */ - function show_error($heading, $message, $template = 'error_general', $status_code = 500) - { - set_status_header($status_code); - - $message = '

          '.implode('

          ', ( ! is_array($message)) ? array($message) : $message).'

          '; - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include(APPPATH.'errors/'.$template.'.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - return $buffer; - } - - // -------------------------------------------------------------------- - - /** - * Native PHP error handler - * - * @access private - * @param string the error severity - * @param string the error string - * @param string the error filepath - * @param string the error line number - * @return string - */ - function show_php_error($severity, $message, $filepath, $line) - { - $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; - - $filepath = str_replace("\\", "/", $filepath); - - // For safety reasons we do not show the full file path - if (FALSE !== strpos($filepath, '/')) - { - $x = explode('/', $filepath); - $filepath = $x[count($x)-2].'/'.end($x); - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include(APPPATH.'errors/error_php.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - - -} -// END Exceptions Class - -/* End of file Exceptions.php */ -/* Location: ./system/core/Exceptions.php */ \ No newline at end of file diff --git a/sources/web/system/core/Hooks.php b/sources/web/system/core/Hooks.php deleted file mode 100755 index 33f1c03..0000000 --- a/sources/web/system/core/Hooks.php +++ /dev/null @@ -1,248 +0,0 @@ -_initialize(); - log_message('debug', "Hooks Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Initialize the Hooks Preferences - * - * @access private - * @return void - */ - function _initialize() - { - $CFG =& load_class('Config', 'core'); - - // If hooks are not enabled in the config file - // there is nothing else to do - - if ($CFG->item('enable_hooks') == FALSE) - { - return; - } - - // Grab the "hooks" definition file. - // If there are no hooks, we're done. - - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); - } - elseif (is_file(APPPATH.'config/hooks.php')) - { - include(APPPATH.'config/hooks.php'); - } - - - if ( ! isset($hook) OR ! is_array($hook)) - { - return; - } - - $this->hooks =& $hook; - $this->enabled = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Call Hook - * - * Calls a particular hook - * - * @access private - * @param string the hook name - * @return mixed - */ - function _call_hook($which = '') - { - if ( ! $this->enabled OR ! isset($this->hooks[$which])) - { - return FALSE; - } - - if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0])) - { - foreach ($this->hooks[$which] as $val) - { - $this->_run_hook($val); - } - } - else - { - $this->_run_hook($this->hooks[$which]); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Run Hook - * - * Runs a particular hook - * - * @access private - * @param array the hook details - * @return bool - */ - function _run_hook($data) - { - if ( ! is_array($data)) - { - return FALSE; - } - - // ----------------------------------- - // Safety - Prevents run-away loops - // ----------------------------------- - - // If the script being called happens to have the same - // hook call within it a loop can happen - - if ($this->in_progress == TRUE) - { - return; - } - - // ----------------------------------- - // Set file path - // ----------------------------------- - - if ( ! isset($data['filepath']) OR ! isset($data['filename'])) - { - return FALSE; - } - - $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; - - if ( ! file_exists($filepath)) - { - return FALSE; - } - - // ----------------------------------- - // Set class/function name - // ----------------------------------- - - $class = FALSE; - $function = FALSE; - $params = ''; - - if (isset($data['class']) AND $data['class'] != '') - { - $class = $data['class']; - } - - if (isset($data['function'])) - { - $function = $data['function']; - } - - if (isset($data['params'])) - { - $params = $data['params']; - } - - if ($class === FALSE AND $function === FALSE) - { - return FALSE; - } - - // ----------------------------------- - // Set the in_progress flag - // ----------------------------------- - - $this->in_progress = TRUE; - - // ----------------------------------- - // Call the requested class and/or function - // ----------------------------------- - - if ($class !== FALSE) - { - if ( ! class_exists($class)) - { - require($filepath); - } - - $HOOK = new $class; - $HOOK->$function($params); - } - else - { - if ( ! function_exists($function)) - { - require($filepath); - } - - $function($params); - } - - $this->in_progress = FALSE; - return TRUE; - } - -} - -// END CI_Hooks class - -/* End of file Hooks.php */ -/* Location: ./system/core/Hooks.php */ \ No newline at end of file diff --git a/sources/web/system/core/Input.php b/sources/web/system/core/Input.php deleted file mode 100755 index 3559d86..0000000 --- a/sources/web/system/core/Input.php +++ /dev/null @@ -1,850 +0,0 @@ -_allow_get_array = (config_item('allow_get_array') === TRUE); - $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - - global $SEC; - $this->security =& $SEC; - - // Do we need the UTF-8 class? - if (UTF8_ENABLED === TRUE) - { - global $UNI; - $this->uni =& $UNI; - } - - // Sanitize global arrays - $this->_sanitize_globals(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch from array - * - * This is a helper function to retrieve values from global arrays - * - * @access private - * @param array - * @param string - * @param bool - * @return string - */ - function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) - { - if ( ! isset($array[$index])) - { - return FALSE; - } - - if ($xss_clean === TRUE) - { - return $this->security->xss_clean($array[$index]); - } - - return $array[$index]; - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the GET array - * - * @access public - * @param string - * @param bool - * @return string - */ - function get($index = NULL, $xss_clean = FALSE) - { - // Check if a field has been provided - if ($index === NULL AND ! empty($_GET)) - { - $get = array(); - - // loop through the full _GET array - foreach (array_keys($_GET) as $key) - { - $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean); - } - return $get; - } - - return $this->_fetch_from_array($_GET, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the POST array - * - * @access public - * @param string - * @param bool - * @return string - */ - function post($index = NULL, $xss_clean = FALSE) - { - // Check if a field has been provided - if ($index === NULL AND ! empty($_POST)) - { - $post = array(); - - // Loop through the full _POST array and return it - foreach (array_keys($_POST) as $key) - { - $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean); - } - return $post; - } - - return $this->_fetch_from_array($_POST, $index, $xss_clean); - } - - - // -------------------------------------------------------------------- - - /** - * Fetch an item from either the GET array or the POST - * - * @access public - * @param string The index key - * @param bool XSS cleaning - * @return string - */ - function get_post($index = '', $xss_clean = FALSE) - { - if ( ! isset($_POST[$index]) ) - { - return $this->get($index, $xss_clean); - } - else - { - return $this->post($index, $xss_clean); - } - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the COOKIE array - * - * @access public - * @param string - * @param bool - * @return string - */ - function cookie($index = '', $xss_clean = FALSE) - { - return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); - } - - // ------------------------------------------------------------------------ - - /** - * Set cookie - * - * Accepts six parameter, or you can submit an associative - * array in the first parameter containing all the values. - * - * @access public - * @param mixed - * @param string the value of the cookie - * @param string the number of seconds until expiration - * @param string the cookie domain. Usually: .yourdomain.com - * @param string the cookie path - * @param string the cookie prefix - * @param bool true makes the cookie secure - * @return void - */ - function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE) - { - if (is_array($name)) - { - // always leave 'name' in last place, as the loop will break otherwise, due to $$item - foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item) - { - if (isset($name[$item])) - { - $$item = $name[$item]; - } - } - } - - if ($prefix == '' AND config_item('cookie_prefix') != '') - { - $prefix = config_item('cookie_prefix'); - } - if ($domain == '' AND config_item('cookie_domain') != '') - { - $domain = config_item('cookie_domain'); - } - if ($path == '/' AND config_item('cookie_path') != '/') - { - $path = config_item('cookie_path'); - } - if ($secure == FALSE AND config_item('cookie_secure') != FALSE) - { - $secure = config_item('cookie_secure'); - } - - if ( ! is_numeric($expire)) - { - $expire = time() - 86500; - } - else - { - $expire = ($expire > 0) ? time() + $expire : 0; - } - - setcookie($prefix.$name, $value, $expire, $path, $domain, $secure); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the SERVER array - * - * @access public - * @param string - * @param bool - * @return string - */ - function server($index = '', $xss_clean = FALSE) - { - return $this->_fetch_from_array($_SERVER, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the IP Address - * - * @access public - * @return string - */ - function ip_address() - { - if ($this->ip_address !== FALSE) - { - return $this->ip_address; - } - - if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR')) - { - $proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY); - $proxies = is_array($proxies) ? $proxies : array($proxies); - - $this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; - } - elseif ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP')) - { - $this->ip_address = $_SERVER['HTTP_CLIENT_IP']; - } - elseif ($this->server('REMOTE_ADDR')) - { - $this->ip_address = $_SERVER['REMOTE_ADDR']; - } - elseif ($this->server('HTTP_CLIENT_IP')) - { - $this->ip_address = $_SERVER['HTTP_CLIENT_IP']; - } - elseif ($this->server('HTTP_X_FORWARDED_FOR')) - { - $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR']; - } - - if ($this->ip_address === FALSE) - { - $this->ip_address = '0.0.0.0'; - return $this->ip_address; - } - - if (strpos($this->ip_address, ',') !== FALSE) - { - $x = explode(',', $this->ip_address); - $this->ip_address = trim(end($x)); - } - - if ( ! $this->valid_ip($this->ip_address)) - { - $this->ip_address = '0.0.0.0'; - } - - return $this->ip_address; - } - - // -------------------------------------------------------------------- - - /** - * Validate IP Address - * - * @access public - * @param string - * @param string ipv4 or ipv6 - * @return bool - */ - public function valid_ip($ip, $which = '') - { - $which = strtolower($which); - - // First check if filter_var is available - if (is_callable('filter_var')) - { - switch ($which) { - case 'ipv4': - $flag = FILTER_FLAG_IPV4; - break; - case 'ipv6': - $flag = FILTER_FLAG_IPV6; - break; - default: - $flag = ''; - break; - } - - return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flag); - } - - if ($which !== 'ipv6' && $which !== 'ipv4') - { - if (strpos($ip, ':') !== FALSE) - { - $which = 'ipv6'; - } - elseif (strpos($ip, '.') !== FALSE) - { - $which = 'ipv4'; - } - else - { - return FALSE; - } - } - - $func = '_valid_'.$which; - return $this->$func($ip); - } - - // -------------------------------------------------------------------- - - /** - * Validate IPv4 Address - * - * Updated version suggested by Geert De Deckere - * - * @access protected - * @param string - * @return bool - */ - protected function _valid_ipv4($ip) - { - $ip_segments = explode('.', $ip); - - // Always 4 segments needed - if (count($ip_segments) !== 4) - { - return FALSE; - } - // IP can not start with 0 - if ($ip_segments[0][0] == '0') - { - return FALSE; - } - - // Check each segment - foreach ($ip_segments as $segment) - { - // IP segments must be digits and can not be - // longer than 3 digits or greater then 255 - if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Validate IPv6 Address - * - * @access protected - * @param string - * @return bool - */ - protected function _valid_ipv6($str) - { - // 8 groups, separated by : - // 0-ffff per group - // one set of consecutive 0 groups can be collapsed to :: - - $groups = 8; - $collapsed = FALSE; - - $chunks = array_filter( - preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE) - ); - - // Rule out easy nonsense - if (current($chunks) == ':' OR end($chunks) == ':') - { - return FALSE; - } - - // PHP supports IPv4-mapped IPv6 addresses, so we'll expect those as well - if (strpos(end($chunks), '.') !== FALSE) - { - $ipv4 = array_pop($chunks); - - if ( ! $this->_valid_ipv4($ipv4)) - { - return FALSE; - } - - $groups--; - } - - while ($seg = array_pop($chunks)) - { - if ($seg[0] == ':') - { - if (--$groups == 0) - { - return FALSE; // too many groups - } - - if (strlen($seg) > 2) - { - return FALSE; // long separator - } - - if ($seg == '::') - { - if ($collapsed) - { - return FALSE; // multiple collapsed - } - - $collapsed = TRUE; - } - } - elseif (preg_match("/[^0-9a-f]/i", $seg) OR strlen($seg) > 4) - { - return FALSE; // invalid segment - } - } - - return $collapsed OR $groups == 1; - } - - // -------------------------------------------------------------------- - - /** - * User Agent - * - * @access public - * @return string - */ - function user_agent() - { - if ($this->user_agent !== FALSE) - { - return $this->user_agent; - } - - $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT']; - - return $this->user_agent; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Globals - * - * This function does the following: - * - * Unsets $_GET data (if query strings are not enabled) - * - * Unsets all globals if register_globals is enabled - * - * Standardizes newline characters to \n - * - * @access private - * @return void - */ - function _sanitize_globals() - { - // It would be "wrong" to unset any of these GLOBALS. - $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', - '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA', - 'system_folder', 'application_folder', 'BM', 'EXT', - 'CFG', 'URI', 'RTR', 'OUT', 'IN'); - - // Unset globals for securiy. - // This is effectively the same as register_globals = off - foreach (array($_GET, $_POST, $_COOKIE) as $global) - { - if ( ! is_array($global)) - { - if ( ! in_array($global, $protected)) - { - global $$global; - $$global = NULL; - } - } - else - { - foreach ($global as $key => $val) - { - if ( ! in_array($key, $protected)) - { - global $$key; - $$key = NULL; - } - } - } - } - - // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if ($this->_allow_get_array == FALSE) - { - $_GET = array(); - } - else - { - if (is_array($_GET) AND count($_GET) > 0) - { - foreach ($_GET as $key => $val) - { - $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - } - - // Clean $_POST Data - if (is_array($_POST) AND count($_POST) > 0) - { - foreach ($_POST as $key => $val) - { - $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_COOKIE Data - if (is_array($_COOKIE) AND count($_COOKIE) > 0) - { - // Also get rid of specially treated cookies that might be set by a server - // or silly application, that are of no use to a CI application anyway - // but that when present will trip our 'Disallowed Key Characters' alarm - // http://www.ietf.org/rfc/rfc2109.txt - // note that the key names below are single quoted strings, and are not PHP variables - unset($_COOKIE['$Version']); - unset($_COOKIE['$Path']); - unset($_COOKIE['$Domain']); - - foreach ($_COOKIE as $key => $val) - { - $_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Sanitize PHP_SELF - $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - - - // CSRF Protection check - if ($this->_enable_csrf == TRUE) - { - $this->security->csrf_verify(); - } - - log_message('debug', "Global POST and COOKIE data sanitized"); - } - - // -------------------------------------------------------------------- - - /** - * Clean Input Data - * - * This is a helper function. It escapes data and - * standardizes newline characters to \n - * - * @access private - * @param string - * @return string - */ - function _clean_input_data($str) - { - if (is_array($str)) - { - $new_array = array(); - foreach ($str as $key => $val) - { - $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - return $new_array; - } - - /* We strip slashes if magic quotes is on to keep things consistent - - NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and - it will probably not exist in future versions at all. - */ - if ( ! is_php('5.4') && get_magic_quotes_gpc()) - { - $str = stripslashes($str); - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - $str = $this->uni->clean_string($str); - } - - // Remove control characters - $str = remove_invisible_characters($str); - - // Should we filter the input data? - if ($this->_enable_xss === TRUE) - { - $str = $this->security->xss_clean($str); - } - - // Standardize newlines if needed - if ($this->_standardize_newlines == TRUE) - { - if (strpos($str, "\r") !== FALSE) - { - $str = str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); - } - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Clean Keys - * - * This is a helper function. To prevent malicious users - * from trying to exploit keys we make sure that keys are - * only named with alpha-numeric text and a few other items. - * - * @access private - * @param string - * @return string - */ - function _clean_input_keys($str) - { - if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str)) - { - exit('Disallowed Key Characters.'); - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - $str = $this->uni->clean_string($str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Request Headers - * - * In Apache, you can simply call apache_request_headers(), however for - * people running other webservers the function is undefined. - * - * @param bool XSS cleaning - * - * @return array - */ - public function request_headers($xss_clean = FALSE) - { - // Look at Apache go! - if (function_exists('apache_request_headers')) - { - $headers = apache_request_headers(); - } - else - { - $headers['Content-Type'] = (isset($_SERVER['CONTENT_TYPE'])) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); - - foreach ($_SERVER as $key => $val) - { - if (strncmp($key, 'HTTP_', 5) === 0) - { - $headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); - } - } - } - - // take SOME_HEADER and turn it into Some-Header - foreach ($headers as $key => $val) - { - $key = str_replace('_', ' ', strtolower($key)); - $key = str_replace(' ', '-', ucwords($key)); - - $this->headers[$key] = $val; - } - - return $this->headers; - } - - // -------------------------------------------------------------------- - - /** - * Get Request Header - * - * Returns the value of a single member of the headers class member - * - * @param string array key for $this->headers - * @param boolean XSS Clean or not - * @return mixed FALSE on failure, string on success - */ - public function get_request_header($index, $xss_clean = FALSE) - { - if (empty($this->headers)) - { - $this->request_headers(); - } - - if ( ! isset($this->headers[$index])) - { - return FALSE; - } - - if ($xss_clean === TRUE) - { - return $this->security->xss_clean($this->headers[$index]); - } - - return $this->headers[$index]; - } - - // -------------------------------------------------------------------- - - /** - * Is ajax Request? - * - * Test to see if a request contains the HTTP_X_REQUESTED_WITH header - * - * @return boolean - */ - public function is_ajax_request() - { - return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest'); - } - - // -------------------------------------------------------------------- - - /** - * Is cli Request? - * - * Test to see if a request was made from the command line - * - * @return boolean - */ - public function is_cli_request() - { - return (php_sapi_name() == 'cli') or defined('STDIN'); - } - -} - -/* End of file Input.php */ -/* Location: ./system/core/Input.php */ \ No newline at end of file diff --git a/sources/web/system/core/Lang.php b/sources/web/system/core/Lang.php deleted file mode 100755 index 5ac6718..0000000 --- a/sources/web/system/core/Lang.php +++ /dev/null @@ -1,160 +0,0 @@ -is_loaded, TRUE)) - { - return; - } - - $config =& get_config(); - - if ($idiom == '') - { - $deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language']; - $idiom = ($deft_lang == '') ? 'english' : $deft_lang; - } - - // Determine where the language file is and load it - if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile)) - { - include($alt_path.'language/'.$idiom.'/'.$langfile); - } - else - { - $found = FALSE; - - foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) - { - if (file_exists($package_path.'language/'.$idiom.'/'.$langfile)) - { - include($package_path.'language/'.$idiom.'/'.$langfile); - $found = TRUE; - break; - } - } - - if ($found !== TRUE) - { - show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); - } - } - - - if ( ! isset($lang)) - { - log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); - return; - } - - if ($return == TRUE) - { - return $lang; - } - - $this->is_loaded[] = $langfile; - $this->language = array_merge($this->language, $lang); - unset($lang); - - log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a single line of text from the language array - * - * @access public - * @param string $line the language line - * @return string - */ - function line($line = '') - { - $value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; - - // Because killer robots like unicorns! - if ($value === FALSE) - { - log_message('error', 'Could not find the language line "'.$line.'"'); - } - - return $value; - } - -} -// END Language Class - -/* End of file Lang.php */ -/* Location: ./system/core/Lang.php */ diff --git a/sources/web/system/core/Loader.php b/sources/web/system/core/Loader.php deleted file mode 100644 index 6b7ee0c..0000000 --- a/sources/web/system/core/Loader.php +++ /dev/null @@ -1,1248 +0,0 @@ - 'unit', - 'user_agent' => 'agent'); - - /** - * Constructor - * - * Sets the path to the view files and gets the initial output buffering level - */ - public function __construct() - { - $this->_ci_ob_level = ob_get_level(); - $this->_ci_library_paths = array(APPPATH, BASEPATH); - $this->_ci_helper_paths = array(APPPATH, BASEPATH); - $this->_ci_model_paths = array(APPPATH); - $this->_ci_view_paths = array(APPPATH.'views/' => TRUE); - - log_message('debug', "Loader Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Initialize the Loader - * - * This method is called once in CI_Controller. - * - * @param array - * @return object - */ - public function initialize() - { - $this->_ci_classes = array(); - $this->_ci_loaded_files = array(); - $this->_ci_models = array(); - $this->_base_classes =& is_loaded(); - - $this->_ci_autoloader(); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Is Loaded - * - * A utility function to test if a class is in the self::$_ci_classes array. - * This function returns the object name if the class tested for is loaded, - * and returns FALSE if it isn't. - * - * It is mainly used in the form_helper -> _get_validation_object() - * - * @param string class being checked for - * @return mixed class object name on the CI SuperObject or FALSE - */ - public function is_loaded($class) - { - if (isset($this->_ci_classes[$class])) - { - return $this->_ci_classes[$class]; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Class Loader - * - * This function lets users load and instantiate classes. - * It is designed to be called from a user's app controllers. - * - * @param string the name of the class - * @param mixed the optional parameters - * @param string an optional object name - * @return void - */ - public function library($library = '', $params = NULL, $object_name = NULL) - { - if (is_array($library)) - { - foreach ($library as $class) - { - $this->library($class, $params); - } - - return; - } - - if ($library == '' OR isset($this->_base_classes[$library])) - { - return FALSE; - } - - if ( ! is_null($params) && ! is_array($params)) - { - $params = NULL; - } - - $this->_ci_load_class($library, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Model Loader - * - * This function lets users load and instantiate models. - * - * @param string the name of the class - * @param string name for the model - * @param bool database connection - * @return void - */ - public function model($model, $name = '', $db_conn = FALSE) - { - if (is_array($model)) - { - foreach ($model as $babe) - { - $this->model($babe); - } - return; - } - - if ($model == '') - { - return; - } - - $path = ''; - - // Is the model in a sub-folder? If so, parse out the filename and path. - if (($last_slash = strrpos($model, '/')) !== FALSE) - { - // The path is in front of the last slash - $path = substr($model, 0, $last_slash + 1); - - // And the model name behind it - $model = substr($model, $last_slash + 1); - } - - if ($name == '') - { - $name = $model; - } - - if (in_array($name, $this->_ci_models, TRUE)) - { - return; - } - - $CI =& get_instance(); - if (isset($CI->$name)) - { - show_error('The model name you are loading is the name of a resource that is already being used: '.$name); - } - - $model = strtolower($model); - - foreach ($this->_ci_model_paths as $mod_path) - { - if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) - { - continue; - } - - if ($db_conn !== FALSE AND ! class_exists('CI_DB')) - { - if ($db_conn === TRUE) - { - $db_conn = ''; - } - - $CI->load->database($db_conn, FALSE, TRUE); - } - - if ( ! class_exists('CI_Model')) - { - load_class('Model', 'core'); - } - - require_once($mod_path.'models/'.$path.$model.'.php'); - - $model = ucfirst($model); - - $CI->$name = new $model(); - - $this->_ci_models[] = $name; - return; - } - - // couldn't find the model - show_error('Unable to locate the model you have specified: '.$model); - } - - // -------------------------------------------------------------------- - - /** - * Database Loader - * - * @param string the DB credentials - * @param bool whether to return the DB object - * @param bool whether to enable active record (this allows us to override the config setting) - * @return object - */ - public function database($params = '', $return = FALSE, $active_record = NULL) - { - // Grab the super object - $CI =& get_instance(); - - // Do we even need to load the database class? - if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db)) - { - return FALSE; - } - - require_once(BASEPATH.'database/DB.php'); - - if ($return === TRUE) - { - return DB($params, $active_record); - } - - // Initialize the db variable. Needed to prevent - // reference errors with some configurations - $CI->db = ''; - - // Load the DB class - $CI->db =& DB($params, $active_record); - } - - // -------------------------------------------------------------------- - - /** - * Load the Utilities Class - * - * @return string - */ - public function dbutil() - { - if ( ! class_exists('CI_DB')) - { - $this->database(); - } - - $CI =& get_instance(); - - // for backwards compatibility, load dbforge so we can extend dbutils off it - // this use is deprecated and strongly discouraged - $CI->load->dbforge(); - - require_once(BASEPATH.'database/DB_utility.php'); - require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility.php'); - $class = 'CI_DB_'.$CI->db->dbdriver.'_utility'; - - $CI->dbutil = new $class(); - } - - // -------------------------------------------------------------------- - - /** - * Load the Database Forge Class - * - * @return string - */ - public function dbforge() - { - if ( ! class_exists('CI_DB')) - { - $this->database(); - } - - $CI =& get_instance(); - - require_once(BASEPATH.'database/DB_forge.php'); - require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php'); - $class = 'CI_DB_'.$CI->db->dbdriver.'_forge'; - - $CI->dbforge = new $class(); - } - - // -------------------------------------------------------------------- - - /** - * Load View - * - * This function is used to load a "view" file. It has three parameters: - * - * 1. The name of the "view" file to be included. - * 2. An associative array of data to be extracted for use in the view. - * 3. TRUE/FALSE - whether to return the data or load it. In - * some cases it's advantageous to be able to return data so that - * a developer can process it in some way. - * - * @param string - * @param array - * @param bool - * @return void - */ - public function view($view, $vars = array(), $return = FALSE) - { - return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Load File - * - * This is a generic file loader - * - * @param string - * @param bool - * @return string - */ - public function file($path, $return = FALSE) - { - return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Set Variables - * - * Once variables are set they become available within - * the controller class and its "view" files. - * - * @param array - * @param string - * @return void - */ - public function vars($vars = array(), $val = '') - { - if ($val != '' AND is_string($vars)) - { - $vars = array($vars => $val); - } - - $vars = $this->_ci_object_to_array($vars); - - if (is_array($vars) AND count($vars) > 0) - { - foreach ($vars as $key => $val) - { - $this->_ci_cached_vars[$key] = $val; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Get Variable - * - * Check if a variable is set and retrieve it. - * - * @param array - * @return void - */ - public function get_var($key) - { - return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Load Helper - * - * This function loads the specified helper file. - * - * @param mixed - * @return void - */ - public function helper($helpers = array()) - { - foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) - { - if (isset($this->_ci_helpers[$helper])) - { - continue; - } - - $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php'; - - // Is this a helper extension request? - if (file_exists($ext_helper)) - { - $base_helper = BASEPATH.'helpers/'.$helper.'.php'; - - if ( ! file_exists($base_helper)) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - - include_once($ext_helper); - include_once($base_helper); - - $this->_ci_helpers[$helper] = TRUE; - log_message('debug', 'Helper loaded: '.$helper); - continue; - } - - // Try to load the helper - foreach ($this->_ci_helper_paths as $path) - { - if (file_exists($path.'helpers/'.$helper.'.php')) - { - include_once($path.'helpers/'.$helper.'.php'); - - $this->_ci_helpers[$helper] = TRUE; - log_message('debug', 'Helper loaded: '.$helper); - break; - } - } - - // unable to load the helper - if ( ! isset($this->_ci_helpers[$helper])) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - } - } - - // -------------------------------------------------------------------- - - /** - * Load Helpers - * - * This is simply an alias to the above function in case the - * user has written the plural form of this function. - * - * @param array - * @return void - */ - public function helpers($helpers = array()) - { - $this->helper($helpers); - } - - // -------------------------------------------------------------------- - - /** - * Loads a language file - * - * @param array - * @param string - * @return void - */ - public function language($file = array(), $lang = '') - { - $CI =& get_instance(); - - if ( ! is_array($file)) - { - $file = array($file); - } - - foreach ($file as $langfile) - { - $CI->lang->load($langfile, $lang); - } - } - - // -------------------------------------------------------------------- - - /** - * Loads a config file - * - * @param string - * @param bool - * @param bool - * @return void - */ - public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) - { - $CI =& get_instance(); - $CI->config->load($file, $use_sections, $fail_gracefully); - } - - // -------------------------------------------------------------------- - - /** - * Driver - * - * Loads a driver library - * - * @param string the name of the class - * @param mixed the optional parameters - * @param string an optional object name - * @return void - */ - public function driver($library = '', $params = NULL, $object_name = NULL) - { - if ( ! class_exists('CI_Driver_Library')) - { - // we aren't instantiating an object here, that'll be done by the Library itself - require BASEPATH.'libraries/Driver.php'; - } - - if ($library == '') - { - return FALSE; - } - - // We can save the loader some time since Drivers will *always* be in a subfolder, - // and typically identically named to the library - if ( ! strpos($library, '/')) - { - $library = ucfirst($library).'/'.$library; - } - - return $this->library($library, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Add Package Path - * - * Prepends a parent path to the library, model, helper, and config path arrays - * - * @param string - * @param boolean - * @return void - */ - public function add_package_path($path, $view_cascade=TRUE) - { - $path = rtrim($path, '/').'/'; - - array_unshift($this->_ci_library_paths, $path); - array_unshift($this->_ci_model_paths, $path); - array_unshift($this->_ci_helper_paths, $path); - - $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; - - // Add config file path - $config =& $this->_ci_get_component('config'); - array_unshift($config->_config_paths, $path); - } - - // -------------------------------------------------------------------- - - /** - * Get Package Paths - * - * Return a list of all package paths, by default it will ignore BASEPATH. - * - * @param string - * @return void - */ - public function get_package_paths($include_base = FALSE) - { - return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths; - } - - // -------------------------------------------------------------------- - - /** - * Remove Package Path - * - * Remove a path from the library, model, and helper path arrays if it exists - * If no path is provided, the most recently added path is removed. - * - * @param type - * @param bool - * @return type - */ - public function remove_package_path($path = '', $remove_config_path = TRUE) - { - $config =& $this->_ci_get_component('config'); - - if ($path == '') - { - $void = array_shift($this->_ci_library_paths); - $void = array_shift($this->_ci_model_paths); - $void = array_shift($this->_ci_helper_paths); - $void = array_shift($this->_ci_view_paths); - $void = array_shift($config->_config_paths); - } - else - { - $path = rtrim($path, '/').'/'; - foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) - { - if (($key = array_search($path, $this->{$var})) !== FALSE) - { - unset($this->{$var}[$key]); - } - } - - if (isset($this->_ci_view_paths[$path.'views/'])) - { - unset($this->_ci_view_paths[$path.'views/']); - } - - if (($key = array_search($path, $config->_config_paths)) !== FALSE) - { - unset($config->_config_paths[$key]); - } - } - - // make sure the application default paths are still in the array - $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); - $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); - $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); - $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); - $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); - } - - // -------------------------------------------------------------------- - - /** - * Loader - * - * This function is used to load views and files. - * Variables are prefixed with _ci_ to avoid symbol collision with - * variables made available to view files - * - * @param array - * @return void - */ - protected function _ci_load($_ci_data) - { - // Set the default data variables - foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) - { - $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val]; - } - - $file_exists = FALSE; - - // Set the path to the requested file - if ($_ci_path != '') - { - $_ci_x = explode('/', $_ci_path); - $_ci_file = end($_ci_x); - } - else - { - $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); - $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view; - - foreach ($this->_ci_view_paths as $view_file => $cascade) - { - if (file_exists($view_file.$_ci_file)) - { - $_ci_path = $view_file.$_ci_file; - $file_exists = TRUE; - break; - } - - if ( ! $cascade) - { - break; - } - } - } - - if ( ! $file_exists && ! file_exists($_ci_path)) - { - show_error('Unable to load the requested file: '.$_ci_file); - } - - // This allows anything loaded using $this->load (views, files, etc.) - // to become accessible from within the Controller and Model functions. - - $_ci_CI =& get_instance(); - foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) - { - if ( ! isset($this->$_ci_key)) - { - $this->$_ci_key =& $_ci_CI->$_ci_key; - } - } - - /* - * Extract and cache variables - * - * You can either set variables using the dedicated $this->load_vars() - * function or via the second parameter of this function. We'll merge - * the two types and cache them so that views that are embedded within - * other views can have access to these variables. - */ - if (is_array($_ci_vars)) - { - $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); - } - extract($this->_ci_cached_vars); - - /* - * Buffer the output - * - * We buffer the output for two reasons: - * 1. Speed. You get a significant speed boost. - * 2. So that the final rendered template can be - * post-processed by the output class. Why do we - * need post processing? For one thing, in order to - * show the elapsed page load time. Unless we - * can intercept the content right before it's sent to - * the browser and then stop the timer it won't be accurate. - */ - ob_start(); - - // If the PHP installation does not support short tags we'll - // do a little string replacement, changing the short tags - // to standard PHP echo statements. - - if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE) - { - echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace(' $this->_ci_ob_level + 1) - { - ob_end_flush(); - } - else - { - $_ci_CI->output->append_output(ob_get_contents()); - @ob_end_clean(); - } - } - - // -------------------------------------------------------------------- - - /** - * Load class - * - * This function loads the requested class. - * - * @param string the item that is being loaded - * @param mixed any additional parameters - * @param string an optional object name - * @return void - */ - protected function _ci_load_class($class, $params = NULL, $object_name = NULL) - { - // Get the class name, and while we're at it trim any slashes. - // The directory path can be included as part of the class name, - // but we don't want a leading slash - $class = str_replace('.php', '', trim($class, '/')); - - // Was the path included with the class name? - // We look for a slash to determine this - $subdir = ''; - if (($last_slash = strrpos($class, '/')) !== FALSE) - { - // Extract the path - $subdir = substr($class, 0, $last_slash + 1); - - // Get the filename from the path - $class = substr($class, $last_slash + 1); - } - - // We'll test for both lowercase and capitalized versions of the file name - foreach (array(ucfirst($class), strtolower($class)) as $class) - { - $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php'; - - // Is this a class extension request? - if (file_exists($subclass)) - { - $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php'; - - if ( ! file_exists($baseclass)) - { - log_message('error', "Unable to load the requested class: ".$class); - show_error("Unable to load the requested class: ".$class); - } - - // Safety: Was the class already loaded by a previous call? - if (in_array($subclass, $this->_ci_loaded_files)) - { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ( ! is_null($object_name)) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); - } - } - - $is_duplicate = TRUE; - log_message('debug', $class." class already loaded. Second attempt ignored."); - return; - } - - include_once($baseclass); - include_once($subclass); - $this->_ci_loaded_files[] = $subclass; - - return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); - } - - // Lets search for the requested library file and load it. - $is_duplicate = FALSE; - foreach ($this->_ci_library_paths as $path) - { - $filepath = $path.'libraries/'.$subdir.$class.'.php'; - - // Does the file exist? No? Bummer... - if ( ! file_exists($filepath)) - { - continue; - } - - // Safety: Was the class already loaded by a previous call? - if (in_array($filepath, $this->_ci_loaded_files)) - { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ( ! is_null($object_name)) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_class($class, '', $params, $object_name); - } - } - - $is_duplicate = TRUE; - log_message('debug', $class." class already loaded. Second attempt ignored."); - return; - } - - include_once($filepath); - $this->_ci_loaded_files[] = $filepath; - return $this->_ci_init_class($class, '', $params, $object_name); - } - - } // END FOREACH - - // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? - if ($subdir == '') - { - $path = strtolower($class).'/'.$class; - return $this->_ci_load_class($path, $params); - } - - // If we got this far we were unable to find the requested class. - // We do not issue errors if the load call failed due to a duplicate request - if ($is_duplicate == FALSE) - { - log_message('error', "Unable to load the requested class: ".$class); - show_error("Unable to load the requested class: ".$class); - } - } - - // -------------------------------------------------------------------- - - /** - * Instantiates a class - * - * @param string - * @param string - * @param bool - * @param string an optional object name - * @return null - */ - protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL) - { - // Is there an associated config file for this class? Note: these should always be lowercase - if ($config === NULL) - { - // Fetch the config paths containing any package paths - $config_component = $this->_ci_get_component('config'); - - if (is_array($config_component->_config_paths)) - { - // Break on the first found file, thus package files - // are not overridden by default paths - foreach ($config_component->_config_paths as $path) - { - // We test for both uppercase and lowercase, for servers that - // are case-sensitive with regard to file names. Check for environment - // first, global next - if (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) - { - include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); - break; - } - elseif (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) - { - include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); - break; - } - elseif (file_exists($path .'config/'.strtolower($class).'.php')) - { - include($path .'config/'.strtolower($class).'.php'); - break; - } - elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php')) - { - include($path .'config/'.ucfirst(strtolower($class)).'.php'); - break; - } - } - } - } - - if ($prefix == '') - { - if (class_exists('CI_'.$class)) - { - $name = 'CI_'.$class; - } - elseif (class_exists(config_item('subclass_prefix').$class)) - { - $name = config_item('subclass_prefix').$class; - } - else - { - $name = $class; - } - } - else - { - $name = $prefix.$class; - } - - // Is the class name valid? - if ( ! class_exists($name)) - { - log_message('error', "Non-existent class: ".$name); - show_error("Non-existent class: ".$class); - } - - // Set the variable name we will assign the class to - // Was a custom class name supplied? If so we'll use it - $class = strtolower($class); - - if (is_null($object_name)) - { - $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class]; - } - else - { - $classvar = $object_name; - } - - // Save the class name and object name - $this->_ci_classes[$class] = $classvar; - - // Instantiate the class - $CI =& get_instance(); - if ($config !== NULL) - { - $CI->$classvar = new $name($config); - } - else - { - $CI->$classvar = new $name; - } - } - - // -------------------------------------------------------------------- - - /** - * Autoloader - * - * The config/autoload.php file contains an array that permits sub-systems, - * libraries, and helpers to be loaded automatically. - * - * @param array - * @return void - */ - private function _ci_autoloader() - { - if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); - } - else - { - include(APPPATH.'config/autoload.php'); - } - - if ( ! isset($autoload)) - { - return FALSE; - } - - // Autoload packages - if (isset($autoload['packages'])) - { - foreach ($autoload['packages'] as $package_path) - { - $this->add_package_path($package_path); - } - } - - // Load any custom config file - if (count($autoload['config']) > 0) - { - $CI =& get_instance(); - foreach ($autoload['config'] as $key => $val) - { - $CI->config->load($val); - } - } - - // Autoload helpers and languages - foreach (array('helper', 'language') as $type) - { - if (isset($autoload[$type]) AND count($autoload[$type]) > 0) - { - $this->$type($autoload[$type]); - } - } - - // A little tweak to remain backward compatible - // The $autoload['core'] item was deprecated - if ( ! isset($autoload['libraries']) AND isset($autoload['core'])) - { - $autoload['libraries'] = $autoload['core']; - } - - // Load libraries - if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0) - { - // Load the database driver. - if (in_array('database', $autoload['libraries'])) - { - $this->database(); - $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); - } - - // Load all other libraries - foreach ($autoload['libraries'] as $item) - { - $this->library($item); - } - } - - // Autoload models - if (isset($autoload['model'])) - { - $this->model($autoload['model']); - } - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - protected function _ci_object_to_array($object) - { - return (is_object($object)) ? get_object_vars($object) : $object; - } - - // -------------------------------------------------------------------- - - /** - * Get a reference to a specific library or model - * - * @param string - * @return bool - */ - protected function &_ci_get_component($component) - { - $CI =& get_instance(); - return $CI->$component; - } - - // -------------------------------------------------------------------- - - /** - * Prep filename - * - * This function preps the name of various items to make loading them more reliable. - * - * @param mixed - * @param string - * @return array - */ - protected function _ci_prep_filename($filename, $extension) - { - if ( ! is_array($filename)) - { - return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension)); - } - else - { - foreach ($filename as $key => $val) - { - $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension); - } - - return $filename; - } - } -} - -/* End of file Loader.php */ -/* Location: ./system/core/Loader.php */ \ No newline at end of file diff --git a/sources/web/system/core/Model.php b/sources/web/system/core/Model.php deleted file mode 100755 index e15ffbe..0000000 --- a/sources/web/system/core/Model.php +++ /dev/null @@ -1,57 +0,0 @@ -$key; - } -} -// END Model Class - -/* End of file Model.php */ -/* Location: ./system/core/Model.php */ \ No newline at end of file diff --git a/sources/web/system/core/Output.php b/sources/web/system/core/Output.php deleted file mode 100755 index ccecafd..0000000 --- a/sources/web/system/core/Output.php +++ /dev/null @@ -1,574 +0,0 @@ -_zlib_oc = @ini_get('zlib.output_compression'); - - // Get mime types for later - if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) - { - include APPPATH.'config/'.ENVIRONMENT.'/mimes.php'; - } - else - { - include APPPATH.'config/mimes.php'; - } - - - $this->mime_types = $mimes; - - log_message('debug', "Output Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Get Output - * - * Returns the current output string - * - * @access public - * @return string - */ - function get_output() - { - return $this->final_output; - } - - // -------------------------------------------------------------------- - - /** - * Set Output - * - * Sets the output string - * - * @access public - * @param string - * @return void - */ - function set_output($output) - { - $this->final_output = $output; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Append Output - * - * Appends data onto the output string - * - * @access public - * @param string - * @return void - */ - function append_output($output) - { - if ($this->final_output == '') - { - $this->final_output = $output; - } - else - { - $this->final_output .= $output; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Header - * - * Lets you set a server header which will be outputted with the final display. - * - * Note: If a file is cached, headers will not be sent. We need to figure out - * how to permit header data to be saved with the cache data... - * - * @access public - * @param string - * @param bool - * @return void - */ - function set_header($header, $replace = TRUE) - { - // If zlib.output_compression is enabled it will compress the output, - // but it will not modify the content-length header to compensate for - // the reduction, causing the browser to hang waiting for more data. - // We'll just skip content-length in those cases. - - if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0) - { - return; - } - - $this->headers[] = array($header, $replace); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Content Type Header - * - * @access public - * @param string extension of the file we're outputting - * @return void - */ - function set_content_type($mime_type) - { - if (strpos($mime_type, '/') === FALSE) - { - $extension = ltrim($mime_type, '.'); - - // Is this extension supported? - if (isset($this->mime_types[$extension])) - { - $mime_type =& $this->mime_types[$extension]; - - if (is_array($mime_type)) - { - $mime_type = current($mime_type); - } - } - } - - $header = 'Content-Type: '.$mime_type; - - $this->headers[] = array($header, TRUE); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set HTTP Status Header - * moved to Common procedural functions in 1.7.2 - * - * @access public - * @param int the status code - * @param string - * @return void - */ - function set_status_header($code = 200, $text = '') - { - set_status_header($code, $text); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Profiler - * - * @access public - * @param bool - * @return void - */ - function enable_profiler($val = TRUE) - { - $this->enable_profiler = (is_bool($val)) ? $val : TRUE; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Profiler Sections - * - * Allows override of default / config settings for Profiler section display - * - * @access public - * @param array - * @return void - */ - function set_profiler_sections($sections) - { - foreach ($sections as $section => $enable) - { - $this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Cache - * - * @access public - * @param integer - * @return void - */ - function cache($time) - { - $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Display Output - * - * All "view" data is automatically put into this variable by the controller class: - * - * $this->final_output - * - * This function sends the finalized output data to the browser along - * with any server headers and profile data. It also stops the - * benchmark timer so the page rendering speed and memory usage can be shown. - * - * @access public - * @param string - * @return mixed - */ - function _display($output = '') - { - // Note: We use globals because we can't use $CI =& get_instance() - // since this function is sometimes called by the caching mechanism, - // which happens before the CI super object is available. - global $BM, $CFG; - - // Grab the super object if we can. - if (class_exists('CI_Controller')) - { - $CI =& get_instance(); - } - - // -------------------------------------------------------------------- - - // Set the output data - if ($output == '') - { - $output =& $this->final_output; - } - - // -------------------------------------------------------------------- - - // Do we need to write a cache file? Only if the controller does not have its - // own _output() method and we are not dealing with a cache file, which we - // can determine by the existence of the $CI object above - if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) - { - $this->_write_cache($output); - } - - // -------------------------------------------------------------------- - - // Parse out the elapsed time and memory usage, - // then swap the pseudo-variables with the data - - $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); - - if ($this->parse_exec_vars === TRUE) - { - $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB'; - - $output = str_replace('{elapsed_time}', $elapsed, $output); - $output = str_replace('{memory_usage}', $memory, $output); - } - - // -------------------------------------------------------------------- - - // Is compression requested? - if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE) - { - if (extension_loaded('zlib')) - { - if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - ob_start('ob_gzhandler'); - } - } - } - - // -------------------------------------------------------------------- - - // Are there any server headers to send? - if (count($this->headers) > 0) - { - foreach ($this->headers as $header) - { - @header($header[0], $header[1]); - } - } - - // -------------------------------------------------------------------- - - // Does the $CI object exist? - // If not we know we are dealing with a cache file so we'll - // simply echo out the data and exit. - if ( ! isset($CI)) - { - echo $output; - log_message('debug', "Final output sent to browser"); - log_message('debug', "Total execution time: ".$elapsed); - return TRUE; - } - - // -------------------------------------------------------------------- - - // Do we need to generate profile data? - // If so, load the Profile class and run it. - if ($this->enable_profiler == TRUE) - { - $CI->load->library('profiler'); - - if ( ! empty($this->_profiler_sections)) - { - $CI->profiler->set_sections($this->_profiler_sections); - } - - // If the output data contains closing and tags - // we will remove them and add them back after we insert the profile data - if (preg_match("|.*?|is", $output)) - { - $output = preg_replace("|.*?|is", '', $output); - $output .= $CI->profiler->run(); - $output .= ''; - } - else - { - $output .= $CI->profiler->run(); - } - } - - // -------------------------------------------------------------------- - - // Does the controller contain a function named _output()? - // If so send the output there. Otherwise, echo it. - if (method_exists($CI, '_output')) - { - $CI->_output($output); - } - else - { - echo $output; // Send it to the browser! - } - - log_message('debug', "Final output sent to browser"); - log_message('debug', "Total execution time: ".$elapsed); - } - - // -------------------------------------------------------------------- - - /** - * Write a Cache File - * - * @access public - * @param string - * @return void - */ - function _write_cache($output) - { - $CI =& get_instance(); - $path = $CI->config->item('cache_path'); - - $cache_path = ($path == '') ? APPPATH.'cache/' : $path; - - if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) - { - log_message('error', "Unable to write cache file: ".$cache_path); - return; - } - - $uri = $CI->config->item('base_url'). - $CI->config->item('index_page'). - $CI->uri->uri_string(); - - $cache_path .= md5($uri); - - if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)) - { - log_message('error', "Unable to write cache file: ".$cache_path); - return; - } - - $expire = time() + ($this->cache_expiration * 60); - - if (flock($fp, LOCK_EX)) - { - fwrite($fp, $expire.'TS--->'.$output); - flock($fp, LOCK_UN); - } - else - { - log_message('error', "Unable to secure a file lock for file at: ".$cache_path); - return; - } - fclose($fp); - @chmod($cache_path, FILE_WRITE_MODE); - - log_message('debug', "Cache file written: ".$cache_path); - } - - // -------------------------------------------------------------------- - - /** - * Update/serve a cached file - * - * @access public - * @param object config class - * @param object uri class - * @return void - */ - function _display_cache(&$CFG, &$URI) - { - $cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path'); - - // Build the file path. The file name is an MD5 hash of the full URI - $uri = $CFG->item('base_url'). - $CFG->item('index_page'). - $URI->uri_string; - - $filepath = $cache_path.md5($uri); - - if ( ! @file_exists($filepath)) - { - return FALSE; - } - - if ( ! $fp = @fopen($filepath, FOPEN_READ)) - { - return FALSE; - } - - flock($fp, LOCK_SH); - - $cache = ''; - if (filesize($filepath) > 0) - { - $cache = fread($fp, filesize($filepath)); - } - - flock($fp, LOCK_UN); - fclose($fp); - - // Strip out the embedded timestamp - if ( ! preg_match("/(\d+TS--->)/", $cache, $match)) - { - return FALSE; - } - - // Has the file expired? If so we'll delete it. - if (time() >= trim(str_replace('TS--->', '', $match['1']))) - { - if (is_really_writable($cache_path)) - { - @unlink($filepath); - log_message('debug', "Cache file has expired. File deleted"); - return FALSE; - } - } - - // Display the cache - $this->_display(str_replace($match['0'], '', $cache)); - log_message('debug', "Cache file is current. Sending it to browser."); - return TRUE; - } - - -} -// END Output Class - -/* End of file Output.php */ -/* Location: ./system/core/Output.php */ \ No newline at end of file diff --git a/sources/web/system/core/Router.php b/sources/web/system/core/Router.php deleted file mode 100755 index 6da6674..0000000 --- a/sources/web/system/core/Router.php +++ /dev/null @@ -1,522 +0,0 @@ -config =& load_class('Config', 'core'); - $this->uri =& load_class('URI', 'core'); - log_message('debug', "Router Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Set the route mapping - * - * This function determines what should be served based on the URI request, - * as well as any "routes" that have been set in the routing config file. - * - * @access private - * @return void - */ - function _set_routing() - { - // Are query strings enabled in the config file? Normally CI doesn't utilize query strings - // since URI segments are more search-engine friendly, but they can optionally be used. - // If this feature is enabled, we will gather the directory/class/method a little differently - $segments = array(); - if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')])) - { - if (isset($_GET[$this->config->item('directory_trigger')])) - { - $this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')]))); - $segments[] = $this->fetch_directory(); - } - - if (isset($_GET[$this->config->item('controller_trigger')])) - { - $this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')]))); - $segments[] = $this->fetch_class(); - } - - if (isset($_GET[$this->config->item('function_trigger')])) - { - $this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')]))); - $segments[] = $this->fetch_method(); - } - } - - // Load the routes.php file. - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); - } - elseif (is_file(APPPATH.'config/routes.php')) - { - include(APPPATH.'config/routes.php'); - } - - $this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route; - unset($route); - - // Set the default controller so we can display it in the event - // the URI doesn't correlated to a valid controller. - $this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']); - - // Were there any query string segments? If so, we'll validate them and bail out since we're done. - if (count($segments) > 0) - { - return $this->_validate_request($segments); - } - - // Fetch the complete URI string - $this->uri->_fetch_uri_string(); - - // Is there a URI string? If not, the default controller specified in the "routes" file will be shown. - if ($this->uri->uri_string == '') - { - return $this->_set_default_controller(); - } - - // Do we need to remove the URL suffix? - $this->uri->_remove_url_suffix(); - - // Compile the segments into an array - $this->uri->_explode_segments(); - - // Parse any custom routing that may exist - $this->_parse_routes(); - - // Re-index the segment array so that it starts with 1 rather than 0 - $this->uri->_reindex_segments(); - } - - // -------------------------------------------------------------------- - - /** - * Set the default controller - * - * @access private - * @return void - */ - function _set_default_controller() - { - if ($this->default_controller === FALSE) - { - show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file."); - } - // Is the method being specified? - if (strpos($this->default_controller, '/') !== FALSE) - { - $x = explode('/', $this->default_controller); - - $this->set_class($x[0]); - $this->set_method($x[1]); - $this->_set_request($x); - } - else - { - $this->set_class($this->default_controller); - $this->set_method('index'); - $this->_set_request(array($this->default_controller, 'index')); - } - - // re-index the routed segments array so it starts with 1 rather than 0 - $this->uri->_reindex_segments(); - - log_message('debug', "No URI present. Default controller set."); - } - - // -------------------------------------------------------------------- - - /** - * Set the Route - * - * This function takes an array of URI segments as - * input, and sets the current class/method - * - * @access private - * @param array - * @param bool - * @return void - */ - function _set_request($segments = array()) - { - $segments = $this->_validate_request($segments); - - if (count($segments) == 0) - { - return $this->_set_default_controller(); - } - - $this->set_class($segments[0]); - - if (isset($segments[1])) - { - // A standard method request - $this->set_method($segments[1]); - } - else - { - // This lets the "routed" segment array identify that the default - // index method is being used. - $segments[1] = 'index'; - } - - // Update our "routed" segment array to contain the segments. - // Note: If there is no custom routing, this array will be - // identical to $this->uri->segments - $this->uri->rsegments = $segments; - } - - // -------------------------------------------------------------------- - - /** - * Validates the supplied segments. Attempts to determine the path to - * the controller. - * - * @access private - * @param array - * @return array - */ - function _validate_request($segments) - { - if (count($segments) == 0) - { - return $segments; - } - - // Does the requested controller exist in the root folder? - if (file_exists(APPPATH.'controllers/'.$segments[0].'.php')) - { - return $segments; - } - - // Is the controller in a sub-folder? - if (is_dir(APPPATH.'controllers/'.$segments[0])) - { - // Set the directory and remove it from the segment array - $this->set_directory($segments[0]); - $segments = array_slice($segments, 1); - - if (count($segments) > 0) - { - // Does the requested controller exist in the sub-folder? - if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) - { - if ( ! empty($this->routes['404_override'])) - { - $x = explode('/', $this->routes['404_override']); - - $this->set_directory(''); - $this->set_class($x[0]); - $this->set_method(isset($x[1]) ? $x[1] : 'index'); - - return $x; - } - else - { - show_404($this->fetch_directory().$segments[0]); - } - } - } - else - { - // Is the method being specified in the route? - if (strpos($this->default_controller, '/') !== FALSE) - { - $x = explode('/', $this->default_controller); - - $this->set_class($x[0]); - $this->set_method($x[1]); - } - else - { - $this->set_class($this->default_controller); - $this->set_method('index'); - } - - // Does the default controller exist in the sub-folder? - if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php')) - { - $this->directory = ''; - return array(); - } - - } - - return $segments; - } - - - // If we've gotten this far it means that the URI does not correlate to a valid - // controller class. We will now see if there is an override - if ( ! empty($this->routes['404_override'])) - { - $x = explode('/', $this->routes['404_override']); - - $this->set_class($x[0]); - $this->set_method(isset($x[1]) ? $x[1] : 'index'); - - return $x; - } - - - // Nothing else to do at this point but show a 404 - show_404($segments[0]); - } - - // -------------------------------------------------------------------- - - /** - * Parse Routes - * - * This function matches any routes that may exist in - * the config/routes.php file against the URI to - * determine if the class/method need to be remapped. - * - * @access private - * @return void - */ - function _parse_routes() - { - // Turn the segment array into a URI string - $uri = implode('/', $this->uri->segments); - - // Is there a literal match? If so we're done - if (isset($this->routes[$uri])) - { - return $this->_set_request(explode('/', $this->routes[$uri])); - } - - // Loop through the route array looking for wild-cards - foreach ($this->routes as $key => $val) - { - // Convert wild-cards to RegEx - $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key)); - - // Does the RegEx match? - if (preg_match('#^'.$key.'$#', $uri)) - { - // Do we have a back-reference? - if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) - { - $val = preg_replace('#^'.$key.'$#', $val, $uri); - } - - return $this->_set_request(explode('/', $val)); - } - } - - // If we got this far it means we didn't encounter a - // matching route so we'll set the site default route - $this->_set_request($this->uri->segments); - } - - // -------------------------------------------------------------------- - - /** - * Set the class name - * - * @access public - * @param string - * @return void - */ - function set_class($class) - { - $this->class = str_replace(array('/', '.'), '', $class); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current class - * - * @access public - * @return string - */ - function fetch_class() - { - return $this->class; - } - - // -------------------------------------------------------------------- - - /** - * Set the method name - * - * @access public - * @param string - * @return void - */ - function set_method($method) - { - $this->method = $method; - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current method - * - * @access public - * @return string - */ - function fetch_method() - { - if ($this->method == $this->fetch_class()) - { - return 'index'; - } - - return $this->method; - } - - // -------------------------------------------------------------------- - - /** - * Set the directory name - * - * @access public - * @param string - * @return void - */ - function set_directory($dir) - { - $this->directory = str_replace(array('/', '.'), '', $dir).'/'; - } - - // -------------------------------------------------------------------- - - /** - * Fetch the sub-directory (if any) that contains the requested controller class - * - * @access public - * @return string - */ - function fetch_directory() - { - return $this->directory; - } - - // -------------------------------------------------------------------- - - /** - * Set the controller overrides - * - * @access public - * @param array - * @return null - */ - function _set_overrides($routing) - { - if ( ! is_array($routing)) - { - return; - } - - if (isset($routing['directory'])) - { - $this->set_directory($routing['directory']); - } - - if (isset($routing['controller']) AND $routing['controller'] != '') - { - $this->set_class($routing['controller']); - } - - if (isset($routing['function'])) - { - $routing['function'] = ($routing['function'] == '') ? 'index' : $routing['function']; - $this->set_method($routing['function']); - } - } - - -} -// END Router Class - -/* End of file Router.php */ -/* Location: ./system/core/Router.php */ \ No newline at end of file diff --git a/sources/web/system/core/Security.php b/sources/web/system/core/Security.php deleted file mode 100755 index 7af240d..0000000 --- a/sources/web/system/core/Security.php +++ /dev/null @@ -1,877 +0,0 @@ - '[removed]', - 'document.write' => '[removed]', - '.parentNode' => '[removed]', - '.innerHTML' => '[removed]', - 'window.location' => '[removed]', - '-moz-binding' => '[removed]', - '' => '-->', - ' '<![CDATA[', - '' => '<comment>' - ); - - /* never allowed, regex replacement */ - /** - * List of never allowed regex replacement - * - * @var array - * @access protected - */ - protected $_never_allowed_regex = array( - 'javascript\s*:', - 'expression\s*(\(|&\#40;)', // CSS and IE - 'vbscript\s*:', // IE, surprise! - 'Redirect\s+302', - "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" - ); - - /** - * Constructor - */ - public function __construct() - { - // CSRF config - foreach(array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) - { - if (FALSE !== ($val = config_item($key))) - { - $this->{'_'.$key} = $val; - } - } - - // Append application specific cookie prefix - if (config_item('cookie_prefix')) - { - $this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name; - } - - // Set the CSRF hash - $this->_csrf_set_hash(); - - log_message('debug', "Security Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Verify Cross Site Request Forgery Protection - * - * @return object - */ - public function csrf_verify() - { - // If no POST data exists we will set the CSRF cookie - if (count($_POST) == 0) - { - return $this->csrf_set_cookie(); - } - - // Do the tokens exist in both the _POST and _COOKIE arrays? - if ( ! isset($_POST[$this->_csrf_token_name]) OR - ! isset($_COOKIE[$this->_csrf_cookie_name])) - { - $this->csrf_show_error(); - } - - // Do the tokens match? - if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name]) - { - $this->csrf_show_error(); - } - - // We kill this since we're done and we don't want to - // polute the _POST array - unset($_POST[$this->_csrf_token_name]); - - // Nothing should last forever - unset($_COOKIE[$this->_csrf_cookie_name]); - $this->_csrf_set_hash(); - $this->csrf_set_cookie(); - - log_message('debug', "CSRF token verified "); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Cross Site Request Forgery Protection Cookie - * - * @return object - */ - public function csrf_set_cookie() - { - $expire = time() + $this->_csrf_expire; - $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0; - - if ($secure_cookie) - { - $req = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : FALSE; - - if ( ! $req OR $req == 'off') - { - return FALSE; - } - } - - setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie); - - log_message('debug', "CRSF cookie Set"); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Show CSRF Error - * - * @return void - */ - public function csrf_show_error() - { - show_error('The action you have requested is not allowed.'); - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Hash - * - * Getter Method - * - * @return string self::_csrf_hash - */ - public function get_csrf_hash() - { - return $this->_csrf_hash; - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Token Name - * - * Getter Method - * - * @return string self::csrf_token_name - */ - public function get_csrf_token_name() - { - return $this->_csrf_token_name; - } - - // -------------------------------------------------------------------- - - /** - * XSS Clean - * - * Sanitizes data so that Cross Site Scripting Hacks can be - * prevented. This function does a fair amount of work but - * it is extremely thorough, designed to prevent even the - * most obscure XSS attempts. Nothing is ever 100% foolproof, - * of course, but I haven't been able to get anything passed - * the filter. - * - * Note: This function should only be used to deal with data - * upon submission. It's not something that should - * be used for general runtime processing. - * - * This function was based in part on some code and ideas I - * got from Bitflux: http://channel.bitflux.ch/wiki/XSS_Prevention - * - * To help develop this script I used this great list of - * vulnerabilities along with a few other hacks I've - * harvested from examining vulnerabilities in other programs: - * http://ha.ckers.org/xss.html - * - * @param mixed string or array - * @param bool - * @return string - */ - public function xss_clean($str, $is_image = FALSE) - { - /* - * Is the string an array? - * - */ - if (is_array($str)) - { - while (list($key) = each($str)) - { - $str[$key] = $this->xss_clean($str[$key]); - } - - return $str; - } - - /* - * Remove Invisible Characters - */ - $str = remove_invisible_characters($str); - - // Validate Entities in URLs - $str = $this->_validate_entities($str); - - /* - * URL Decode - * - * Just in case stuff like this is submitted: - * - * Google - * - * Note: Use rawurldecode() so it does not remove plus signs - * - */ - $str = rawurldecode($str); - - /* - * Convert character entities to ASCII - * - * This permits our tests below to work reliably. - * We only convert entities that are within tags since - * these are the ones that will pose security problems. - * - */ - - $str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); - - $str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_decode_entity'), $str); - - /* - * Remove Invisible Characters Again! - */ - $str = remove_invisible_characters($str); - - /* - * Convert all tabs to spaces - * - * This prevents strings like this: ja vascript - * NOTE: we deal with spaces between characters later. - * NOTE: preg_replace was found to be amazingly slow here on - * large blocks of data, so we use str_replace. - */ - - if (strpos($str, "\t") !== FALSE) - { - $str = str_replace("\t", ' ', $str); - } - - /* - * Capture converted string for later comparison - */ - $converted_string = $str; - - // Remove Strings that are never allowed - $str = $this->_do_never_allowed($str); - - /* - * Makes PHP tags safe - * - * Note: XML tags are inadvertently replaced too: - * - * '), array('<?', '?>'), $str); - } - - /* - * Compact any exploded words - * - * This corrects words like: j a v a s c r i p t - * These words are compacted back to their correct state. - */ - $words = array( - 'javascript', 'expression', 'vbscript', 'script', 'base64', - 'applet', 'alert', 'document', 'write', 'cookie', 'window' - ); - - foreach ($words as $word) - { - $temp = ''; - - for ($i = 0, $wordlen = strlen($word); $i < $wordlen; $i++) - { - $temp .= substr($word, $i, 1)."\s*"; - } - - // We only want to do this when it is followed by a non-word character - // That way valid stuff like "dealer to" does not become "dealerto" - $str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); - } - - /* - * Remove disallowed Javascript in links or img tags - * We used to do some version comparisons and use of stripos for PHP5, - * but it is dog slow compared to these simplified non-capturing - * preg_match(), especially if the pattern exists in the string - */ - do - { - $original = $str; - - if (preg_match("/]*?)(>|$)#si", array($this, '_js_link_removal'), $str); - } - - if (preg_match("/]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str); - } - - if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str)) - { - $str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str); - } - } - while($original != $str); - - unset($original); - - // Remove evil attributes such as style, onclick and xmlns - $str = $this->_remove_evil_attributes($str, $is_image); - - /* - * Sanitize naughty HTML elements - * - * If a tag containing any of the words in the list - * below is found, the tag gets converted to entities. - * - * So this: - * Becomes: <blink> - */ - $naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss'; - $str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str); - - /* - * Sanitize naughty scripting elements - * - * Similar to above, only instead of looking for - * tags it looks for PHP and JavaScript commands - * that are disallowed. Rather than removing the - * code, it simply converts the parenthesis to entities - * rendering the code un-executable. - * - * For example: eval('some code') - * Becomes: eval('some code') - */ - $str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str); - - - // Final clean up - // This adds a bit of extra precaution in case - // something got through the above filters - $str = $this->_do_never_allowed($str); - - /* - * Images are Handled in a Special Way - * - Essentially, we want to know that after all of the character - * conversion is done whether any unwanted, likely XSS, code was found. - * If not, we return TRUE, as the image is clean. - * However, if the string post-conversion does not matched the - * string post-removal of XSS, then it fails, as there was unwanted XSS - * code found and removed/changed during processing. - */ - - if ($is_image === TRUE) - { - return ($str == $converted_string) ? TRUE: FALSE; - } - - log_message('debug', "XSS Filtering completed"); - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Random Hash for protecting URLs - * - * @return string - */ - public function xss_hash() - { - if ($this->_xss_hash == '') - { - mt_srand(); - $this->_xss_hash = md5(time() + mt_rand(0, 1999999999)); - } - - return $this->_xss_hash; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entities Decode - * - * This function is a replacement for html_entity_decode() - * - * The reason we are not using html_entity_decode() by itself is because - * while it is not technically correct to leave out the semicolon - * at the end of an entity most browsers will still interpret the entity - * correctly. html_entity_decode() does not convert entities without - * semicolons, so we are left with our own little solution here. Bummer. - * - * @param string - * @param string - * @return string - */ - public function entity_decode($str, $charset='UTF-8') - { - if (stristr($str, '&') === FALSE) - { - return $str; - } - - $str = html_entity_decode($str, ENT_COMPAT, $charset); - $str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str); - return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str); - } - - // -------------------------------------------------------------------- - - /** - * Filename Security - * - * @param string - * @param bool - * @return string - */ - public function sanitize_filename($str, $relative_path = FALSE) - { - $bad = array( - "../", - "", - "<", - ">", - "'", - '"', - '&', - '$', - '#', - '{', - '}', - '[', - ']', - '=', - ';', - '?', - "%20", - "%22", - "%3c", // < - "%253c", // < - "%3e", // > - "%0e", // > - "%28", // ( - "%29", // ) - "%2528", // ( - "%26", // & - "%24", // $ - "%3f", // ? - "%3b", // ; - "%3d" // = - ); - - if ( ! $relative_path) - { - $bad[] = './'; - $bad[] = '/'; - } - - $str = remove_invisible_characters($str, FALSE); - return stripslashes(str_replace($bad, '', $str)); - } - - // ---------------------------------------------------------------- - - /** - * Compact Exploded Words - * - * Callback function for xss_clean() to remove whitespace from - * things like j a v a s c r i p t - * - * @param type - * @return type - */ - protected function _compact_exploded_words($matches) - { - return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; - } - - // -------------------------------------------------------------------- - - /* - * Remove Evil HTML Attributes (like evenhandlers and style) - * - * It removes the evil attribute and either: - * - Everything up until a space - * For example, everything between the pipes: - * - * - Everything inside the quotes - * For example, everything between the pipes: - * - * - * @param string $str The string to check - * @param boolean $is_image TRUE if this is an image - * @return string The string with the evil attributes removed - */ - protected function _remove_evil_attributes($str, $is_image) - { - // All javascript event handlers (e.g. onload, onclick, onmouseover), style, and xmlns - $evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction'); - - if ($is_image === TRUE) - { - /* - * Adobe Photoshop puts XML metadata into JFIF images, - * including namespacing, so we have to allow this for images. - */ - unset($evil_attributes[array_search('xmlns', $evil_attributes)]); - } - - do { - $count = 0; - $attribs = array(); - - // find occurrences of illegal attribute strings without quotes - preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*([^\s>]*)/is', $str, $matches, PREG_SET_ORDER); - - foreach ($matches as $attr) - { - - $attribs[] = preg_quote($attr[0], '/'); - } - - // find occurrences of illegal attribute strings with quotes (042 and 047 are octal quotes) - preg_match_all("/(".implode('|', $evil_attributes).")\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is", $str, $matches, PREG_SET_ORDER); - - foreach ($matches as $attr) - { - $attribs[] = preg_quote($attr[0], '/'); - } - - // replace illegal attribute strings that are inside an html tag - if (count($attribs) > 0) - { - $str = preg_replace("/<(\/?[^><]+?)([^A-Za-z<>\-])(.*?)(".implode('|', $attribs).")(.*?)([\s><])([><]*)/i", '<$1 $3$5$6$7', $str, -1, $count); - } - - } while ($count); - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Naughty HTML - * - * Callback function for xss_clean() to remove naughty HTML elements - * - * @param array - * @return string - */ - protected function _sanitize_naughty_html($matches) - { - // encode opening brace - $str = '<'.$matches[1].$matches[2].$matches[3]; - - // encode captured opening or closing brace to prevent recursive vectors - $str .= str_replace(array('>', '<'), array('>', '<'), - $matches[4]); - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * JS Link Removal - * - * Callback function for xss_clean() to sanitize links - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on link-heavy strings - * - * @param array - * @return string - */ - protected function _js_link_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#href=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|_filter_attributes(str_replace(array('<', '>'), '', $match[1])) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * JS Image Removal - * - * Callback function for xss_clean() to sanitize image tags - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on image tag heavy strings - * - * @param array - * @return string - */ - protected function _js_img_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#src=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|_filter_attributes(str_replace(array('<', '>'), '', $match[1])) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * Attribute Conversion - * - * Used as a callback for XSS Clean - * - * @param array - * @return string - */ - protected function _convert_attribute($match) - { - return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); - } - - // -------------------------------------------------------------------- - - /** - * Filter Attributes - * - * Filters tag attributes for consistency and safety - * - * @param string - * @return string - */ - protected function _filter_attributes($str) - { - $out = ''; - - if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) - { - foreach ($matches[0] as $match) - { - $out .= preg_replace("#/\*.*?\*/#s", '', $match); - } - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entity Decode Callback - * - * Used as a callback for XSS Clean - * - * @param array - * @return string - */ - protected function _decode_entity($match) - { - return $this->entity_decode($match[0], strtoupper(config_item('charset'))); - } - - // -------------------------------------------------------------------- - - /** - * Validate URL entities - * - * Called by xss_clean() - * - * @param string - * @return string - */ - protected function _validate_entities($str) - { - /* - * Protect GET variables in URLs - */ - - // 901119URL5918AMP18930PROTECT8198 - - $str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str); - - /* - * Validate standard character entities - * - * Add a semicolon if missing. We do this to enable - * the conversion of entities to ASCII later. - * - */ - $str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str); - - /* - * Validate UTF16 two byte encoding (x00) - * - * Just as above, adds a semicolon if missing. - * - */ - $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str); - - /* - * Un-Protect GET variables in URLs - */ - $str = str_replace($this->xss_hash(), '&', $str); - - return $str; - } - - // ---------------------------------------------------------------------- - - /** - * Do Never Allowed - * - * A utility function for xss_clean() - * - * @param string - * @return string - */ - protected function _do_never_allowed($str) - { - $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); - - foreach ($this->_never_allowed_regex as $regex) - { - $str = preg_replace('#'.$regex.'#is', '[removed]', $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Set Cross Site Request Forgery Protection Cookie - * - * @return string - */ - protected function _csrf_set_hash() - { - if ($this->_csrf_hash == '') - { - // If the cookie exists we will use it's value. - // We don't necessarily want to regenerate it with - // each page load since a page could contain embedded - // sub-pages causing this feature to fail - if (isset($_COOKIE[$this->_csrf_cookie_name]) && - preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) - { - return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; - } - - return $this->_csrf_hash = md5(uniqid(rand(), TRUE)); - } - - return $this->_csrf_hash; - } - -} -// END Security Class - -/* End of file Security.php */ -/* Location: ./system/libraries/Security.php */ diff --git a/sources/web/system/core/URI.php b/sources/web/system/core/URI.php deleted file mode 100755 index a3ae20c..0000000 --- a/sources/web/system/core/URI.php +++ /dev/null @@ -1,654 +0,0 @@ -config =& load_class('Config', 'core'); - log_message('debug', "URI Class Initialized"); - } - - - // -------------------------------------------------------------------- - - /** - * Get the URI String - * - * @access private - * @return string - */ - function _fetch_uri_string() - { - if (strtoupper($this->config->item('uri_protocol')) == 'AUTO') - { - // Is the request coming from the command line? - if (php_sapi_name() == 'cli' or defined('STDIN')) - { - $this->_set_uri_string($this->_parse_cli_args()); - return; - } - - // Let's try the REQUEST_URI first, this will work in most situations - if ($uri = $this->_detect_uri()) - { - $this->_set_uri_string($uri); - return; - } - - // Is there a PATH_INFO variable? - // Note: some servers seem to have trouble with getenv() so we'll test it two ways - $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'); - if (trim($path, '/') != '' && $path != "/".SELF) - { - $this->_set_uri_string($path); - return; - } - - // No PATH_INFO?... What about QUERY_STRING? - $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); - if (trim($path, '/') != '') - { - $this->_set_uri_string($path); - return; - } - - // As a last ditch effort lets try using the $_GET array - if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') - { - $this->_set_uri_string(key($_GET)); - return; - } - - // We've exhausted all our options... - $this->uri_string = ''; - return; - } - - $uri = strtoupper($this->config->item('uri_protocol')); - - if ($uri == 'REQUEST_URI') - { - $this->_set_uri_string($this->_detect_uri()); - return; - } - elseif ($uri == 'CLI') - { - $this->_set_uri_string($this->_parse_cli_args()); - return; - } - - $path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri); - $this->_set_uri_string($path); - } - - // -------------------------------------------------------------------- - - /** - * Set the URI String - * - * @access public - * @param string - * @return string - */ - function _set_uri_string($str) - { - // Filter out control characters - $str = remove_invisible_characters($str, FALSE); - - // If the URI contains only a slash we'll kill it - $this->uri_string = ($str == '/') ? '' : $str; - } - - // -------------------------------------------------------------------- - - /** - * Detects the URI - * - * This function will detect the URI automatically and fix the query string - * if necessary. - * - * @access private - * @return string - */ - private function _detect_uri() - { - if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) - { - return ''; - } - - $uri = $_SERVER['REQUEST_URI']; - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) - { - $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); - } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) - { - $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); - } - - // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct - // URI is found, and also fixes the QUERY_STRING server var and $_GET array. - if (strncmp($uri, '?/', 2) === 0) - { - $uri = substr($uri, 2); - } - $parts = preg_split('#\?#i', $uri, 2); - $uri = $parts[0]; - if (isset($parts[1])) - { - $_SERVER['QUERY_STRING'] = $parts[1]; - parse_str($_SERVER['QUERY_STRING'], $_GET); - } - else - { - $_SERVER['QUERY_STRING'] = ''; - $_GET = array(); - } - - if ($uri == '/' || empty($uri)) - { - return '/'; - } - - $uri = parse_url($uri, PHP_URL_PATH); - - // Do some final cleaning of the URI and return it - return str_replace(array('//', '../'), '/', trim($uri, '/')); - } - - // -------------------------------------------------------------------- - - /** - * Parse cli arguments - * - * Take each command line argument and assume it is a URI segment. - * - * @access private - * @return string - */ - private function _parse_cli_args() - { - $args = array_slice($_SERVER['argv'], 1); - - return $args ? '/' . implode('/', $args) : ''; - } - - // -------------------------------------------------------------------- - - /** - * Filter segments for malicious characters - * - * @access private - * @param string - * @return string - */ - function _filter_uri($str) - { - if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE) - { - // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards - // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern - if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str)) - { - show_error('The URI you submitted has disallowed characters.', 400); - } - } - - // Convert programatic characters to entities - $bad = array('$', '(', ')', '%28', '%29'); - $good = array('$', '(', ')', '(', ')'); - - return str_replace($bad, $good, $str); - } - - // -------------------------------------------------------------------- - - /** - * Remove the suffix from the URL if needed - * - * @access private - * @return void - */ - function _remove_url_suffix() - { - if ($this->config->item('url_suffix') != "") - { - $this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string); - } - } - - // -------------------------------------------------------------------- - - /** - * Explode the URI Segments. The individual segments will - * be stored in the $this->segments array. - * - * @access private - * @return void - */ - function _explode_segments() - { - foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val) - { - // Filter segments for security - $val = trim($this->_filter_uri($val)); - - if ($val != '') - { - $this->segments[] = $val; - } - } - } - - // -------------------------------------------------------------------- - /** - * Re-index Segments - * - * This function re-indexes the $this->segment array so that it - * starts at 1 rather than 0. Doing so makes it simpler to - * use functions like $this->uri->segment(n) since there is - * a 1:1 relationship between the segment array and the actual segments. - * - * @access private - * @return void - */ - function _reindex_segments() - { - array_unshift($this->segments, NULL); - array_unshift($this->rsegments, NULL); - unset($this->segments[0]); - unset($this->rsegments[0]); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a URI Segment - * - * This function returns the URI segment based on the number provided. - * - * @access public - * @param integer - * @param bool - * @return string - */ - function segment($n, $no_result = FALSE) - { - return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n]; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a URI "routed" Segment - * - * This function returns the re-routed URI segment (assuming routing rules are used) - * based on the number provided. If there is no routing this function returns the - * same result as $this->segment() - * - * @access public - * @param integer - * @param bool - * @return string - */ - function rsegment($n, $no_result = FALSE) - { - return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n]; - } - - // -------------------------------------------------------------------- - - /** - * Generate a key value pair from the URI string - * - * This function generates and associative array of URI data starting - * at the supplied segment. For example, if this is your URI: - * - * example.com/user/search/name/joe/location/UK/gender/male - * - * You can use this function to generate an array with this prototype: - * - * array ( - * name => joe - * location => UK - * gender => male - * ) - * - * @access public - * @param integer the starting segment number - * @param array an array of default values - * @return array - */ - function uri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'segment'); - } - /** - * Identical to above only it uses the re-routed segment array - * - * @access public - * @param integer the starting segment number - * @param array an array of default values - * @return array - * - */ - function ruri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Generate a key value pair from the URI string or Re-routed URI string - * - * @access private - * @param integer the starting segment number - * @param array an array of default values - * @param string which array we should use - * @return array - */ - function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') - { - if ($which == 'segment') - { - $total_segments = 'total_segments'; - $segment_array = 'segment_array'; - } - else - { - $total_segments = 'total_rsegments'; - $segment_array = 'rsegment_array'; - } - - if ( ! is_numeric($n)) - { - return $default; - } - - if (isset($this->keyval[$n])) - { - return $this->keyval[$n]; - } - - if ($this->$total_segments() < $n) - { - if (count($default) == 0) - { - return array(); - } - - $retval = array(); - foreach ($default as $val) - { - $retval[$val] = FALSE; - } - return $retval; - } - - $segments = array_slice($this->$segment_array(), ($n - 1)); - - $i = 0; - $lastval = ''; - $retval = array(); - foreach ($segments as $seg) - { - if ($i % 2) - { - $retval[$lastval] = $seg; - } - else - { - $retval[$seg] = FALSE; - $lastval = $seg; - } - - $i++; - } - - if (count($default) > 0) - { - foreach ($default as $val) - { - if ( ! array_key_exists($val, $retval)) - { - $retval[$val] = FALSE; - } - } - } - - // Cache the array for reuse - $this->keyval[$n] = $retval; - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Generate a URI string from an associative array - * - * - * @access public - * @param array an associative array of key/values - * @return array - */ - function assoc_to_uri($array) - { - $temp = array(); - foreach ((array)$array as $key => $val) - { - $temp[] = $key; - $temp[] = $val; - } - - return implode('/', $temp); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a URI Segment and add a trailing slash - * - * @access public - * @param integer - * @param string - * @return string - */ - function slash_segment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'segment'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a URI Segment and add a trailing slash - * - * @access public - * @param integer - * @param string - * @return string - */ - function slash_rsegment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a URI Segment and add a trailing slash - helper function - * - * @access private - * @param integer - * @param string - * @param string - * @return string - */ - function _slash_segment($n, $where = 'trailing', $which = 'segment') - { - $leading = '/'; - $trailing = '/'; - - if ($where == 'trailing') - { - $leading = ''; - } - elseif ($where == 'leading') - { - $trailing = ''; - } - - return $leading.$this->$which($n).$trailing; - } - - // -------------------------------------------------------------------- - - /** - * Segment Array - * - * @access public - * @return array - */ - function segment_array() - { - return $this->segments; - } - - // -------------------------------------------------------------------- - - /** - * Routed Segment Array - * - * @access public - * @return array - */ - function rsegment_array() - { - return $this->rsegments; - } - - // -------------------------------------------------------------------- - - /** - * Total number of segments - * - * @access public - * @return integer - */ - function total_segments() - { - return count($this->segments); - } - - // -------------------------------------------------------------------- - - /** - * Total number of routed segments - * - * @access public - * @return integer - */ - function total_rsegments() - { - return count($this->rsegments); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the entire URI string - * - * @access public - * @return string - */ - function uri_string() - { - return $this->uri_string; - } - - - // -------------------------------------------------------------------- - - /** - * Fetch the entire Re-routed URI string - * - * @access public - * @return string - */ - function ruri_string() - { - return '/'.implode('/', $this->rsegment_array()); - } - -} -// END URI Class - -/* End of file URI.php */ -/* Location: ./system/core/URI.php */ \ No newline at end of file diff --git a/sources/web/system/core/Utf8.php b/sources/web/system/core/Utf8.php deleted file mode 100644 index 2a27d1f..0000000 --- a/sources/web/system/core/Utf8.php +++ /dev/null @@ -1,165 +0,0 @@ -item('charset') == 'UTF-8' // Application charset must be UTF-8 - ) - { - log_message('debug', "UTF-8 Support Enabled"); - - define('UTF8_ENABLED', TRUE); - - // set internal encoding for multibyte string functions if necessary - // and set a flag so we don't have to repeatedly use extension_loaded() - // or function_exists() - if (extension_loaded('mbstring')) - { - define('MB_ENABLED', TRUE); - mb_internal_encoding('UTF-8'); - } - else - { - define('MB_ENABLED', FALSE); - } - } - else - { - log_message('debug', "UTF-8 Support Disabled"); - define('UTF8_ENABLED', FALSE); - } - } - - // -------------------------------------------------------------------- - - /** - * Clean UTF-8 strings - * - * Ensures strings are UTF-8 - * - * @access public - * @param string - * @return string - */ - function clean_string($str) - { - if ($this->_is_ascii($str) === FALSE) - { - $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Remove ASCII control characters - * - * Removes all ASCII control characters except horizontal tabs, - * line feeds, and carriage returns, as all others can cause - * problems in XML - * - * @access public - * @param string - * @return string - */ - function safe_ascii_for_xml($str) - { - return remove_invisible_characters($str, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Convert to UTF-8 - * - * Attempts to convert a string to UTF-8 - * - * @access public - * @param string - * @param string - input encoding - * @return string - */ - function convert_to_utf8($str, $encoding) - { - if (function_exists('iconv')) - { - $str = @iconv($encoding, 'UTF-8', $str); - } - elseif (function_exists('mb_convert_encoding')) - { - $str = @mb_convert_encoding($str, 'UTF-8', $encoding); - } - else - { - return FALSE; - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Is ASCII? - * - * Tests if a string is standard 7-bit ASCII or not - * - * @access public - * @param string - * @return bool - */ - function _is_ascii($str) - { - return (preg_match('/[^\x00-\x7F]/S', $str) == 0); - } - - // -------------------------------------------------------------------- - -} -// End Utf8 Class - -/* End of file Utf8.php */ -/* Location: ./system/core/Utf8.php */ \ No newline at end of file diff --git a/sources/web/system/core/index.html b/sources/web/system/core/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/core/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/DB.php b/sources/web/system/database/DB.php deleted file mode 100755 index 8314d3b..0000000 --- a/sources/web/system/database/DB.php +++ /dev/null @@ -1,162 +0,0 @@ - $dns['scheme'], - 'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '', - 'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '', - 'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '', - 'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : '' - ); - - // were additional config items set? - if (isset($dns['query'])) - { - parse_str($dns['query'], $extra); - - foreach ($extra as $key => $val) - { - // booleans please - if (strtoupper($val) == "TRUE") - { - $val = TRUE; - } - elseif (strtoupper($val) == "FALSE") - { - $val = FALSE; - } - - $params[$key] = $val; - } - } - } - - // No DB specified yet? Beat them senseless... - if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '') - { - show_error('You have not selected a database type to connect to.'); - } - - // Load the DB classes. Note: Since the active record class is optional - // we need to dynamically create a class that extends proper parent class - // based on whether we're using the active record class or not. - // Kudos to Paul for discovering this clever use of eval() - - if ($active_record_override !== NULL) - { - $active_record = $active_record_override; - } - - require_once(BASEPATH.'database/DB_driver.php'); - - if ( ! isset($active_record) OR $active_record == TRUE) - { - require_once(BASEPATH.'database/DB_active_rec.php'); - - if ( ! class_exists('CI_DB')) - { - eval('class CI_DB extends CI_DB_active_record { }'); - } - } - else - { - if ( ! class_exists('CI_DB')) - { - eval('class CI_DB extends CI_DB_driver { }'); - } - } - - require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'); - - // Instantiate the DB adapter - $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; - $DB = new $driver($params); - - if ($DB->autoinit == TRUE) - { - $DB->initialize(); - } - - if (isset($params['stricton']) && $params['stricton'] == TRUE) - { - $DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); - } - - return $DB; -} - - - -/* End of file DB.php */ -/* Location: ./system/database/DB.php */ \ No newline at end of file diff --git a/sources/web/system/database/DB_active_rec.php b/sources/web/system/database/DB_active_rec.php deleted file mode 100644 index 10febb1..0000000 --- a/sources/web/system/database/DB_active_rec.php +++ /dev/null @@ -1,2045 +0,0 @@ -ar_select[] = $val; - $this->ar_no_escape[] = $escape; - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_select[] = $val; - $this->ar_cache_exists[] = 'select'; - $this->ar_cache_no_escape[] = $escape; - } - } - } - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Select Max - * - * Generates a SELECT MAX(field) portion of a query - * - * @param string the field - * @param string an alias - * @return object - */ - public function select_max($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MAX'); - } - - // -------------------------------------------------------------------- - - /** - * Select Min - * - * Generates a SELECT MIN(field) portion of a query - * - * @param string the field - * @param string an alias - * @return object - */ - public function select_min($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MIN'); - } - - // -------------------------------------------------------------------- - - /** - * Select Average - * - * Generates a SELECT AVG(field) portion of a query - * - * @param string the field - * @param string an alias - * @return object - */ - public function select_avg($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'AVG'); - } - - // -------------------------------------------------------------------- - - /** - * Select Sum - * - * Generates a SELECT SUM(field) portion of a query - * - * @param string the field - * @param string an alias - * @return object - */ - public function select_sum($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'SUM'); - } - - // -------------------------------------------------------------------- - - /** - * Processing Function for the four functions above: - * - * select_max() - * select_min() - * select_avg() - * select_sum() - * - * @param string the field - * @param string an alias - * @return object - */ - protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') - { - if ( ! is_string($select) OR $select == '') - { - $this->display_error('db_invalid_query'); - } - - $type = strtoupper($type); - - if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) - { - show_error('Invalid function type: '.$type); - } - - if ($alias == '') - { - $alias = $this->_create_alias_from_table(trim($select)); - } - - $sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias; - - $this->ar_select[] = $sql; - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_select[] = $sql; - $this->ar_cache_exists[] = 'select'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Determines the alias name based on the table - * - * @param string - * @return string - */ - protected function _create_alias_from_table($item) - { - if (strpos($item, '.') !== FALSE) - { - return end(explode('.', $item)); - } - - return $item; - } - - // -------------------------------------------------------------------- - - /** - * DISTINCT - * - * Sets a flag which tells the query string compiler to add DISTINCT - * - * @param bool - * @return object - */ - public function distinct($val = TRUE) - { - $this->ar_distinct = (is_bool($val)) ? $val : TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * From - * - * Generates the FROM portion of the query - * - * @param mixed can be a string or array - * @return object - */ - public function from($from) - { - foreach ((array) $from as $val) - { - if (strpos($val, ',') !== FALSE) - { - foreach (explode(',', $val) as $v) - { - $v = trim($v); - $this->_track_aliases($v); - - $this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); - $this->ar_cache_exists[] = 'from'; - } - } - - } - else - { - $val = trim($val); - - // Extract any aliases that might exist. We use this information - // in the _protect_identifiers to know whether to add a table prefix - $this->_track_aliases($val); - - $this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); - $this->ar_cache_exists[] = 'from'; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Join - * - * Generates the JOIN portion of the query - * - * @param string - * @param string the join condition - * @param string the type of join - * @return object - */ - public function join($table, $cond, $type = '') - { - if ($type != '') - { - $type = strtoupper(trim($type)); - - if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'))) - { - $type = ''; - } - else - { - $type .= ' '; - } - } - - // Extract any aliases that might exist. We use this information - // in the _protect_identifiers to know whether to add a table prefix - $this->_track_aliases($table); - - // Strip apart the condition and protect the identifiers - if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match)) - { - $match[1] = $this->_protect_identifiers($match[1]); - $match[3] = $this->_protect_identifiers($match[3]); - - $cond = $match[1].$match[2].$match[3]; - } - - // Assemble the JOIN statement - $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; - - $this->ar_join[] = $join; - if ($this->ar_caching === TRUE) - { - $this->ar_cache_join[] = $join; - $this->ar_cache_exists[] = 'join'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Where - * - * Generates the WHERE portion of the query. Separates - * multiple calls with AND - * - * @param mixed - * @param mixed - * @return object - */ - public function where($key, $value = NULL, $escape = TRUE) - { - return $this->_where($key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR Where - * - * Generates the WHERE portion of the query. Separates - * multiple calls with OR - * - * @param mixed - * @param mixed - * @return object - */ - public function or_where($key, $value = NULL, $escape = TRUE) - { - return $this->_where($key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Where - * - * Called by where() or or_where() - * - * @param mixed - * @param mixed - * @param string - * @return object - */ - protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) - { - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - // If the escape value was not set will will base it on the global setting - if ( ! is_bool($escape)) - { - $escape = $this->_protect_identifiers; - } - - foreach ($key as $k => $v) - { - $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type; - - if (is_null($v) && ! $this->_has_operator($k)) - { - // value appears not to have been set, assign the test to IS NULL - $k .= ' IS NULL'; - } - - if ( ! is_null($v)) - { - if ($escape === TRUE) - { - $k = $this->_protect_identifiers($k, FALSE, $escape); - - $v = ' '.$this->escape($v); - } - - if ( ! $this->_has_operator($k)) - { - $k .= ' = '; - } - } - else - { - $k = $this->_protect_identifiers($k, FALSE, $escape); - } - - $this->ar_where[] = $prefix.$k.$v; - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_where[] = $prefix.$k.$v; - $this->ar_cache_exists[] = 'where'; - } - - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Where_in - * - * Generates a WHERE field IN ('item', 'item') SQL query joined with - * AND if appropriate - * - * @param string The field to search - * @param array The values searched on - * @return object - */ - public function where_in($key = NULL, $values = NULL) - { - return $this->_where_in($key, $values); - } - - // -------------------------------------------------------------------- - - /** - * Where_in_or - * - * Generates a WHERE field IN ('item', 'item') SQL query joined with - * OR if appropriate - * - * @param string The field to search - * @param array The values searched on - * @return object - */ - public function or_where_in($key = NULL, $values = NULL) - { - return $this->_where_in($key, $values, FALSE, 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Where_not_in - * - * Generates a WHERE field NOT IN ('item', 'item') SQL query joined - * with AND if appropriate - * - * @param string The field to search - * @param array The values searched on - * @return object - */ - public function where_not_in($key = NULL, $values = NULL) - { - return $this->_where_in($key, $values, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Where_not_in_or - * - * Generates a WHERE field NOT IN ('item', 'item') SQL query joined - * with OR if appropriate - * - * @param string The field to search - * @param array The values searched on - * @return object - */ - public function or_where_not_in($key = NULL, $values = NULL) - { - return $this->_where_in($key, $values, TRUE, 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Where_in - * - * Called by where_in, where_in_or, where_not_in, where_not_in_or - * - * @param string The field to search - * @param array The values searched on - * @param boolean If the statement would be IN or NOT IN - * @param string - * @return object - */ - protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ') - { - if ($key === NULL OR $values === NULL) - { - return; - } - - if ( ! is_array($values)) - { - $values = array($values); - } - - $not = ($not) ? ' NOT' : ''; - - foreach ($values as $value) - { - $this->ar_wherein[] = $this->escape($value); - } - - $prefix = (count($this->ar_where) == 0) ? '' : $type; - - $where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") "; - - $this->ar_where[] = $where_in; - if ($this->ar_caching === TRUE) - { - $this->ar_cache_where[] = $where_in; - $this->ar_cache_exists[] = 'where'; - } - - // reset the array for multiple calls - $this->ar_wherein = array(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Like - * - * Generates a %LIKE% portion of the query. Separates - * multiple calls with AND - * - * @param mixed - * @param mixed - * @return object - */ - public function like($field, $match = '', $side = 'both') - { - return $this->_like($field, $match, 'AND ', $side); - } - - // -------------------------------------------------------------------- - - /** - * Not Like - * - * Generates a NOT LIKE portion of the query. Separates - * multiple calls with AND - * - * @param mixed - * @param mixed - * @return object - */ - public function not_like($field, $match = '', $side = 'both') - { - return $this->_like($field, $match, 'AND ', $side, 'NOT'); - } - - // -------------------------------------------------------------------- - - /** - * OR Like - * - * Generates a %LIKE% portion of the query. Separates - * multiple calls with OR - * - * @param mixed - * @param mixed - * @return object - */ - public function or_like($field, $match = '', $side = 'both') - { - return $this->_like($field, $match, 'OR ', $side); - } - - // -------------------------------------------------------------------- - - /** - * OR Not Like - * - * Generates a NOT LIKE portion of the query. Separates - * multiple calls with OR - * - * @param mixed - * @param mixed - * @return object - */ - public function or_not_like($field, $match = '', $side = 'both') - { - return $this->_like($field, $match, 'OR ', $side, 'NOT'); - } - - // -------------------------------------------------------------------- - - /** - * Like - * - * Called by like() or orlike() - * - * @param mixed - * @param mixed - * @param string - * @return object - */ - protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '') - { - if ( ! is_array($field)) - { - $field = array($field => $match); - } - - foreach ($field as $k => $v) - { - $k = $this->_protect_identifiers($k); - - $prefix = (count($this->ar_like) == 0) ? '' : $type; - - $v = $this->escape_like_str($v); - - if ($side == 'none') - { - $like_statement = $prefix." $k $not LIKE '{$v}'"; - } - elseif ($side == 'before') - { - $like_statement = $prefix." $k $not LIKE '%{$v}'"; - } - elseif ($side == 'after') - { - $like_statement = $prefix." $k $not LIKE '{$v}%'"; - } - else - { - $like_statement = $prefix." $k $not LIKE '%{$v}%'"; - } - - // some platforms require an escape sequence definition for LIKE wildcards - if ($this->_like_escape_str != '') - { - $like_statement = $like_statement.sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - $this->ar_like[] = $like_statement; - if ($this->ar_caching === TRUE) - { - $this->ar_cache_like[] = $like_statement; - $this->ar_cache_exists[] = 'like'; - } - - } - return $this; - } - - // -------------------------------------------------------------------- - - /** - * GROUP BY - * - * @param string - * @return object - */ - public function group_by($by) - { - if (is_string($by)) - { - $by = explode(',', $by); - } - - foreach ($by as $val) - { - $val = trim($val); - - if ($val != '') - { - $this->ar_groupby[] = $this->_protect_identifiers($val); - - if ($this->ar_caching === TRUE) - { - $this->ar_cache_groupby[] = $this->_protect_identifiers($val); - $this->ar_cache_exists[] = 'groupby'; - } - } - } - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the HAVING value - * - * Separates multiple calls with AND - * - * @param string - * @param string - * @return object - */ - public function having($key, $value = '', $escape = TRUE) - { - return $this->_having($key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Sets the OR HAVING value - * - * Separates multiple calls with OR - * - * @param string - * @param string - * @return object - */ - public function or_having($key, $value = '', $escape = TRUE) - { - return $this->_having($key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Sets the HAVING values - * - * Called by having() or or_having() - * - * @param string - * @param string - * @return object - */ - protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) - { - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - foreach ($key as $k => $v) - { - $prefix = (count($this->ar_having) == 0) ? '' : $type; - - if ($escape === TRUE) - { - $k = $this->_protect_identifiers($k); - } - - if ( ! $this->_has_operator($k)) - { - $k .= ' = '; - } - - if ($v != '') - { - $v = ' '.$this->escape($v); - } - - $this->ar_having[] = $prefix.$k.$v; - if ($this->ar_caching === TRUE) - { - $this->ar_cache_having[] = $prefix.$k.$v; - $this->ar_cache_exists[] = 'having'; - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the ORDER BY value - * - * @param string - * @param string direction: asc or desc - * @return object - */ - public function order_by($orderby, $direction = '') - { - if (strtolower($direction) == 'random') - { - $orderby = ''; // Random results want or don't need a field name - $direction = $this->_random_keyword; - } - elseif (trim($direction) != '') - { - $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC'; - } - - - if (strpos($orderby, ',') !== FALSE) - { - $temp = array(); - foreach (explode(',', $orderby) as $part) - { - $part = trim($part); - if ( ! in_array($part, $this->ar_aliased_tables)) - { - $part = $this->_protect_identifiers(trim($part)); - } - - $temp[] = $part; - } - - $orderby = implode(', ', $temp); - } - else if ($direction != $this->_random_keyword) - { - $orderby = $this->_protect_identifiers($orderby); - } - - $orderby_statement = $orderby.$direction; - - $this->ar_orderby[] = $orderby_statement; - if ($this->ar_caching === TRUE) - { - $this->ar_cache_orderby[] = $orderby_statement; - $this->ar_cache_exists[] = 'orderby'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the LIMIT value - * - * @param integer the limit value - * @param integer the offset value - * @return object - */ - public function limit($value, $offset = '') - { - $this->ar_limit = (int) $value; - - if ($offset != '') - { - $this->ar_offset = (int) $offset; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the OFFSET value - * - * @param integer the offset value - * @return object - */ - public function offset($offset) - { - $this->ar_offset = $offset; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * The "set" function. Allows key/value pairs to be set for inserting or updating - * - * @param mixed - * @param string - * @param boolean - * @return object - */ - public function set($key, $value = '', $escape = TRUE) - { - $key = $this->_object_to_array($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - foreach ($key as $k => $v) - { - if ($escape === FALSE) - { - $this->ar_set[$this->_protect_identifiers($k)] = $v; - } - else - { - $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get - * - * Compiles the select statement based on the other functions called - * and runs the query - * - * @param string the table - * @param string the limit clause - * @param string the offset clause - * @return object - */ - public function get($table = '', $limit = null, $offset = null) - { - if ($table != '') - { - $this->_track_aliases($table); - $this->from($table); - } - - if ( ! is_null($limit)) - { - $this->limit($limit, $offset); - } - - $sql = $this->_compile_select(); - - $result = $this->query($sql); - $this->_reset_select(); - return $result; - } - - /** - * "Count All Results" query - * - * Generates a platform-specific query string that counts all records - * returned by an Active Record query. - * - * @param string - * @return string - */ - public function count_all_results($table = '') - { - if ($table != '') - { - $this->_track_aliases($table); - $this->from($table); - } - - $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows')); - - $query = $this->query($sql); - $this->_reset_select(); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Get_Where - * - * Allows the where clause, limit and offset to be added directly - * - * @param string the where clause - * @param string the limit clause - * @param string the offset clause - * @return object - */ - public function get_where($table = '', $where = null, $limit = null, $offset = null) - { - if ($table != '') - { - $this->from($table); - } - - if ( ! is_null($where)) - { - $this->where($where); - } - - if ( ! is_null($limit)) - { - $this->limit($limit, $offset); - } - - $sql = $this->_compile_select(); - - $result = $this->query($sql); - $this->_reset_select(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Insert_Batch - * - * Compiles batch insert strings and runs the queries - * - * @param string the table to retrieve the results from - * @param array an associative array of insert values - * @return object - */ - public function insert_batch($table = '', $set = NULL) - { - if ( ! is_null($set)) - { - $this->set_insert_batch($set); - } - - if (count($this->ar_set) == 0) - { - if ($this->db_debug) - { - //No valid data array. Folds in cases where keys and values did not match up - return $this->display_error('db_must_use_set'); - } - return FALSE; - } - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - - // Batch this baby - for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) - { - - $sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100)); - - //echo $sql; - - $this->query($sql); - } - - $this->_reset_write(); - - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts - * - * @param mixed - * @param string - * @param boolean - * @return object - */ - public function set_insert_batch($key, $value = '', $escape = TRUE) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - $keys = array_keys(current($key)); - sort($keys); - - foreach ($key as $row) - { - if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) - { - // batch function above returns an error on an empty array - $this->ar_set[] = array(); - return; - } - - ksort($row); // puts $row in the same order as our keys - - if ($escape === FALSE) - { - $this->ar_set[] = '('.implode(',', $row).')'; - } - else - { - $clean = array(); - - foreach ($row as $value) - { - $clean[] = $this->escape($value); - } - - $this->ar_set[] = '('.implode(',', $clean).')'; - } - } - - foreach ($keys as $k) - { - $this->ar_keys[] = $this->_protect_identifiers($k); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Insert - * - * Compiles an insert string and runs the query - * - * @param string the table to insert data into - * @param array an associative array of insert values - * @return object - */ - function insert($table = '', $set = NULL) - { - if ( ! is_null($set)) - { - $this->set($set); - } - - if (count($this->ar_set) == 0) - { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; - } - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - - $sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query - * - * @param string the table to replace data into - * @param array an associative array of insert values - * @return object - */ - public function replace($table = '', $set = NULL) - { - if ( ! is_null($set)) - { - $this->set($set); - } - - if (count($this->ar_set) == 0) - { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; - } - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - - $sql = $this->_replace($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Update - * - * Compiles an update string and runs the query - * - * @param string the table to retrieve the results from - * @param array an associative array of update values - * @param mixed the where clause - * @return object - */ - public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ( ! is_null($set)) - { - $this->set($set); - } - - if (count($this->ar_set) == 0) - { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - return FALSE; - } - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - - if ($where != NULL) - { - $this->where($where); - } - - if ($limit != NULL) - { - $this->limit($limit); - } - - $sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); - - $this->_reset_write(); - return $this->query($sql); - } - - - // -------------------------------------------------------------------- - - /** - * Update_Batch - * - * Compiles an update string and runs the query - * - * @param string the table to retrieve the results from - * @param array an associative array of update values - * @param string the where key - * @return object - */ - public function update_batch($table = '', $set = NULL, $index = NULL) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if (is_null($index)) - { - if ($this->db_debug) - { - return $this->display_error('db_must_use_index'); - } - - return FALSE; - } - - if ( ! is_null($set)) - { - $this->set_update_batch($set, $index); - } - - if (count($this->ar_set) == 0) - { - if ($this->db_debug) - { - return $this->display_error('db_must_use_set'); - } - - return FALSE; - } - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - - // Batch this baby - for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) - { - $sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where); - - $this->query($sql); - } - - $this->_reset_write(); - } - - // -------------------------------------------------------------------- - - /** - * The "set_update_batch" function. Allows key/value pairs to be set for batch updating - * - * @param array - * @param string - * @param boolean - * @return object - */ - public function set_update_batch($key, $index = '', $escape = TRUE) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - // @todo error - } - - foreach ($key as $k => $v) - { - $index_set = FALSE; - $clean = array(); - - foreach ($v as $k2 => $v2) - { - if ($k2 == $index) - { - $index_set = TRUE; - } - else - { - $not[] = $k.'-'.$v; - } - - if ($escape === FALSE) - { - $clean[$this->_protect_identifiers($k2)] = $v2; - } - else - { - $clean[$this->_protect_identifiers($k2)] = $this->escape($v2); - } - } - - if ($index_set == FALSE) - { - return $this->display_error('db_batch_missing_index'); - } - - $this->ar_set[] = $clean; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Empty Table - * - * Compiles a delete string and runs "DELETE FROM table" - * - * @param string the table to empty - * @return object - */ - public function empty_table($table = '') - { - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - else - { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_delete($table); - - $this->_reset_write(); - - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Truncate - * - * Compiles a truncate string and runs the query - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @param string the table to truncate - * @return object - */ - public function truncate($table = '') - { - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - else - { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_truncate($table); - - $this->_reset_write(); - - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Delete - * - * Compiles a delete string and runs the query - * - * @param mixed the table(s) to delete from. String or array - * @param mixed the where clause - * @param mixed the limit clause - * @param boolean - * @return object - */ - public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($table == '') - { - if ( ! isset($this->ar_from[0])) - { - if ($this->db_debug) - { - return $this->display_error('db_must_set_table'); - } - return FALSE; - } - - $table = $this->ar_from[0]; - } - elseif (is_array($table)) - { - foreach ($table as $single_table) - { - $this->delete($single_table, $where, $limit, FALSE); - } - - $this->_reset_write(); - return; - } - else - { - $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - if ($where != '') - { - $this->where($where); - } - - if ($limit != NULL) - { - $this->limit($limit); - } - - if (count($this->ar_where) == 0 && count($this->ar_wherein) == 0 && count($this->ar_like) == 0) - { - if ($this->db_debug) - { - return $this->display_error('db_del_must_use_where'); - } - - return FALSE; - } - - $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit); - - if ($reset_data) - { - $this->_reset_write(); - } - - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * DB Prefix - * - * Prepends a database prefix if one exists in configuration - * - * @param string the table - * @return string - */ - public function dbprefix($table = '') - { - if ($table == '') - { - $this->display_error('db_table_name_required'); - } - - return $this->dbprefix.$table; - } - - // -------------------------------------------------------------------- - - /** - * Set DB Prefix - * - * Set's the DB Prefix to something new without needing to reconnect - * - * @param string the prefix - * @return string - */ - public function set_dbprefix($prefix = '') - { - return $this->dbprefix = $prefix; - } - - // -------------------------------------------------------------------- - - /** - * Track Aliases - * - * Used to track SQL statements written with aliased tables. - * - * @param string The table to inspect - * @return string - */ - protected function _track_aliases($table) - { - if (is_array($table)) - { - foreach ($table as $t) - { - $this->_track_aliases($t); - } - return; - } - - // Does the string contain a comma? If so, we need to separate - // the string into discreet statements - if (strpos($table, ',') !== FALSE) - { - return $this->_track_aliases(explode(',', $table)); - } - - // if a table alias is used we can recognize it by a space - if (strpos($table, " ") !== FALSE) - { - // if the alias is written with the AS keyword, remove it - $table = preg_replace('/\s+AS\s+/i', ' ', $table); - - // Grab the alias - $table = trim(strrchr($table, " ")); - - // Store the alias, if it doesn't already exist - if ( ! in_array($table, $this->ar_aliased_tables)) - { - $this->ar_aliased_tables[] = $table; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Compile the SELECT statement - * - * Generates a query string based on which functions were used. - * Should not be called directly. The get() function calls it. - * - * @return string - */ - protected function _compile_select($select_override = FALSE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - // ---------------------------------------------------------------- - - // Write the "select" portion of the query - - if ($select_override !== FALSE) - { - $sql = $select_override; - } - else - { - $sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; - - if (count($this->ar_select) == 0) - { - $sql .= '*'; - } - else - { - // Cycle through the "select" portion of the query and prep each column name. - // The reason we protect identifiers here rather then in the select() function - // is because until the user calls the from() function we don't know if there are aliases - foreach ($this->ar_select as $key => $val) - { - $no_escape = isset($this->ar_no_escape[$key]) ? $this->ar_no_escape[$key] : NULL; - $this->ar_select[$key] = $this->_protect_identifiers($val, FALSE, $no_escape); - } - - $sql .= implode(', ', $this->ar_select); - } - } - - // ---------------------------------------------------------------- - - // Write the "FROM" portion of the query - - if (count($this->ar_from) > 0) - { - $sql .= "\nFROM "; - - $sql .= $this->_from_tables($this->ar_from); - } - - // ---------------------------------------------------------------- - - // Write the "JOIN" portion of the query - - if (count($this->ar_join) > 0) - { - $sql .= "\n"; - - $sql .= implode("\n", $this->ar_join); - } - - // ---------------------------------------------------------------- - - // Write the "WHERE" portion of the query - - if (count($this->ar_where) > 0 OR count($this->ar_like) > 0) - { - $sql .= "\nWHERE "; - } - - $sql .= implode("\n", $this->ar_where); - - // ---------------------------------------------------------------- - - // Write the "LIKE" portion of the query - - if (count($this->ar_like) > 0) - { - if (count($this->ar_where) > 0) - { - $sql .= "\nAND "; - } - - $sql .= implode("\n", $this->ar_like); - } - - // ---------------------------------------------------------------- - - // Write the "GROUP BY" portion of the query - - if (count($this->ar_groupby) > 0) - { - $sql .= "\nGROUP BY "; - - $sql .= implode(', ', $this->ar_groupby); - } - - // ---------------------------------------------------------------- - - // Write the "HAVING" portion of the query - - if (count($this->ar_having) > 0) - { - $sql .= "\nHAVING "; - $sql .= implode("\n", $this->ar_having); - } - - // ---------------------------------------------------------------- - - // Write the "ORDER BY" portion of the query - - if (count($this->ar_orderby) > 0) - { - $sql .= "\nORDER BY "; - $sql .= implode(', ', $this->ar_orderby); - - if ($this->ar_order !== FALSE) - { - $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC'; - } - } - - // ---------------------------------------------------------------- - - // Write the "LIMIT" portion of the query - - if (is_numeric($this->ar_limit)) - { - $sql .= "\n"; - $sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - public function _object_to_array($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - foreach (get_object_vars($object) as $key => $val) - { - // There are some built in keys we need to ignore for this conversion - if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name') - { - $array[$key] = $val; - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - public function _object_to_array_batch($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - $out = get_object_vars($object); - $fields = array_keys($out); - - foreach ($fields as $val) - { - // There are some built in keys we need to ignore for this conversion - if ($val != '_parent_name') - { - - $i = 0; - foreach ($out[$val] as $data) - { - $array[$i][$val] = $data; - $i++; - } - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Start Cache - * - * Starts AR caching - * - * @return void - */ - public function start_cache() - { - $this->ar_caching = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Stop Cache - * - * Stops AR caching - * - * @return void - */ - public function stop_cache() - { - $this->ar_caching = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Flush Cache - * - * Empties the AR cache - * - * @access public - * @return void - */ - public function flush_cache() - { - $this->_reset_run(array( - 'ar_cache_select' => array(), - 'ar_cache_from' => array(), - 'ar_cache_join' => array(), - 'ar_cache_where' => array(), - 'ar_cache_like' => array(), - 'ar_cache_groupby' => array(), - 'ar_cache_having' => array(), - 'ar_cache_orderby' => array(), - 'ar_cache_set' => array(), - 'ar_cache_exists' => array(), - 'ar_cache_no_escape' => array() - )); - } - - // -------------------------------------------------------------------- - - /** - * Merge Cache - * - * When called, this function merges any cached AR arrays with - * locally called ones. - * - * @return void - */ - protected function _merge_cache() - { - if (count($this->ar_cache_exists) == 0) - { - return; - } - - foreach ($this->ar_cache_exists as $val) - { - $ar_variable = 'ar_'.$val; - $ar_cache_var = 'ar_cache_'.$val; - - if (count($this->$ar_cache_var) == 0) - { - continue; - } - - $this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable)); - } - - // If we are "protecting identifiers" we need to examine the "from" - // portion of the query to determine if there are any aliases - if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0) - { - $this->_track_aliases($this->ar_from); - } - - $this->ar_no_escape = $this->ar_cache_no_escape; - } - - // -------------------------------------------------------------------- - - /** - * Resets the active record values. Called by the get() function - * - * @param array An array of fields to reset - * @return void - */ - protected function _reset_run($ar_reset_items) - { - foreach ($ar_reset_items as $item => $default_value) - { - if ( ! in_array($item, $this->ar_store_array)) - { - $this->$item = $default_value; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Resets the active record values. Called by the get() function - * - * @return void - */ - protected function _reset_select() - { - $ar_reset_items = array( - 'ar_select' => array(), - 'ar_from' => array(), - 'ar_join' => array(), - 'ar_where' => array(), - 'ar_like' => array(), - 'ar_groupby' => array(), - 'ar_having' => array(), - 'ar_orderby' => array(), - 'ar_wherein' => array(), - 'ar_aliased_tables' => array(), - 'ar_no_escape' => array(), - 'ar_distinct' => FALSE, - 'ar_limit' => FALSE, - 'ar_offset' => FALSE, - 'ar_order' => FALSE, - ); - - $this->_reset_run($ar_reset_items); - } - - // -------------------------------------------------------------------- - - /** - * Resets the active record "write" values. - * - * Called by the insert() update() insert_batch() update_batch() and delete() functions - * - * @return void - */ - protected function _reset_write() - { - $ar_reset_items = array( - 'ar_set' => array(), - 'ar_from' => array(), - 'ar_where' => array(), - 'ar_like' => array(), - 'ar_orderby' => array(), - 'ar_keys' => array(), - 'ar_limit' => FALSE, - 'ar_order' => FALSE - ); - - $this->_reset_run($ar_reset_items); - } -} - -/* End of file DB_active_rec.php */ -/* Location: ./system/database/DB_active_rec.php */ \ No newline at end of file diff --git a/sources/web/system/database/DB_cache.php b/sources/web/system/database/DB_cache.php deleted file mode 100644 index ad1c28d..0000000 --- a/sources/web/system/database/DB_cache.php +++ /dev/null @@ -1,195 +0,0 @@ -CI - // and load the file helper since we use it a lot - $this->CI =& get_instance(); - $this->db =& $db; - $this->CI->load->helper('file'); - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @access public - * @param string the path to the cache directory - * @return bool - */ - function check_path($path = '') - { - if ($path == '') - { - if ($this->db->cachedir == '') - { - return $this->db->cache_off(); - } - - $path = $this->db->cachedir; - } - - // Add a trailing slash to the path if needed - $path = preg_replace("/(.+?)\/*$/", "\\1/", $path); - - if ( ! is_dir($path) OR ! is_really_writable($path)) - { - // If the path is wrong we'll turn off caching - return $this->db->cache_off(); - } - - $this->db->cachedir = $path; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Retrieve a cached query - * - * The URI being requested will become the name of the cache sub-folder. - * An MD5 hash of the SQL statement will become the cache file name - * - * @access public - * @return string - */ - function read($sql) - { - if ( ! $this->check_path()) - { - return $this->db->cache_off(); - } - - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - - $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); - - if (FALSE === ($cachedata = read_file($filepath))) - { - return FALSE; - } - - return unserialize($cachedata); - } - - // -------------------------------------------------------------------- - - /** - * Write a query to a cache file - * - * @access public - * @return bool - */ - function write($sql, $object) - { - if ( ! $this->check_path()) - { - return $this->db->cache_off(); - } - - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - - $filename = md5($sql); - - if ( ! @is_dir($dir_path)) - { - if ( ! @mkdir($dir_path, DIR_WRITE_MODE)) - { - return FALSE; - } - - @chmod($dir_path, DIR_WRITE_MODE); - } - - if (write_file($dir_path.$filename, serialize($object)) === FALSE) - { - return FALSE; - } - - @chmod($dir_path.$filename, FILE_WRITE_MODE); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Delete cache files within a particular directory - * - * @access public - * @return bool - */ - function delete($segment_one = '', $segment_two = '') - { - if ($segment_one == '') - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - } - - if ($segment_two == '') - { - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - } - - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - - delete_files($dir_path, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Delete all existing cache files - * - * @access public - * @return bool - */ - function delete_all() - { - delete_files($this->db->cachedir, TRUE); - } - -} - - -/* End of file DB_cache.php */ -/* Location: ./system/database/DB_cache.php */ \ No newline at end of file diff --git a/sources/web/system/database/DB_driver.php b/sources/web/system/database/DB_driver.php deleted file mode 100644 index 775fd33..0000000 --- a/sources/web/system/database/DB_driver.php +++ /dev/null @@ -1,1410 +0,0 @@ - $val) - { - $this->$key = $val; - } - } - - log_message('debug', 'Database Driver Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Initialize Database Settings - * - * @access private Called by the constructor - * @param mixed - * @return void - */ - function initialize() - { - // If an existing connection resource is available - // there is no need to connect and select the database - if (is_resource($this->conn_id) OR is_object($this->conn_id)) - { - return TRUE; - } - - // ---------------------------------------------------------------- - - // Connect to the database and set the connection ID - $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); - - // No connection resource? Throw an error - if ( ! $this->conn_id) - { - log_message('error', 'Unable to connect to the database'); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_connect'); - } - return FALSE; - } - - // ---------------------------------------------------------------- - - // Select the DB... assuming a database name is specified in the config file - if ($this->database != '') - { - if ( ! $this->db_select()) - { - log_message('error', 'Unable to select database: '.$this->database); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_select', $this->database); - } - return FALSE; - } - else - { - // We've selected the DB. Now we set the character set - if ( ! $this->db_set_charset($this->char_set, $this->dbcollat)) - { - return FALSE; - } - - return TRUE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat)) - { - log_message('error', 'Unable to set database connection charset: '.$this->char_set); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_set_charset', $this->char_set); - } - - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * The name of the platform in use (mysql, mssql, etc...) - * - * @access public - * @return string - */ - function platform() - { - return $this->dbdriver; - } - - // -------------------------------------------------------------------- - - /** - * Database Version Number. Returns a string containing the - * version of the database being used - * - * @access public - * @return string - */ - function version() - { - if (FALSE === ($sql = $this->_version())) - { - if ($this->db_debug) - { - return $this->display_error('db_unsupported_function'); - } - return FALSE; - } - - // Some DBs have functions that return the version, and don't run special - // SQL queries per se. In these instances, just return the result. - $driver_version_exceptions = array('oci8', 'sqlite', 'cubrid'); - - if (in_array($this->dbdriver, $driver_version_exceptions)) - { - return $sql; - } - else - { - $query = $this->query($sql); - return $query->row('ver'); - } - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * Accepts an SQL string as input and returns a result object upon - * successful execution of a "read" type query. Returns boolean TRUE - * upon successful execution of a "write" type query. Returns boolean - * FALSE upon failure, and if the $db_debug variable is set to TRUE - * will raise an error. - * - * @access public - * @param string An SQL query string - * @param array An array of binding data - * @return mixed - */ - function query($sql, $binds = FALSE, $return_object = TRUE) - { - if ($sql == '') - { - if ($this->db_debug) - { - log_message('error', 'Invalid query: '.$sql); - return $this->display_error('db_invalid_query'); - } - return FALSE; - } - - // Verify table prefix and replace if necessary - if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) ) - { - $sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql); - } - - // Compile binds if needed - if ($binds !== FALSE) - { - $sql = $this->compile_binds($sql, $binds); - } - - // Is query caching enabled? If the query is a "read type" - // we will load the caching class and return the previously - // cached query if it exists - if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')) - { - if ($this->_cache_init()) - { - $this->load_rdriver(); - if (FALSE !== ($cache = $this->CACHE->read($sql))) - { - return $cache; - } - } - } - - // Save the query for debugging - if ($this->save_queries == TRUE) - { - $this->queries[] = $sql; - } - - // Start the Query Timer - $time_start = list($sm, $ss) = explode(' ', microtime()); - - // Run the Query - if (FALSE === ($this->result_id = $this->simple_query($sql))) - { - if ($this->save_queries == TRUE) - { - $this->query_times[] = 0; - } - - // This will trigger a rollback if transactions are being used - $this->_trans_status = FALSE; - - if ($this->db_debug) - { - // grab the error number and message now, as we might run some - // additional queries before displaying the error - $error_no = $this->_error_number(); - $error_msg = $this->_error_message(); - - // We call this function in order to roll-back queries - // if transactions are enabled. If we don't call this here - // the error message will trigger an exit, causing the - // transactions to remain in limbo. - $this->trans_complete(); - - // Log and display errors - log_message('error', 'Query error: '.$error_msg); - return $this->display_error( - array( - 'Error Number: '.$error_no, - $error_msg, - $sql - ) - ); - } - - return FALSE; - } - - // Stop and aggregate the query time results - $time_end = list($em, $es) = explode(' ', microtime()); - $this->benchmark += ($em + $es) - ($sm + $ss); - - if ($this->save_queries == TRUE) - { - $this->query_times[] = ($em + $es) - ($sm + $ss); - } - - // Increment the query counter - $this->query_count++; - - // Was the query a "write" type? - // If so we'll simply return true - if ($this->is_write_type($sql) === TRUE) - { - // If caching is enabled we'll auto-cleanup any - // existing files related to this particular URI - if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init()) - { - $this->CACHE->delete(); - } - - return TRUE; - } - - // Return TRUE if we don't need to create a result object - // Currently only the Oracle driver uses this when stored - // procedures are used - if ($return_object !== TRUE) - { - return TRUE; - } - - // Load and instantiate the result driver - - $driver = $this->load_rdriver(); - $RES = new $driver(); - $RES->conn_id = $this->conn_id; - $RES->result_id = $this->result_id; - - if ($this->dbdriver == 'oci8') - { - $RES->stmt_id = $this->stmt_id; - $RES->curs_id = NULL; - $RES->limit_used = $this->limit_used; - $this->stmt_id = FALSE; - } - - // oci8 vars must be set before calling this - $RES->num_rows = $RES->num_rows(); - - // Is query caching enabled? If so, we'll serialize the - // result object and save it to a cache file. - if ($this->cache_on == TRUE AND $this->_cache_init()) - { - // We'll create a new instance of the result object - // only without the platform specific driver since - // we can't use it with cached data (the query result - // resource ID won't be any good once we've cached the - // result object, so we'll have to compile the data - // and save it) - $CR = new CI_DB_result(); - $CR->num_rows = $RES->num_rows(); - $CR->result_object = $RES->result_object(); - $CR->result_array = $RES->result_array(); - - // Reset these since cached objects can not utilize resource IDs. - $CR->conn_id = NULL; - $CR->result_id = NULL; - - $this->CACHE->write($sql, $CR); - } - - return $RES; - } - - // -------------------------------------------------------------------- - - /** - * Load the result drivers - * - * @access public - * @return string the name of the result class - */ - function load_rdriver() - { - $driver = 'CI_DB_'.$this->dbdriver.'_result'; - - if ( ! class_exists($driver)) - { - include_once(BASEPATH.'database/DB_result.php'); - include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); - } - - return $driver; - } - - // -------------------------------------------------------------------- - - /** - * Simple Query - * This is a simplified version of the query() function. Internally - * we only use it when running transaction commands since they do - * not require all the features of the main query() function. - * - * @access public - * @param string the sql query - * @return mixed - */ - function simple_query($sql) - { - if ( ! $this->conn_id) - { - $this->initialize(); - } - - return $this->_execute($sql); - } - - // -------------------------------------------------------------------- - - /** - * Disable Transactions - * This permits transactions to be disabled at run-time. - * - * @access public - * @return void - */ - function trans_off() - { - $this->trans_enabled = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Transaction Strict Mode - * When strict mode is enabled, if you are running multiple groups of - * transactions, if one group fails all groups will be rolled back. - * If strict mode is disabled, each group is treated autonomously, meaning - * a failure of one group will not affect any others - * - * @access public - * @return void - */ - function trans_strict($mode = TRUE) - { - $this->trans_strict = is_bool($mode) ? $mode : TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Start Transaction - * - * @access public - * @return void - */ - function trans_start($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - $this->_trans_depth += 1; - return; - } - - $this->trans_begin($test_mode); - } - - // -------------------------------------------------------------------- - - /** - * Complete Transaction - * - * @access public - * @return bool - */ - function trans_complete() - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 1) - { - $this->_trans_depth -= 1; - return TRUE; - } - - // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE) - { - $this->trans_rollback(); - - // If we are NOT running in strict mode, we will reset - // the _trans_status flag so that subsequent groups of transactions - // will be permitted. - if ($this->trans_strict === FALSE) - { - $this->_trans_status = TRUE; - } - - log_message('debug', 'DB Transaction Failure'); - return FALSE; - } - - $this->trans_commit(); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Lets you retrieve the transaction flag to determine if it has failed - * - * @access public - * @return bool - */ - function trans_status() - { - return $this->_trans_status; - } - - // -------------------------------------------------------------------- - - /** - * Compile Bindings - * - * @access public - * @param string the sql statement - * @param array an array of bind data - * @return string - */ - function compile_binds($sql, $binds) - { - if (strpos($sql, $this->bind_marker) === FALSE) - { - return $sql; - } - - if ( ! is_array($binds)) - { - $binds = array($binds); - } - - // Get the sql segments around the bind markers - $segments = explode($this->bind_marker, $sql); - - // The count of bind should be 1 less then the count of segments - // If there are more bind arguments trim it down - if (count($binds) >= count($segments)) { - $binds = array_slice($binds, 0, count($segments)-1); - } - - // Construct the binded query - $result = $segments[0]; - $i = 0; - foreach ($binds as $bind) - { - $result .= $this->escape($bind); - $result .= $segments[++$i]; - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @access public - * @param string An SQL query string - * @return boolean - */ - function is_write_type($sql) - { - if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql)) - { - return FALSE; - } - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Calculate the aggregate query elapsed time - * - * @access public - * @param integer The number of decimal places - * @return integer - */ - function elapsed_time($decimals = 6) - { - return number_format($this->benchmark, $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Returns the total number of queries - * - * @access public - * @return integer - */ - function total_queries() - { - return $this->query_count; - } - - // -------------------------------------------------------------------- - - /** - * Returns the last query that was executed - * - * @access public - * @return void - */ - function last_query() - { - return end($this->queries); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * Sets boolean and null types - * - * @access public - * @param string - * @return mixed - */ - function escape($str) - { - if (is_string($str)) - { - $str = "'".$this->escape_str($str)."'"; - } - elseif (is_bool($str)) - { - $str = ($str === FALSE) ? 0 : 1; - } - elseif (is_null($str)) - { - $str = 'NULL'; - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Escape LIKE String - * - * Calls the individual driver for platform - * specific escaping for LIKE conditions - * - * @access public - * @param string - * @return mixed - */ - function escape_like_str($str) - { - return $this->escape_str($str, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Primary - * - * Retrieves the primary key. It assumes that the row in the first - * position is the primary key - * - * @access public - * @param string the table name - * @return string - */ - function primary($table = '') - { - $fields = $this->list_fields($table); - - if ( ! is_array($fields)) - { - return FALSE; - } - - return current($fields); - } - - // -------------------------------------------------------------------- - - /** - * Returns an array of table names - * - * @access public - * @return array - */ - function list_tables($constrain_by_prefix = FALSE) - { - // Is there a cached result? - if (isset($this->data_cache['table_names'])) - { - return $this->data_cache['table_names']; - } - - if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) - { - if ($this->db_debug) - { - return $this->display_error('db_unsupported_function'); - } - return FALSE; - } - - $retval = array(); - $query = $this->query($sql); - - if ($query->num_rows() > 0) - { - foreach ($query->result_array() as $row) - { - if (isset($row['TABLE_NAME'])) - { - $retval[] = $row['TABLE_NAME']; - } - else - { - $retval[] = array_shift($row); - } - } - } - - $this->data_cache['table_names'] = $retval; - return $this->data_cache['table_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular table exists - * @access public - * @return boolean - */ - function table_exists($table_name) - { - return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Fetch MySQL Field Names - * - * @access public - * @param string the table name - * @return array - */ - function list_fields($table = '') - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if ($table == '') - { - if ($this->db_debug) - { - return $this->display_error('db_field_param_missing'); - } - return FALSE; - } - - if (FALSE === ($sql = $this->_list_columns($table))) - { - if ($this->db_debug) - { - return $this->display_error('db_unsupported_function'); - } - return FALSE; - } - - $query = $this->query($sql); - - $retval = array(); - foreach ($query->result_array() as $row) - { - if (isset($row['COLUMN_NAME'])) - { - $retval[] = $row['COLUMN_NAME']; - } - else - { - $retval[] = current($row); - } - } - - $this->data_cache['field_names'][$table] = $retval; - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular field exists - * @access public - * @param string - * @param string - * @return boolean - */ - function field_exists($field_name, $table_name) - { - return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @access public - * @param string the table name - * @return object - */ - function field_data($table = '') - { - if ($table == '') - { - if ($this->db_debug) - { - return $this->display_error('db_field_param_missing'); - } - return FALSE; - } - - $query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE))); - - return $query->field_data(); - } - - // -------------------------------------------------------------------- - - /** - * Generate an insert string - * - * @access public - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @return string - */ - function insert_string($table, $data) - { - $fields = array(); - $values = array(); - - foreach ($data as $key => $val) - { - $fields[] = $this->_escape_identifiers($key); - $values[] = $this->escape($val); - } - - return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); - } - - // -------------------------------------------------------------------- - - /** - * Generate an update string - * - * @access public - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @param mixed the "where" statement - * @return string - */ - function update_string($table, $data, $where) - { - if ($where == '') - { - return false; - } - - $fields = array(); - foreach ($data as $key => $val) - { - $fields[$this->_protect_identifiers($key)] = $this->escape($val); - } - - if ( ! is_array($where)) - { - $dest = array($where); - } - else - { - $dest = array(); - foreach ($where as $key => $val) - { - $prefix = (count($dest) == 0) ? '' : ' AND '; - - if ($val !== '') - { - if ( ! $this->_has_operator($key)) - { - $key .= ' ='; - } - - $val = ' '.$this->escape($val); - } - - $dest[] = $prefix.$key.$val; - } - } - - return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest); - } - - // -------------------------------------------------------------------- - - /** - * Tests whether the string has an SQL operator - * - * @access private - * @param string - * @return bool - */ - function _has_operator($str) - { - $str = trim($str); - if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)) - { - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Enables a native PHP function to be run, using a platform agnostic wrapper. - * - * @access public - * @param string the function name - * @param mixed any parameters needed by the function - * @return mixed - */ - function call_function($function) - { - $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_'; - - if (FALSE === strpos($driver, $function)) - { - $function = $driver.$function; - } - - if ( ! function_exists($function)) - { - if ($this->db_debug) - { - return $this->display_error('db_unsupported_function'); - } - return FALSE; - } - else - { - $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null; - if (is_null($args)) - { - return call_user_func($function); - } - else - { - return call_user_func_array($function, $args); - } - } - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @access public - * @param string the path to the cache directory - * @return void - */ - function cache_set_path($path = '') - { - $this->cachedir = $path; - } - - // -------------------------------------------------------------------- - - /** - * Enable Query Caching - * - * @access public - * @return void - */ - function cache_on() - { - $this->cache_on = TRUE; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Disable Query Caching - * - * @access public - * @return void - */ - function cache_off() - { - $this->cache_on = FALSE; - return FALSE; - } - - - // -------------------------------------------------------------------- - - /** - * Delete the cache files associated with a particular URI - * - * @access public - * @return void - */ - function cache_delete($segment_one = '', $segment_two = '') - { - if ( ! $this->_cache_init()) - { - return FALSE; - } - return $this->CACHE->delete($segment_one, $segment_two); - } - - // -------------------------------------------------------------------- - - /** - * Delete All cache files - * - * @access public - * @return void - */ - function cache_delete_all() - { - if ( ! $this->_cache_init()) - { - return FALSE; - } - - return $this->CACHE->delete_all(); - } - - // -------------------------------------------------------------------- - - /** - * Initialize the Cache Class - * - * @access private - * @return void - */ - function _cache_init() - { - if (is_object($this->CACHE) AND class_exists('CI_DB_Cache')) - { - return TRUE; - } - - if ( ! class_exists('CI_DB_Cache')) - { - if ( ! @include(BASEPATH.'database/DB_cache.php')) - { - return $this->cache_off(); - } - } - - $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @return void - */ - function close() - { - if (is_resource($this->conn_id) OR is_object($this->conn_id)) - { - $this->_close($this->conn_id); - } - $this->conn_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Display an error message - * - * @access public - * @param string the error message - * @param string any "swap" values - * @param boolean whether to localize the message - * @return string sends the application/error_db.php template - */ - function display_error($error = '', $swap = '', $native = FALSE) - { - $LANG =& load_class('Lang', 'core'); - $LANG->load('db'); - - $heading = $LANG->line('db_error_heading'); - - if ($native == TRUE) - { - $message = $error; - } - else - { - $message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error; - } - - // Find the most likely culprit of the error by going through - // the backtrace until the source file is no longer in the - // database folder. - - $trace = debug_backtrace(); - - foreach ($trace as $call) - { - if (isset($call['file']) && strpos($call['file'], BASEPATH.'database') === FALSE) - { - // Found it - use a relative path for safety - $message[] = 'Filename: '.str_replace(array(BASEPATH, APPPATH), '', $call['file']); - $message[] = 'Line Number: '.$call['line']; - - break; - } - } - - $error =& load_class('Exceptions', 'core'); - echo $error->show_error($heading, $message, 'error_db'); - exit; - } - - // -------------------------------------------------------------------- - - /** - * Protect Identifiers - * - * This function adds backticks if appropriate based on db type - * - * @access private - * @param mixed the item to escape - * @return mixed the item with backticks - */ - function protect_identifiers($item, $prefix_single = FALSE) - { - return $this->_protect_identifiers($item, $prefix_single); - } - - // -------------------------------------------------------------------- - - /** - * Protect Identifiers - * - * This function is used extensively by the Active Record class, and by - * a couple functions in this class. - * It takes a column or table name (optionally with an alias) and inserts - * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: - * - * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table - * - * Or a query with aliasing: - * - * SELECT m.member_id, m.member_name FROM members AS m - * - * Since the column name can include up to four segments (host, DB, table, column) - * or also have an alias prefix, we need to do a bit of work to figure this out and - * insert the table prefix (if it exists) in the proper position, and escape only - * the correct identifiers. - * - * @access private - * @param string - * @param bool - * @param mixed - * @param bool - * @return string - */ - function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) - { - if ( ! is_bool($protect_identifiers)) - { - $protect_identifiers = $this->_protect_identifiers; - } - - if (is_array($item)) - { - $escaped_array = array(); - - foreach ($item as $k => $v) - { - $escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v); - } - - return $escaped_array; - } - - // Convert tabs or multiple spaces into single spaces - $item = preg_replace('/[\t ]+/', ' ', $item); - - // If the item has an alias declaration we remove it and set it aside. - // Basically we remove everything to the right of the first space - if (strpos($item, ' ') !== FALSE) - { - $alias = strstr($item, ' '); - $item = substr($item, 0, - strlen($alias)); - } - else - { - $alias = ''; - } - - // This is basically a bug fix for queries that use MAX, MIN, etc. - // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful - // way to deal with this, but I'm not thinking of it -- Rick - if (strpos($item, '(') !== FALSE) - { - return $item.$alias; - } - - // Break the string apart if it contains periods, then insert the table prefix - // in the correct location, assuming the period doesn't indicate that we're dealing - // with an alias. While we're at it, we will escape the components - if (strpos($item, '.') !== FALSE) - { - $parts = explode('.', $item); - - // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, - // we have nothing more to do other than escape the item - if (in_array($parts[0], $this->ar_aliased_tables)) - { - if ($protect_identifiers === TRUE) - { - foreach ($parts as $key => $val) - { - if ( ! in_array($val, $this->_reserved_identifiers)) - { - $parts[$key] = $this->_escape_identifiers($val); - } - } - - $item = implode('.', $parts); - } - return $item.$alias; - } - - // Is there a table prefix defined in the config file? If not, no need to do anything - if ($this->dbprefix != '') - { - // We now add the table prefix based on some logic. - // Do we have 4 segments (hostname.database.table.column)? - // If so, we add the table prefix to the column name in the 3rd segment. - if (isset($parts[3])) - { - $i = 2; - } - // Do we have 3 segments (database.table.column)? - // If so, we add the table prefix to the column name in 2nd position - elseif (isset($parts[2])) - { - $i = 1; - } - // Do we have 2 segments (table.column)? - // If so, we add the table prefix to the column name in 1st segment - else - { - $i = 0; - } - - // This flag is set when the supplied $item does not contain a field name. - // This can happen when this function is being called from a JOIN. - if ($field_exists == FALSE) - { - $i++; - } - - // Verify table prefix and replace if necessary - if ($this->swap_pre != '' && strncmp($parts[$i], $this->swap_pre, strlen($this->swap_pre)) === 0) - { - $parts[$i] = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $parts[$i]); - } - - // We only add the table prefix if it does not already exist - if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix) - { - $parts[$i] = $this->dbprefix.$parts[$i]; - } - - // Put the parts back together - $item = implode('.', $parts); - } - - if ($protect_identifiers === TRUE) - { - $item = $this->_escape_identifiers($item); - } - - return $item.$alias; - } - - // Is there a table prefix? If not, no need to insert it - if ($this->dbprefix != '') - { - // Verify table prefix and replace if necessary - if ($this->swap_pre != '' && strncmp($item, $this->swap_pre, strlen($this->swap_pre)) === 0) - { - $item = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $item); - } - - // Do we prefix an item with no segments? - if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix) - { - $item = $this->dbprefix.$item; - } - } - - if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers)) - { - $item = $this->_escape_identifiers($item); - } - - return $item.$alias; - } - - // -------------------------------------------------------------------- - - /** - * Dummy method that allows Active Record class to be disabled - * - * This function is used extensively by every db driver. - * - * @return void - */ - protected function _reset_select() - { - } - -} - -/* End of file DB_driver.php */ -/* Location: ./system/database/DB_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/DB_forge.php b/sources/web/system/database/DB_forge.php deleted file mode 100644 index 6bc4041..0000000 --- a/sources/web/system/database/DB_forge.php +++ /dev/null @@ -1,382 +0,0 @@ -db - $CI =& get_instance(); - $this->db =& $CI->db; - log_message('debug', "Database Forge Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @access public - * @param string the database name - * @return bool - */ - function create_database($db_name) - { - $sql = $this->_create_database($db_name); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @access public - * @param string the database name - * @return bool - */ - function drop_database($db_name) - { - $sql = $this->_drop_database($db_name); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Add Key - * - * @access public - * @param string key - * @param string type - * @return void - */ - function add_key($key = '', $primary = FALSE) - { - if (is_array($key)) - { - foreach ($key as $one) - { - $this->add_key($one, $primary); - } - - return; - } - - if ($key == '') - { - show_error('Key information is required for that operation.'); - } - - if ($primary === TRUE) - { - $this->primary_keys[] = $key; - } - else - { - $this->keys[] = $key; - } - } - - // -------------------------------------------------------------------- - - /** - * Add Field - * - * @access public - * @param string collation - * @return void - */ - function add_field($field = '') - { - if ($field == '') - { - show_error('Field information is required.'); - } - - if (is_string($field)) - { - if ($field == 'id') - { - $this->add_field(array( - 'id' => array( - 'type' => 'INT', - 'constraint' => 9, - 'auto_increment' => TRUE - ) - )); - $this->add_key('id', TRUE); - } - else - { - if (strpos($field, ' ') === FALSE) - { - show_error('Field information is required for that operation.'); - } - - $this->fields[] = $field; - } - } - - if (is_array($field)) - { - $this->fields = array_merge($this->fields, $field); - } - - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access public - * @param string the table name - * @return bool - */ - function create_table($table = '', $if_not_exists = FALSE) - { - if ($table == '') - { - show_error('A table name is required for that operation.'); - } - - if (count($this->fields) == 0) - { - show_error('Field information is required.'); - } - - $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists); - - $this->_reset(); - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access public - * @param string the table name - * @return bool - */ - function drop_table($table_name) - { - $sql = $this->_drop_table($this->db->dbprefix.$table_name); - - if (is_bool($sql)) - { - return $sql; - } - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Rename Table - * - * @access public - * @param string the old table name - * @param string the new table name - * @return bool - */ - function rename_table($table_name, $new_table_name) - { - if ($table_name == '' OR $new_table_name == '') - { - show_error('A table name is required for that operation.'); - } - - $sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name); - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Column Add - * - * @access public - * @param string the table name - * @param string the column name - * @param string the column definition - * @return bool - */ - function add_column($table = '', $field = array(), $after_field = '') - { - if ($table == '') - { - show_error('A table name is required for that operation.'); - } - - // add field info into field array, but we can only do one at a time - // so we cycle through - - foreach ($field as $k => $v) - { - $this->add_field(array($k => $field[$k])); - - if (count($this->fields) == 0) - { - show_error('Field information is required.'); - } - - $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field); - - $this->_reset(); - - if ($this->db->query($sql) === FALSE) - { - return FALSE; - } - } - - return TRUE; - - } - - // -------------------------------------------------------------------- - - /** - * Column Drop - * - * @access public - * @param string the table name - * @param string the column name - * @return bool - */ - function drop_column($table = '', $column_name = '') - { - - if ($table == '') - { - show_error('A table name is required for that operation.'); - } - - if ($column_name == '') - { - show_error('A column name is required for that operation.'); - } - - $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Column Modify - * - * @access public - * @param string the table name - * @param string the column name - * @param string the column definition - * @return bool - */ - function modify_column($table = '', $field = array()) - { - if ($table == '') - { - show_error('A table name is required for that operation.'); - } - - // add field info into field array, but we can only do one at a time - // so we cycle through - - foreach ($field as $k => $v) - { - // If no name provided, use the current name - if ( ! isset($field[$k]['name'])) - { - $field[$k]['name'] = $k; - } - - $this->add_field(array($k => $field[$k])); - - if (count($this->fields) == 0) - { - show_error('Field information is required.'); - } - - $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields); - - $this->_reset(); - - if ($this->db->query($sql) === FALSE) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Reset - * - * Resets table creation vars - * - * @access private - * @return void - */ - function _reset() - { - $this->fields = array(); - $this->keys = array(); - $this->primary_keys = array(); - } - -} - -/* End of file DB_forge.php */ -/* Location: ./system/database/DB_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/DB_result.php b/sources/web/system/database/DB_result.php deleted file mode 100644 index 48d66c8..0000000 --- a/sources/web/system/database/DB_result.php +++ /dev/null @@ -1,410 +0,0 @@ -result_array(); - else if ($type == 'object') return $this->result_object(); - else return $this->custom_result_object($type); - } - - // -------------------------------------------------------------------- - - /** - * Custom query result. - * - * @param class_name A string that represents the type of object you want back - * @return array of objects - */ - public function custom_result_object($class_name) - { - if (array_key_exists($class_name, $this->custom_result_object)) - { - return $this->custom_result_object[$class_name]; - } - - if ($this->result_id === FALSE OR $this->num_rows() == 0) - { - return array(); - } - - // add the data to the object - $this->_data_seek(0); - $result_object = array(); - - while ($row = $this->_fetch_object()) - { - $object = new $class_name(); - - foreach ($row as $key => $value) - { - $object->$key = $value; - } - - $result_object[] = $object; - } - - // return the array - return $this->custom_result_object[$class_name] = $result_object; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "object" version. - * - * @access public - * @return object - */ - public function result_object() - { - if (count($this->result_object) > 0) - { - return $this->result_object; - } - - // In the event that query caching is on the result_id variable - // will return FALSE since there isn't a valid SQL resource so - // we'll simply return an empty array. - if ($this->result_id === FALSE OR $this->num_rows() == 0) - { - return array(); - } - - $this->_data_seek(0); - while ($row = $this->_fetch_object()) - { - $this->result_object[] = $row; - } - - return $this->result_object; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "array" version. - * - * @access public - * @return array - */ - public function result_array() - { - if (count($this->result_array) > 0) - { - return $this->result_array; - } - - // In the event that query caching is on the result_id variable - // will return FALSE since there isn't a valid SQL resource so - // we'll simply return an empty array. - if ($this->result_id === FALSE OR $this->num_rows() == 0) - { - return array(); - } - - $this->_data_seek(0); - while ($row = $this->_fetch_assoc()) - { - $this->result_array[] = $row; - } - - return $this->result_array; - } - - // -------------------------------------------------------------------- - - /** - * Query result. Acts as a wrapper function for the following functions. - * - * @access public - * @param string - * @param string can be "object" or "array" - * @return mixed either a result object or array - */ - public function row($n = 0, $type = 'object') - { - if ( ! is_numeric($n)) - { - // We cache the row data for subsequent uses - if ( ! is_array($this->row_data)) - { - $this->row_data = $this->row_array(0); - } - - // array_key_exists() instead of isset() to allow for MySQL NULL values - if (array_key_exists($n, $this->row_data)) - { - return $this->row_data[$n]; - } - // reset the $n variable if the result was not achieved - $n = 0; - } - - if ($type == 'object') return $this->row_object($n); - else if ($type == 'array') return $this->row_array($n); - else return $this->custom_row_object($n, $type); - } - - // -------------------------------------------------------------------- - - /** - * Assigns an item into a particular column slot - * - * @access public - * @return object - */ - public function set_row($key, $value = NULL) - { - // We cache the row data for subsequent uses - if ( ! is_array($this->row_data)) - { - $this->row_data = $this->row_array(0); - } - - if (is_array($key)) - { - foreach ($key as $k => $v) - { - $this->row_data[$k] = $v; - } - - return; - } - - if ($key != '' AND ! is_null($value)) - { - $this->row_data[$key] = $value; - } - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - custom object version - * - * @access public - * @return object - */ - public function custom_row_object($n, $type) - { - $result = $this->custom_result_object($type); - - if (count($result) == 0) - { - return $result; - } - - if ($n != $this->current_row AND isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - /** - * Returns a single result row - object version - * - * @access public - * @return object - */ - public function row_object($n = 0) - { - $result = $this->result_object(); - - if (count($result) == 0) - { - return $result; - } - - if ($n != $this->current_row AND isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - array version - * - * @access public - * @return array - */ - public function row_array($n = 0) - { - $result = $this->result_array(); - - if (count($result) == 0) - { - return $result; - } - - if ($n != $this->current_row AND isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - - // -------------------------------------------------------------------- - - /** - * Returns the "first" row - * - * @access public - * @return object - */ - public function first_row($type = 'object') - { - $result = $this->result($type); - - if (count($result) == 0) - { - return $result; - } - return $result[0]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "last" row - * - * @access public - * @return object - */ - public function last_row($type = 'object') - { - $result = $this->result($type); - - if (count($result) == 0) - { - return $result; - } - return $result[count($result) -1]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "next" row - * - * @access public - * @return object - */ - public function next_row($type = 'object') - { - $result = $this->result($type); - - if (count($result) == 0) - { - return $result; - } - - if (isset($result[$this->current_row + 1])) - { - ++$this->current_row; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "previous" row - * - * @access public - * @return object - */ - public function previous_row($type = 'object') - { - $result = $this->result($type); - - if (count($result) == 0) - { - return $result; - } - - if (isset($result[$this->current_row - 1])) - { - --$this->current_row; - } - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * The following functions are normally overloaded by the identically named - * methods in the platform-specific driver -- except when query caching - * is used. When caching is enabled we do not load the other driver. - * These functions are primarily here to prevent undefined function errors - * when a cached result object is in use. They are not otherwise fully - * operational due to the unavailability of the database resource IDs with - * cached results. - */ - public function num_rows() { return $this->num_rows; } - public function num_fields() { return 0; } - public function list_fields() { return array(); } - public function field_data() { return array(); } - public function free_result() { return TRUE; } - protected function _data_seek() { return TRUE; } - protected function _fetch_assoc() { return array(); } - protected function _fetch_object() { return array(); } - -} -// END DB_result class - -/* End of file DB_result.php */ -/* Location: ./system/database/DB_result.php */ diff --git a/sources/web/system/database/DB_utility.php b/sources/web/system/database/DB_utility.php deleted file mode 100644 index 52196b7..0000000 --- a/sources/web/system/database/DB_utility.php +++ /dev/null @@ -1,414 +0,0 @@ -db - $CI =& get_instance(); - $this->db =& $CI->db; - - log_message('debug', "Database Utility Class Initialized"); - } - - // -------------------------------------------------------------------- - - /** - * List databases - * - * @access public - * @return bool - */ - function list_databases() - { - // Is there a cached result? - if (isset($this->data_cache['db_names'])) - { - return $this->data_cache['db_names']; - } - - $query = $this->db->query($this->_list_databases()); - $dbs = array(); - if ($query->num_rows() > 0) - { - foreach ($query->result_array() as $row) - { - $dbs[] = current($row); - } - } - - $this->data_cache['db_names'] = $dbs; - return $this->data_cache['db_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular database exists - * - * @access public - * @param string - * @return boolean - */ - function database_exists($database_name) - { - // Some databases won't have access to the list_databases() function, so - // this is intended to allow them to override with their own functions as - // defined in $driver_utility.php - if (method_exists($this, '_database_exists')) - { - return $this->_database_exists($database_name); - } - else - { - return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE; - } - } - - - // -------------------------------------------------------------------- - - /** - * Optimize Table - * - * @access public - * @param string the table name - * @return bool - */ - function optimize_table($table_name) - { - $sql = $this->_optimize_table($table_name); - - if (is_bool($sql)) - { - show_error('db_must_use_set'); - } - - $query = $this->db->query($sql); - $res = $query->result_array(); - - // Note: Due to a bug in current() that affects some versions - // of PHP we can not pass function call directly into it - return current($res); - } - - // -------------------------------------------------------------------- - - /** - * Optimize Database - * - * @access public - * @return array - */ - function optimize_database() - { - $result = array(); - foreach ($this->db->list_tables() as $table_name) - { - $sql = $this->_optimize_table($table_name); - - if (is_bool($sql)) - { - return $sql; - } - - $query = $this->db->query($sql); - - // Build the result array... - // Note: Due to a bug in current() that affects some versions - // of PHP we can not pass function call directly into it - $res = $query->result_array(); - $res = current($res); - $key = str_replace($this->db->database.'.', '', current($res)); - $keys = array_keys($res); - unset($res[$keys[0]]); - - $result[$key] = $res; - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Repair Table - * - * @access public - * @param string the table name - * @return bool - */ - function repair_table($table_name) - { - $sql = $this->_repair_table($table_name); - - if (is_bool($sql)) - { - return $sql; - } - - $query = $this->db->query($sql); - - // Note: Due to a bug in current() that affects some versions - // of PHP we can not pass function call directly into it - $res = $query->result_array(); - return current($res); - } - - // -------------------------------------------------------------------- - - /** - * Generate CSV from a query result object - * - * @access public - * @param object The query result object - * @param string The delimiter - comma by default - * @param string The newline character - \n by default - * @param string The enclosure - double quote by default - * @return string - */ - function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"') - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - $out = ''; - - // First generate the headings from the table column names - foreach ($query->list_fields() as $name) - { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; - } - - $out = rtrim($out); - $out .= $newline; - - // Next blast through the result array and build out the rows - foreach ($query->result_array() as $row) - { - foreach ($row as $item) - { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; - } - $out = rtrim($out); - $out .= $newline; - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * Generate XML data from a query result object - * - * @access public - * @param object The query result object - * @param array Any preferences - * @return string - */ - function xml_from_result($query, $params = array()) - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - // Set our default values - foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) - { - if ( ! isset($params[$key])) - { - $params[$key] = $val; - } - } - - // Create variables for convenience - extract($params); - - // Load the xml helper - $CI =& get_instance(); - $CI->load->helper('xml'); - - // Generate the result - $xml = "<{$root}>".$newline; - foreach ($query->result_array() as $row) - { - $xml .= $tab."<{$element}>".$newline; - - foreach ($row as $key => $val) - { - $xml .= $tab.$tab."<{$key}>".xml_convert($val)."".$newline; - } - $xml .= $tab."".$newline; - } - $xml .= "".$newline; - - return $xml; - } - - // -------------------------------------------------------------------- - - /** - * Database Backup - * - * @access public - * @return void - */ - function backup($params = array()) - { - // If the parameters have not been submitted as an - // array then we know that it is simply the table - // name, which is a valid short cut. - if (is_string($params)) - { - $params = array('tables' => $params); - } - - // ------------------------------------------------------ - - // Set up our default preferences - $prefs = array( - 'tables' => array(), - 'ignore' => array(), - 'filename' => '', - 'format' => 'gzip', // gzip, zip, txt - 'add_drop' => TRUE, - 'add_insert' => TRUE, - 'newline' => "\n" - ); - - // Did the user submit any preferences? If so set them.... - if (count($params) > 0) - { - foreach ($prefs as $key => $val) - { - if (isset($params[$key])) - { - $prefs[$key] = $params[$key]; - } - } - } - - // ------------------------------------------------------ - - // Are we backing up a complete database or individual tables? - // If no table names were submitted we'll fetch the entire table list - if (count($prefs['tables']) == 0) - { - $prefs['tables'] = $this->db->list_tables(); - } - - // ------------------------------------------------------ - - // Validate the format - if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) - { - $prefs['format'] = 'txt'; - } - - // ------------------------------------------------------ - - // Is the encoder supported? If not, we'll either issue an - // error or use plain text depending on the debug settings - if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode')) - OR ($prefs['format'] == 'zip' AND ! @function_exists('gzcompress'))) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_compression'); - } - - $prefs['format'] = 'txt'; - } - - // ------------------------------------------------------ - - // Set the filename if not provided - Only needed with Zip files - if ($prefs['filename'] == '' AND $prefs['format'] == 'zip') - { - $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database; - $prefs['filename'] .= '_'.date('Y-m-d_H-i', time()); - } - - // ------------------------------------------------------ - - // Was a Gzip file requested? - if ($prefs['format'] == 'gzip') - { - return gzencode($this->_backup($prefs)); - } - - // ------------------------------------------------------ - - // Was a text file requested? - if ($prefs['format'] == 'txt') - { - return $this->_backup($prefs); - } - - // ------------------------------------------------------ - - // Was a Zip file requested? - if ($prefs['format'] == 'zip') - { - // If they included the .zip file extension we'll remove it - if (preg_match("|.+?\.zip$|", $prefs['filename'])) - { - $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); - } - - // Tack on the ".sql" file extension if needed - if ( ! preg_match("|.+?\.sql$|", $prefs['filename'])) - { - $prefs['filename'] .= '.sql'; - } - - // Load the Zip class and output it - - $CI =& get_instance(); - $CI->load->library('zip'); - $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); - return $CI->zip->get_zip(); - } - - } - -} - - -/* End of file DB_utility.php */ -/* Location: ./system/database/DB_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/cubrid/cubrid_driver.php b/sources/web/system/database/drivers/cubrid/cubrid_driver.php deleted file mode 100644 index d011404..0000000 --- a/sources/web/system/database/drivers/cubrid/cubrid_driver.php +++ /dev/null @@ -1,792 +0,0 @@ -port == '') - { - $this->port = self::DEFAULT_PORT; - } - - $conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password); - - if ($conn) - { - // Check if a user wants to run queries in dry, i.e. run the - // queries but not commit them. - if (isset($this->auto_commit) && ! $this->auto_commit) - { - cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE); - } - else - { - cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE); - $this->auto_commit = TRUE; - } - } - - return $conn; - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * In CUBRID persistent DB connection is supported natively in CUBRID - * engine which can be configured in the CUBRID Broker configuration - * file by setting the CCI_PCONNECT parameter to ON. In that case, all - * connections established between the client application and the - * server will become persistent. This is calling the same - * @cubrid_connect function will establish persisten connection - * considering that the CCI_PCONNECT is ON. - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - return $this->db_connect(); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - if (cubrid_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - // In CUBRID there is no need to select a database as the database - // is chosen at the connection time. - // So, to determine if the database is "selected", all we have to - // do is ping the server and return that value. - return cubrid_ping($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // In CUBRID, there is no need to set charset or collation. - // This is why returning true will allow the application continue - // its normal process. - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - // To obtain the CUBRID Server version, no need to run the SQL query. - // CUBRID PHP API provides a function to determin this value. - // This is why we also need to add 'cubrid' value to the list of - // $driver_version_exceptions array in DB_driver class in - // version() function. - return cubrid_get_server_info($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @cubrid_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - // No need to prepare - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - if (cubrid_get_autocommit($this->conn_id)) - { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - cubrid_commit($this->conn_id); - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - cubrid_rollback($this->conn_id); - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id)) - { - $str = cubrid_real_escape_string($str, $this->conn_id); - } - else - { - $str = addslashes($str); - } - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @cubrid_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - return @cubrid_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified table - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SHOW TABLES"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT * FROM ".$table." LIMIT 1"; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return cubrid_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return cubrid_errno($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _replace($table, $keys, $values) - { - return "REPLACE INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert_batch($table, $keys, $values) - { - return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES ".implode(', ', $values); - } - - // -------------------------------------------------------------------- - - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = sprintf('"%s" = %s', $key, $val); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @return string - */ - function _update_batch($table, $values, $index, $where = NULL) - { - $ids = array(); - $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; - - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field != $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $sql = "UPDATE ".$table." SET "; - $cases = ''; - - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n"; - foreach ($v as $row) - { - $cases .= $row."\n"; - } - - $cases .= 'ELSE '.$k.' END, '; - } - - $sql .= substr($cases, 0, -2); - - $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; - - return $sql; - } - - // -------------------------------------------------------------------- - - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - if ($offset == 0) - { - $offset = ''; - } - else - { - $offset .= ", "; - } - - return $sql."LIMIT ".$offset.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @cubrid_close($conn_id); - } - -} - - -/* End of file cubrid_driver.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/cubrid/cubrid_forge.php b/sources/web/system/database/drivers/cubrid/cubrid_forge.php deleted file mode 100644 index bab03f7..0000000 --- a/sources/web/system/database/drivers/cubrid/cubrid_forge.php +++ /dev/null @@ -1,288 +0,0 @@ -$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t\"" . $this->db->_protect_identifiers($field) . "\""; - - if (array_key_exists('NAME', $attributes)) - { - $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; - } - - if (array_key_exists('TYPE', $attributes)) - { - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - switch ($attributes['TYPE']) - { - case 'decimal': - case 'float': - case 'numeric': - $sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; - break; - case 'enum': // As of version 8.4.0 CUBRID does not support - // enum data type. - break; - case 'set': - $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; - break; - default: - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - } - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - //$sql .= ' UNSIGNED'; - // As of version 8.4.0 CUBRID does not support UNSIGNED INTEGER data type. - // Will be supported in the next release as a part of MySQL Compatibility. - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - - if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) - { - $sql .= ' UNIQUE'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param mixed the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - //$sql .= 'IF NOT EXISTS '; - // As of version 8.4.0 CUBRID does not support this SQL syntax. - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - - $sql .= $this->_process_fields($fields); - - // If there is a PK defined - if (count($primary_keys) > 0) - { - $key_name = "pk_" . $table . "_" . - $this->db->_protect_identifiers(implode('_', $primary_keys)); - - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tCONSTRAINT " . $key_name . " PRIMARY KEY(" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key_name = $this->db->_protect_identifiers(implode('_', $key)); - $key = $this->db->_protect_identifiers($key); - } - else - { - $key_name = $this->db->_protect_identifiers($key); - $key = array($key_name); - } - - $sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n);"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return string - */ - function _drop_table($table) - { - return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param array fields - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $fields, $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql.$this->db->_protect_identifiers($fields); - } - - $sql .= $this->_process_fields($fields); - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'RENAME TABLE '.$this->db->_protect_identifiers($table_name)." AS ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - -} - -/* End of file cubrid_forge.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/cubrid/cubrid_result.php b/sources/web/system/database/drivers/cubrid/cubrid_result.php deleted file mode 100644 index 6f0c2b5..0000000 --- a/sources/web/system/database/drivers/cubrid/cubrid_result.php +++ /dev/null @@ -1,202 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @cubrid_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - return cubrid_column_names($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - - $tablePrimaryKeys = array(); - - while ($field = cubrid_fetch_field($this->result_id)) - { - $F = new stdClass(); - $F->name = $field->name; - $F->type = $field->type; - $F->default = $field->def; - $F->max_length = $field->max_length; - - // At this moment primary_key property is not returned when - // cubrid_fetch_field is called. The following code will - // provide a patch for it. primary_key property will be added - // in the next release. - - // TODO: later version of CUBRID will provide primary_key - // property. - // When PK is defined in CUBRID, an index is automatically - // created in the db_index system table in the form of - // pk_tblname_fieldname. So the following will count how many - // columns are there which satisfy this format. - // The query will search for exact single columns, thus - // compound PK is not supported. - $res = cubrid_query($this->conn_id, - "SELECT COUNT(*) FROM db_index WHERE class_name = '" . $field->table . - "' AND is_primary_key = 'YES' AND index_name = 'pk_" . - $field->table . "_" . $field->name . "'" - ); - - if ($res) - { - $row = cubrid_fetch_array($res, CUBRID_NUM); - $F->primary_key = ($row[0] > 0 ? 1 : null); - } - else - { - $F->primary_key = null; - } - - if (is_resource($res)) - { - cubrid_close_request($res); - $this->result_id = FALSE; - } - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if(is_resource($this->result_id) || - get_resource_type($this->result_id) == "Unknown" && - preg_match('/Resource id #/', strval($this->result_id))) - { - cubrid_close_request($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return cubrid_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return cubrid_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return cubrid_fetch_object($this->result_id); - } - -} - - -/* End of file cubrid_result.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/cubrid/cubrid_utility.php b/sources/web/system/database/drivers/cubrid/cubrid_utility.php deleted file mode 100644 index cd16d1e..0000000 --- a/sources/web/system/database/drivers/cubrid/cubrid_utility.php +++ /dev/null @@ -1,108 +0,0 @@ -conn_id) - { - return "SELECT '" . $this->database . "'"; - } - else - { - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Optimize table query - * - * Generates a platform-specific query so that a table can be optimized - * - * @access private - * @param string the table name - * @return object - * @link http://www.cubrid.org/manual/840/en/Optimize%20Database - */ - function _optimize_table($table) - { - // No SQL based support in CUBRID as of version 8.4.0. Database or - // table optimization can be performed using CUBRID Manager - // database administration tool. See the link above for more info. - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Generates a platform-specific query so that a table can be repaired - * - * @access private - * @param string the table name - * @return object - * @link http://www.cubrid.org/manual/840/en/Checking%20Database%20Consistency - */ - function _repair_table($table) - { - // Not supported in CUBRID as of version 8.4.0. Database or - // table consistency can be checked using CUBRID Manager - // database administration tool. See the link above for more info. - return FALSE; - } - - // -------------------------------------------------------------------- - /** - * CUBRID Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - // No SQL based support in CUBRID as of version 8.4.0. Database or - // table backup can be performed using CUBRID Manager - // database administration tool. - return $this->db->display_error('db_unsuported_feature'); - } -} - -/* End of file cubrid_utility.php */ -/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/cubrid/index.html b/sources/web/system/database/drivers/cubrid/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/cubrid/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/index.html b/sources/web/system/database/drivers/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/mssql/index.html b/sources/web/system/database/drivers/mssql/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/mssql/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/mssql/mssql_driver.php b/sources/web/system/database/drivers/mssql/mssql_driver.php deleted file mode 100644 index b39bd93..0000000 --- a/sources/web/system/database/drivers/mssql/mssql_driver.php +++ /dev/null @@ -1,667 +0,0 @@ -port != '') - { - $this->hostname .= ','.$this->port; - } - - return @mssql_connect($this->hostname, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - if ($this->port != '') - { - $this->hostname .= ','.$this->port; - } - - return @mssql_pconnect($this->hostname, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - // not implemented in MSSQL - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - // Note: The brackets are required in the event that the DB name - // contains reserved characters - return @mssql_select_db('['.$this->database.']', $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @mssql_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - $this->simple_query('BEGIN TRAN'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('COMMIT TRAN'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('ROLLBACK TRAN'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - // Escape single quotes - $str = str_replace("'", "''", remove_invisible_characters($str)); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( - array($this->_like_escape_chr, '%', '_'), - array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), - $str - ); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @mssql_rows_affected($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @access public - * @return integer - */ - function insert_id() - { - $ver = self::_parse_major_version($this->version()); - $sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id"); - $query = $this->query($sql); - $row = $query->row(); - return $row->last_id; - } - - // -------------------------------------------------------------------- - - /** - * Parse major version - * - * Grabs the major version number from the - * database server version string passed in. - * - * @access private - * @param string $version - * @return int16 major version number - */ - function _parse_major_version($version) - { - preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); - return $ver_info[1]; // return the major version b/c that's all we're interested in. - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT @@VERSION AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; - - // for future compatibility - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - return FALSE; // not currently supported - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access private - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'"; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT TOP 1 * FROM ".$table; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return mssql_get_last_message(); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - // Are error numbers supported? - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return implode(', ', $tables); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - $i = $limit + $offset; - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @mssql_close($conn_id); - } - -} - - - -/* End of file mssql_driver.php */ -/* Location: ./system/database/drivers/mssql/mssql_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mssql/mssql_forge.php b/sources/web/system/database/drivers/mssql/mssql_forge.php deleted file mode 100644 index 70b20ec..0000000 --- a/sources/web/system/database/drivers/mssql/mssql_forge.php +++ /dev/null @@ -1,248 +0,0 @@ -db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param array the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - // I think this syntax will work, but can find little documentation on renaming tables in MSSQL - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - -} - -/* End of file mssql_forge.php */ -/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mssql/mssql_result.php b/sources/web/system/database/drivers/mssql/mssql_result.php deleted file mode 100644 index 2897ca5..0000000 --- a/sources/web/system/database/drivers/mssql/mssql_result.php +++ /dev/null @@ -1,169 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @mssql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - while ($field = mssql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - while ($field = mssql_fetch_field($this->result_id)) - { - $F = new stdClass(); - $F->name = $field->name; - $F->type = $field->type; - $F->max_length = $field->max_length; - $F->primary_key = 0; - $F->default = ''; - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_resource($this->result_id)) - { - mssql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return mssql_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return mssql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return mssql_fetch_object($this->result_id); - } - -} - - -/* End of file mssql_result.php */ -/* Location: ./system/database/drivers/mssql/mssql_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mssql/mssql_utility.php b/sources/web/system/database/drivers/mssql/mssql_utility.php deleted file mode 100644 index 48ecbc7..0000000 --- a/sources/web/system/database/drivers/mssql/mssql_utility.php +++ /dev/null @@ -1,88 +0,0 @@ -db->display_error('db_unsuported_feature'); - } - -} - -/* End of file mssql_utility.php */ -/* Location: ./system/database/drivers/mssql/mssql_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysql/index.html b/sources/web/system/database/drivers/mysql/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/mysql/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysql/mysql_driver.php b/sources/web/system/database/drivers/mysql/mysql_driver.php deleted file mode 100644 index f87cfea..0000000 --- a/sources/web/system/database/drivers/mysql/mysql_driver.php +++ /dev/null @@ -1,779 +0,0 @@ -port != '') - { - $this->hostname .= ':'.$this->port; - } - - return @mysql_connect($this->hostname, $this->username, $this->password, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - if ($this->port != '') - { - $this->hostname .= ':'.$this->port; - } - - return @mysql_pconnect($this->hostname, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - if (mysql_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - return @mysql_select_db($this->database, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - if ( ! isset($this->use_set_names)) - { - // mysql_set_charset() requires PHP >= 5.2.3 and MySQL >= 5.0.7, use SET NAMES as fallback - $this->use_set_names = (version_compare(PHP_VERSION, '5.2.3', '>=') && version_compare(mysql_get_server_info(), '5.0.7', '>=')) ? FALSE : TRUE; - } - - if ($this->use_set_names === TRUE) - { - return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id); - } - else - { - return @mysql_set_charset($charset, $this->conn_id); - } - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT version() AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @mysql_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - // "DELETE FROM TABLE" returns 0 affected rows This hack modifies - // the query so that it returns the number of affected rows - if ($this->delete_hack === TRUE) - { - if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - $this->simple_query('SET AUTOCOMMIT=0'); - $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('COMMIT'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('ROLLBACK'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) - { - $str = mysql_real_escape_string($str, $this->conn_id); - } - elseif (function_exists('mysql_escape_string')) - { - $str = mysql_escape_string($str); - } - else - { - $str = addslashes($str); - } - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @mysql_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - return @mysql_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "DESCRIBE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return mysql_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return mysql_errno($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _replace($table, $keys, $values) - { - return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert_batch($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); - } - - // -------------------------------------------------------------------- - - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key . ' = ' . $val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @return string - */ - function _update_batch($table, $values, $index, $where = NULL) - { - $ids = array(); - $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; - - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field != $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $sql = "UPDATE ".$table." SET "; - $cases = ''; - - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n"; - foreach ($v as $row) - { - $cases .= $row."\n"; - } - - $cases .= 'ELSE '.$k.' END, '; - } - - $sql .= substr($cases, 0, -2); - - $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; - - return $sql; - } - - // -------------------------------------------------------------------- - - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - if ($offset == 0) - { - $offset = ''; - } - else - { - $offset .= ", "; - } - - return $sql."LIMIT ".$offset.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @mysql_close($conn_id); - } - -} - - -/* End of file mysql_driver.php */ -/* Location: ./system/database/drivers/mysql/mysql_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysql/mysql_forge.php b/sources/web/system/database/drivers/mysql/mysql_forge.php deleted file mode 100644 index c1cae13..0000000 --- a/sources/web/system/database/drivers/mysql/mysql_forge.php +++ /dev/null @@ -1,273 +0,0 @@ -$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - if (array_key_exists('NAME', $attributes)) - { - $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; - } - - if (array_key_exists('TYPE', $attributes)) - { - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - switch ($attributes['TYPE']) - { - case 'decimal': - case 'float': - case 'numeric': - $sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; - break; - - case 'enum': - case 'set': - $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; - break; - - default: - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - } - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param mixed the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - - $sql .= $this->_process_fields($fields); - - if (count($primary_keys) > 0) - { - $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key_name = $this->db->_protect_identifiers(implode('_', $key)); - $key = $this->db->_protect_identifiers($key); - } - else - { - $key_name = $this->db->_protect_identifiers($key); - $key = array($key_name); - } - - $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return string - */ - function _drop_table($table) - { - return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param array fields - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $fields, $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql.$this->db->_protect_identifiers($fields); - } - - $sql .= $this->_process_fields($fields); - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - -} - -/* End of file mysql_forge.php */ -/* Location: ./system/database/drivers/mysql/mysql_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysql/mysql_result.php b/sources/web/system/database/drivers/mysql/mysql_result.php deleted file mode 100644 index e1a6e93..0000000 --- a/sources/web/system/database/drivers/mysql/mysql_result.php +++ /dev/null @@ -1,174 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @mysql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - while ($field = mysql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - while ($field = mysql_fetch_object($this->result_id)) - { - preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); - - $type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; - $length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; - - $F = new stdClass(); - $F->name = $field->Field; - $F->type = $type; - $F->default = $field->Default; - $F->max_length = $length; - $F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_resource($this->result_id)) - { - mysql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return mysql_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return mysql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return mysql_fetch_object($this->result_id); - } - -} - - -/* End of file mysql_result.php */ -/* Location: ./system/database/drivers/mysql/mysql_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysql/mysql_utility.php b/sources/web/system/database/drivers/mysql/mysql_utility.php deleted file mode 100644 index 48c4d63..0000000 --- a/sources/web/system/database/drivers/mysql/mysql_utility.php +++ /dev/null @@ -1,210 +0,0 @@ -db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Generates a platform-specific query so that a table can be repaired - * - * @access private - * @param string the table name - * @return object - */ - function _repair_table($table) - { - return "REPAIR TABLE ".$this->db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - /** - * MySQL Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - if (count($params) == 0) - { - return FALSE; - } - - // Extract the prefs for simplicity - extract($params); - - // Build the output - $output = ''; - foreach ((array)$tables as $table) - { - // Is the table in the "ignore" list? - if (in_array($table, (array)$ignore, TRUE)) - { - continue; - } - - // Get the table schema - $query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.`'.$table.'`'); - - // No result means the table name was invalid - if ($query === FALSE) - { - continue; - } - - // Write out the table schema - $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - - if ($add_drop == TRUE) - { - $output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline; - } - - $i = 0; - $result = $query->result_array(); - foreach ($result[0] as $val) - { - if ($i++ % 2) - { - $output .= $val.';'.$newline.$newline; - } - } - - // If inserts are not needed we're done... - if ($add_insert == FALSE) - { - continue; - } - - // Grab all the data from the current table - $query = $this->db->query("SELECT * FROM $table"); - - if ($query->num_rows() == 0) - { - continue; - } - - // Fetch the field names and determine if the field is an - // integer type. We use this info to decide whether to - // surround the data with quotes or not - - $i = 0; - $field_str = ''; - $is_int = array(); - while ($field = mysql_fetch_field($query->result_id)) - { - // Most versions of MySQL store timestamp as a string - $is_int[$i] = (in_array( - strtolower(mysql_field_type($query->result_id, $i)), - array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), - TRUE) - ) ? TRUE : FALSE; - - // Create a string of field names - $field_str .= '`'.$field->name.'`, '; - $i++; - } - - // Trim off the end comma - $field_str = preg_replace( "/, $/" , "" , $field_str); - - - // Build the insert string - foreach ($query->result_array() as $row) - { - $val_str = ''; - - $i = 0; - foreach ($row as $v) - { - // Is the value NULL? - if ($v === NULL) - { - $val_str .= 'NULL'; - } - else - { - // Escape the data if it's not an integer - if ($is_int[$i] == FALSE) - { - $val_str .= $this->db->escape($v); - } - else - { - $val_str .= $v; - } - } - - // Append a comma - $val_str .= ', '; - $i++; - } - - // Remove the comma at the end of the string - $val_str = preg_replace( "/, $/" , "" , $val_str); - - // Build the INSERT string - $output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline; - } - - $output .= $newline.$newline; - } - - return $output; - } -} - -/* End of file mysql_utility.php */ -/* Location: ./system/database/drivers/mysql/mysql_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysqli/index.html b/sources/web/system/database/drivers/mysqli/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/mysqli/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysqli/mysqli_driver.php b/sources/web/system/database/drivers/mysqli/mysqli_driver.php deleted file mode 100644 index d3200f3..0000000 --- a/sources/web/system/database/drivers/mysqli/mysqli_driver.php +++ /dev/null @@ -1,776 +0,0 @@ -port != '') - { - return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port); - } - else - { - return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database); - } - - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - return $this->db_connect(); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - if (mysqli_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - return @mysqli_select_db($this->conn_id, $this->database); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access private - * @param string - * @param string - * @return resource - */ - function _db_set_charset($charset, $collation) - { - if ( ! isset($this->use_set_names)) - { - // mysqli_set_charset() requires MySQL >= 5.0.7, use SET NAMES as fallback - $this->use_set_names = (version_compare(mysqli_get_server_info($this->conn_id), '5.0.7', '>=')) ? FALSE : TRUE; - } - - if ($this->use_set_names === TRUE) - { - return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'"); - } - else - { - return @mysqli_set_charset($this->conn_id, $charset); - } - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT version() AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - $result = @mysqli_query($this->conn_id, $sql); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - // "DELETE FROM TABLE" returns 0 affected rows This hack modifies - // the query so that it returns the number of affected rows - if ($this->delete_hack === TRUE) - { - if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - $this->simple_query('SET AUTOCOMMIT=0'); - $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('COMMIT'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('ROLLBACK'); - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id)) - { - $str = mysqli_real_escape_string($this->conn_id, $str); - } - elseif (function_exists('mysql_escape_string')) - { - $str = mysql_escape_string($str); - } - else - { - $str = addslashes($str); - } - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @mysqli_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - return @mysqli_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "DESCRIBE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return mysqli_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return mysqli_errno($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert_batch($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); - } - - // -------------------------------------------------------------------- - - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _replace($table, $keys, $values) - { - return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @return string - */ - function _update_batch($table, $values, $index, $where = NULL) - { - $ids = array(); - $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; - - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field != $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $sql = "UPDATE ".$table." SET "; - $cases = ''; - - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n"; - foreach ($v as $row) - { - $cases .= $row."\n"; - } - - $cases .= 'ELSE '.$k.' END, '; - } - - $sql .= substr($cases, 0, -2); - - $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - $sql .= "LIMIT ".$limit; - - if ($offset > 0) - { - $sql .= " OFFSET ".$offset; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @mysqli_close($conn_id); - } - - -} - - -/* End of file mysqli_driver.php */ -/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysqli/mysqli_forge.php b/sources/web/system/database/drivers/mysqli/mysqli_forge.php deleted file mode 100644 index 2605494..0000000 --- a/sources/web/system/database/drivers/mysqli/mysqli_forge.php +++ /dev/null @@ -1,258 +0,0 @@ -$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - if (array_key_exists('NAME', $attributes)) - { - $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; - } - - if (array_key_exists('TYPE', $attributes)) - { - $sql .= ' '.$attributes['TYPE']; - } - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param mixed the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - - $sql .= $this->_process_fields($fields); - - if (count($primary_keys) > 0) - { - $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key_name = $this->db->_protect_identifiers(implode('_', $key)); - $key = $this->db->_protect_identifiers($key); - } - else - { - $key_name = $this->db->_protect_identifiers($key); - $key = array($key_name); - } - - $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return string - */ - function _drop_table($table) - { - return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param array fields - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $fields, $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql.$this->db->_protect_identifiers($fields); - } - - $sql .= $this->_process_fields($fields); - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - -} - -/* End of file mysqli_forge.php */ -/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysqli/mysqli_result.php b/sources/web/system/database/drivers/mysqli/mysqli_result.php deleted file mode 100644 index 124d4e5..0000000 --- a/sources/web/system/database/drivers/mysqli/mysqli_result.php +++ /dev/null @@ -1,174 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @mysqli_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - while ($field = mysqli_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - while ($field = mysqli_fetch_object($this->result_id)) - { - preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); - - $type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; - $length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; - - $F = new stdClass(); - $F->name = $field->Field; - $F->type = $type; - $F->default = $field->Default; - $F->max_length = $length; - $F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_object($this->result_id)) - { - mysqli_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return mysqli_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return mysqli_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return mysqli_fetch_object($this->result_id); - } - -} - - -/* End of file mysqli_result.php */ -/* Location: ./system/database/drivers/mysqli/mysqli_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/mysqli/mysqli_utility.php b/sources/web/system/database/drivers/mysqli/mysqli_utility.php deleted file mode 100644 index e17889b..0000000 --- a/sources/web/system/database/drivers/mysqli/mysqli_utility.php +++ /dev/null @@ -1,87 +0,0 @@ -db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Generates a platform-specific query so that a table can be repaired - * - * @access private - * @param string the table name - * @return object - */ - function _repair_table($table) - { - return "REPAIR TABLE ".$this->db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * MySQLi Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - // Currently unsupported - return $this->db->display_error('db_unsuported_feature'); - } -} - -/* End of file mysqli_utility.php */ -/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/oci8/index.html b/sources/web/system/database/drivers/oci8/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/oci8/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/oci8/oci8_driver.php b/sources/web/system/database/drivers/oci8/oci8_driver.php deleted file mode 100644 index 930177e..0000000 --- a/sources/web/system/database/drivers/oci8/oci8_driver.php +++ /dev/null @@ -1,808 +0,0 @@ -username, $this->password, $this->hostname, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - public function db_pconnect() - { - return @oci_pconnect($this->username, $this->password, $this->hostname, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - public function reconnect() - { - // not implemented in oracle - return; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - public function db_select() - { - // Not in Oracle - schemas are actually usernames - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - public function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access protected - * @return string - */ - protected function _version() - { - return oci_server_version($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access protected called by the base class - * @param string an SQL query - * @return resource - */ - protected function _execute($sql) - { - // oracle must parse the query before it is run. All of the actions with - // the query are based on the statement id returned by ociparse - $this->stmt_id = FALSE; - $this->_set_stmt_id($sql); - oci_set_prefetch($this->stmt_id, 1000); - return @oci_execute($this->stmt_id, $this->_commit); - } - - /** - * Generate a statement ID - * - * @access private - * @param string an SQL query - * @return none - */ - private function _set_stmt_id($sql) - { - if ( ! is_resource($this->stmt_id)) - { - $this->stmt_id = oci_parse($this->conn_id, $this->_prep_query($sql)); - } - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - private function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * getCursor. Returns a cursor from the datbase - * - * @access public - * @return cursor id - */ - public function get_cursor() - { - $this->curs_id = oci_new_cursor($this->conn_id); - return $this->curs_id; - } - - // -------------------------------------------------------------------- - - /** - * Stored Procedure. Executes a stored procedure - * - * @access public - * @param package package stored procedure is in - * @param procedure stored procedure to execute - * @param params array of parameters - * @return array - * - * params array keys - * - * KEY OPTIONAL NOTES - * name no the name of the parameter should be in : format - * value no the value of the parameter. If this is an OUT or IN OUT parameter, - * this should be a reference to a variable - * type yes the type of the parameter - * length yes the max size of the parameter - */ - public function stored_procedure($package, $procedure, $params) - { - if ($package == '' OR $procedure == '' OR ! is_array($params)) - { - if ($this->db_debug) - { - log_message('error', 'Invalid query: '.$package.'.'.$procedure); - return $this->display_error('db_invalid_query'); - } - return FALSE; - } - - // build the query string - $sql = "begin $package.$procedure("; - - $have_cursor = FALSE; - foreach ($params as $param) - { - $sql .= $param['name'] . ","; - - if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR)) - { - $have_cursor = TRUE; - } - } - $sql = trim($sql, ",") . "); end;"; - - $this->stmt_id = FALSE; - $this->_set_stmt_id($sql); - $this->_bind_params($params); - $this->query($sql, FALSE, $have_cursor); - } - - // -------------------------------------------------------------------- - - /** - * Bind parameters - * - * @access private - * @return none - */ - private function _bind_params($params) - { - if ( ! is_array($params) OR ! is_resource($this->stmt_id)) - { - return; - } - - foreach ($params as $param) - { - foreach (array('name', 'value', 'type', 'length') as $val) - { - if ( ! isset($param[$val])) - { - $param[$val] = ''; - } - } - - oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); - } - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - public function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - $this->_commit = OCI_DEFAULT; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - public function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = oci_commit($this->conn_id); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - public function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = oci_rollback($this->conn_id); - $this->_commit = OCI_COMMIT_ON_SUCCESS; - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - public function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - $str = remove_invisible_characters($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), - $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - public function affected_rows() - { - return @oci_num_rows($this->stmt_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - public function insert_id() - { - // not supported in oracle - return $this->display_error('db_unsupported_function'); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - public function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query == FALSE) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access protected - * @param boolean - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT TABLE_NAME FROM ALL_TABLES"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access protected - * @param string the table name - * @return string - */ - protected function _list_columns($table = '') - { - return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'"; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - protected function _field_data($table) - { - return "SELECT * FROM ".$table." where rownum = 1"; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access protected - * @return string - */ - protected function _error_message() - { - // If the error was during connection, no conn_id should be passed - $error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); - return $error['message']; - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access protected - * @return integer - */ - protected function _error_number() - { - // Same as _error_message() - $error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); - return $error['code']; - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access protected - * @param string - * @return string - */ - protected function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access protected - * @param type - * @return type - */ - protected function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return implode(', ', $tables); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access protected - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - $keys = implode(', ', $keys); - $sql = "INSERT ALL\n"; - - for ($i = 0, $c = count($values); $i < $c; $i++) - { - $sql .= ' INTO ' . $table . ' (' . $keys . ') VALUES ' . $values[$i] . "\n"; - } - - $sql .= 'SELECT * FROM dual'; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access protected - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access protected - * @param string the table name - * @return string - */ - protected function _truncate($table) - { - return "TRUNCATE TABLE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access protected - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - protected function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access protected - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - protected function _limit($sql, $limit, $offset) - { - $limit = $offset + $limit; - $newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)"; - - if ($offset != 0) - { - $newsql .= " WHERE rnum >= $offset"; - } - - // remember that we used limits - $this->limit_used = TRUE; - - return $newsql; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access protected - * @param resource - * @return void - */ - protected function _close($conn_id) - { - @oci_close($conn_id); - } - - -} - - - -/* End of file oci8_driver.php */ -/* Location: ./system/database/drivers/oci8/oci8_driver.php */ diff --git a/sources/web/system/database/drivers/oci8/oci8_forge.php b/sources/web/system/database/drivers/oci8/oci8_forge.php deleted file mode 100644 index 3cd1758..0000000 --- a/sources/web/system/database/drivers/oci8/oci8_forge.php +++ /dev/null @@ -1,248 +0,0 @@ -db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return bool - */ - function _drop_table($table) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - - -} - -/* End of file oci8_forge.php */ -/* Location: ./system/database/drivers/oci8/oci8_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/oci8/oci8_result.php b/sources/web/system/database/drivers/oci8/oci8_result.php deleted file mode 100644 index ae133d7..0000000 --- a/sources/web/system/database/drivers/oci8/oci8_result.php +++ /dev/null @@ -1,219 +0,0 @@ -num_rows === 0 && count($this->result_array()) > 0) - { - $this->num_rows = count($this->result_array()); - @oci_execute($this->stmt_id); - - if ($this->curs_id) - { - @oci_execute($this->curs_id); - } - } - - return $rowcount; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - public function num_fields() - { - $count = @oci_num_fields($this->stmt_id); - - // if we used a limit we subtract it - if ($this->limit_used) - { - $count = $count - 1; - } - - return $count; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $field_names[] = oci_field_name($this->stmt_id, $c); - } - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - public function field_data() - { - $retval = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $F = new stdClass(); - $F->name = oci_field_name($this->stmt_id, $c); - $F->type = oci_field_type($this->stmt_id, $c); - $F->max_length = oci_field_size($this->stmt_id, $c); - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - oci_free_statement($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access protected - * @return array - */ - protected function _fetch_assoc() - { - $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; - return oci_fetch_assoc($id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access protected - * @return object - */ - protected function _fetch_object() - { - $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; - return @oci_fetch_object($id); - } - - // -------------------------------------------------------------------- - - /** - * Query result. "array" version. - * - * @access public - * @return array - */ - public function result_array() - { - if (count($this->result_array) > 0) - { - return $this->result_array; - } - - $row = NULL; - while ($row = $this->_fetch_assoc()) - { - $this->result_array[] = $row; - } - - return $this->result_array; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access protected - * @return array - */ - protected function _data_seek($n = 0) - { - return FALSE; // Not needed - } - -} - - -/* End of file oci8_result.php */ -/* Location: ./system/database/drivers/oci8/oci8_result.php */ diff --git a/sources/web/system/database/drivers/oci8/oci8_utility.php b/sources/web/system/database/drivers/oci8/oci8_utility.php deleted file mode 100644 index 854b467..0000000 --- a/sources/web/system/database/drivers/oci8/oci8_utility.php +++ /dev/null @@ -1,87 +0,0 @@ -db->display_error('db_unsuported_feature'); - } -} - -/* End of file oci8_utility.php */ -/* Location: ./system/database/drivers/oci8/oci8_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/odbc/index.html b/sources/web/system/database/drivers/odbc/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/odbc/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/odbc/odbc_driver.php b/sources/web/system/database/drivers/odbc/odbc_driver.php deleted file mode 100644 index bcd7937..0000000 --- a/sources/web/system/database/drivers/odbc/odbc_driver.php +++ /dev/null @@ -1,637 +0,0 @@ -_random_keyword = ' RND('.time().')'; // database specific random keyword - } - - /** - * Non-persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_connect() - { - return @odbc_connect($this->hostname, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - return @odbc_pconnect($this->hostname, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - // not implemented in odbc - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - // Not needed for ODBC - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT version() AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @odbc_exec($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - return odbc_autocommit($this->conn_id, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = odbc_commit($this->conn_id); - odbc_autocommit($this->conn_id, TRUE); - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = odbc_rollback($this->conn_id); - odbc_autocommit($this->conn_id, TRUE); - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - // ODBC doesn't require escaping - $str = remove_invisible_characters($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), - $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @odbc_num_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - return @odbc_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SHOW TABLES FROM `".$this->database."`"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - return FALSE; // not currently supported - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SHOW COLUMNS FROM ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT TOP 1 FROM ".$table; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return odbc_errormsg($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return odbc_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return $this->_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - // Does ODBC doesn't use the LIMIT clause? - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @odbc_close($conn_id); - } - - -} - - - -/* End of file odbc_driver.php */ -/* Location: ./system/database/drivers/odbc/odbc_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/odbc/odbc_forge.php b/sources/web/system/database/drivers/odbc/odbc_forge.php deleted file mode 100644 index 3ec86b4..0000000 --- a/sources/web/system/database/drivers/odbc/odbc_forge.php +++ /dev/null @@ -1,266 +0,0 @@ -db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @access private - * @param string the database name - * @return bool - */ - function _drop_database($name) - { - // ODBC has no "drop database" command since it's - // designed to connect to an existing database - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param array the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return bool - */ - function _drop_table($table) - { - // Not a supported ODBC feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - - -} - -/* End of file odbc_forge.php */ -/* Location: ./system/database/drivers/odbc/odbc_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/odbc/odbc_result.php b/sources/web/system/database/drivers/odbc/odbc_result.php deleted file mode 100644 index 5d64a46..0000000 --- a/sources/web/system/database/drivers/odbc/odbc_result.php +++ /dev/null @@ -1,228 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @odbc_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $field_names[] = odbc_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $F = new stdClass(); - $F->name = odbc_field_name($this->result_id, $i); - $F->type = odbc_field_type($this->result_id, $i); - $F->max_length = odbc_field_len($this->result_id, $i); - $F->primary_key = 0; - $F->default = ''; - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_resource($this->result_id)) - { - odbc_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - if (function_exists('odbc_fetch_object')) - { - return odbc_fetch_array($this->result_id); - } - else - { - return $this->_odbc_fetch_array($this->result_id); - } - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - if (function_exists('odbc_fetch_object')) - { - return odbc_fetch_object($this->result_id); - } - else - { - return $this->_odbc_fetch_object($this->result_id); - } - } - - - /** - * Result - object - * - * subsititutes the odbc_fetch_object function when - * not available (odbc_fetch_object requires unixODBC) - * - * @access private - * @return object - */ - function _odbc_fetch_object(& $odbc_result) { - $rs = array(); - $rs_obj = FALSE; - if (odbc_fetch_into($odbc_result, $rs)) { - foreach ($rs as $k=>$v) { - $field_name= odbc_field_name($odbc_result, $k+1); - $rs_obj->$field_name = $v; - } - } - return $rs_obj; - } - - - /** - * Result - array - * - * subsititutes the odbc_fetch_array function when - * not available (odbc_fetch_array requires unixODBC) - * - * @access private - * @return array - */ - function _odbc_fetch_array(& $odbc_result) { - $rs = array(); - $rs_assoc = FALSE; - if (odbc_fetch_into($odbc_result, $rs)) { - $rs_assoc=array(); - foreach ($rs as $k=>$v) { - $field_name= odbc_field_name($odbc_result, $k+1); - $rs_assoc[$field_name] = $v; - } - } - return $rs_assoc; - } - -} - - -/* End of file odbc_result.php */ -/* Location: ./system/database/drivers/odbc/odbc_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/odbc/odbc_utility.php b/sources/web/system/database/drivers/odbc/odbc_utility.php deleted file mode 100644 index d335bed..0000000 --- a/sources/web/system/database/drivers/odbc/odbc_utility.php +++ /dev/null @@ -1,103 +0,0 @@ -db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Optimize table query - * - * Generates a platform-specific query so that a table can be optimized - * - * @access private - * @param string the table name - * @return object - */ - function _optimize_table($table) - { - // Not a supported ODBC feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Generates a platform-specific query so that a table can be repaired - * - * @access private - * @param string the table name - * @return object - */ - function _repair_table($table) - { - // Not a supported ODBC feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * ODBC Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - // Currently unsupported - return $this->db->display_error('db_unsuported_feature'); - } - -} - -/* End of file odbc_utility.php */ -/* Location: ./system/database/drivers/odbc/odbc_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/pdo/index.html b/sources/web/system/database/drivers/pdo/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/pdo/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/pdo/pdo_driver.php b/sources/web/system/database/drivers/pdo/pdo_driver.php deleted file mode 100644 index 1ecc90a..0000000 --- a/sources/web/system/database/drivers/pdo/pdo_driver.php +++ /dev/null @@ -1,812 +0,0 @@ -hostname, 'mysql') !== FALSE) - { - $this->_like_escape_str = ''; - $this->_like_escape_chr = ''; - - //Prior to this version, the charset can't be set in the dsn - if(is_php('5.3.6')) - { - $this->hostname .= ";charset={$this->char_set}"; - } - - //Set the charset with the connection options - $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; - } - elseif (strpos($this->hostname, 'odbc') !== FALSE) - { - $this->_like_escape_str = " {escape '%s'} "; - $this->_like_escape_chr = '!'; - } - else - { - $this->_like_escape_str = " ESCAPE '%s' "; - $this->_like_escape_chr = '!'; - } - - empty($this->database) OR $this->hostname .= ';dbname='.$this->database; - - $this->trans_enabled = FALSE; - - $this->_random_keyword = ' RND('.time().')'; // database specific random keyword - } - - /** - * Non-persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_connect() - { - $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; - - return new PDO($this->hostname, $this->username, $this->password, $this->options); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; - $this->options['PDO::ATTR_PERSISTENT'] = TRUE; - - return new PDO($this->hostname, $this->username, $this->password, $this->options); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - // Not needed for PDO - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return $this->conn_id->getAttribute(PDO::ATTR_CLIENT_VERSION); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return object - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - $result_id = $this->conn_id->prepare($sql); - $result_id->execute(); - - if (is_object($result_id)) - { - if (is_numeric(stripos($sql, 'SELECT'))) - { - $this->affect_rows = count($result_id->fetchAll()); - $result_id->execute(); - } - else - { - $this->affect_rows = $result_id->rowCount(); - } - } - else - { - $this->affect_rows = 0; - } - - return $result_id; - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = (bool) ($test_mode === TRUE); - - return $this->conn_id->beginTransaction(); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = $this->conn->commit(); - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $ret = $this->conn_id->rollBack(); - return $ret; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - //Escape the string - $str = $this->conn_id->quote($str); - - //If there are duplicated quotes, trim them away - if (strpos($str, "'") === 0) - { - $str = substr($str, 1, -1); - } - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), - $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return $this->affect_rows; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id($name=NULL) - { - //Convenience method for postgres insertid - if (strpos($this->hostname, 'pgsql') !== FALSE) - { - $v = $this->_version(); - - $table = func_num_args() > 0 ? func_get_arg(0) : NULL; - - if ($table == NULL && $v >= '8.1') - { - $sql='SELECT LASTVAL() as ins_id'; - } - $query = $this->query($sql); - $row = $query->row(); - return $row->ins_id; - } - else - { - return $this->conn_id->lastInsertId($name); - } - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SHOW TABLES FROM `".$this->database."`"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - return FALSE; // not currently supported - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SHOW COLUMNS FROM ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT TOP 1 FROM ".$table; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - $error_array = $this->conn_id->errorInfo(); - return $error_array[2]; - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return $this->conn_id->errorCode(); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return (count($tables) == 1) ? $tables[0] : '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert_batch($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @return string - */ - function _update_batch($table, $values, $index, $where = NULL) - { - $ids = array(); - $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; - - foreach ($values as $key => $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field != $index) - { - $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; - } - } - } - - $sql = "UPDATE ".$table." SET "; - $cases = ''; - - foreach ($final as $k => $v) - { - $cases .= $k.' = CASE '."\n"; - foreach ($v as $row) - { - $cases .= $row."\n"; - } - - $cases .= 'ELSE '.$k.' END, '; - } - - $sql .= substr($cases, 0, -2); - - $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; - - return $sql; - } - - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return $this->_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE) - { - if ($offset == 0) - { - $offset = ''; - } - else - { - $offset .= ", "; - } - - return $sql."LIMIT ".$offset.$limit; - } - else - { - $sql .= "LIMIT ".$limit; - - if ($offset > 0) - { - $sql .= " OFFSET ".$offset; - } - - return $sql; - } - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - $this->conn_id = null; - } - - -} - - - -/* End of file pdo_driver.php */ -/* Location: ./system/database/drivers/pdo/pdo_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/pdo/pdo_forge.php b/sources/web/system/database/drivers/pdo/pdo_forge.php deleted file mode 100644 index 9a78220..0000000 --- a/sources/web/system/database/drivers/pdo/pdo_forge.php +++ /dev/null @@ -1,266 +0,0 @@ -db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @access private - * @param string the database name - * @return bool - */ - function _drop_database($name) - { - // PDO has no "drop database" command since it's - // designed to connect to an existing database - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param array the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return bool - */ - function _drop_table($table) - { - // Not a supported PDO feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - - -} - -/* End of file pdo_forge.php */ -/* Location: ./system/database/drivers/pdo/pdo_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/pdo/pdo_result.php b/sources/web/system/database/drivers/pdo/pdo_result.php deleted file mode 100644 index a366a5f..0000000 --- a/sources/web/system/database/drivers/pdo/pdo_result.php +++ /dev/null @@ -1,182 +0,0 @@ -result_id->queryString, 'SELECT'))) - { - $dbh = $this->conn_id; - $query = $dbh->query($this->result_id->queryString); - $result = $query->fetchAll(); - unset($dbh, $query); - return count($result); - } - else - { - return $this->result_id->rowCount(); - } - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return $this->result_id->columnCount(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $data = array(); - - try - { - for($i = 0; $i < $this->num_fields(); $i++) - { - $data[] = $this->result_id->getColumnMeta($i); - } - - return $data; - } - catch (Exception $e) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return $this->result_id->fetch(PDO::FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return $this->result_id->fetchObject(); - } - -} - - -/* End of file pdo_result.php */ -/* Location: ./system/database/drivers/pdo/pdo_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/pdo/pdo_utility.php b/sources/web/system/database/drivers/pdo/pdo_utility.php deleted file mode 100644 index 88ce033..0000000 --- a/sources/web/system/database/drivers/pdo/pdo_utility.php +++ /dev/null @@ -1,103 +0,0 @@ -db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Optimize table query - * - * Generates a platform-specific query so that a table can be optimized - * - * @access private - * @param string the table name - * @return object - */ - function _optimize_table($table) - { - // Not a supported PDO feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Generates a platform-specific query so that a table can be repaired - * - * @access private - * @param string the table name - * @return object - */ - function _repair_table($table) - { - // Not a supported PDO feature - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * PDO Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - // Currently unsupported - return $this->db->display_error('db_unsuported_feature'); - } - -} - -/* End of file pdo_utility.php */ -/* Location: ./system/database/drivers/pdo/pdo_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/postgre/index.html b/sources/web/system/database/drivers/postgre/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/postgre/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/postgre/postgre_driver.php b/sources/web/system/database/drivers/postgre/postgre_driver.php deleted file mode 100644 index 5367f97..0000000 --- a/sources/web/system/database/drivers/postgre/postgre_driver.php +++ /dev/null @@ -1,703 +0,0 @@ - 'host', - 'port' => 'port', - 'database' => 'dbname', - 'username' => 'user', - 'password' => 'password' - ); - - $connect_string = ""; - foreach ($components as $key => $val) - { - if (isset($this->$key) && $this->$key != '') - { - $connect_string .= " $val=".$this->$key; - } - } - return trim($connect_string); - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_connect() - { - return @pg_connect($this->_connect_string()); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - return @pg_pconnect($this->_connect_string()); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - if (pg_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - // Not needed for Postgre so we'll return TRUE - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return "SELECT version() AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @pg_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - return @pg_exec($this->conn_id, "begin"); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - return @pg_exec($this->conn_id, "commit"); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - return @pg_exec($this->conn_id, "rollback"); - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - $str = pg_escape_string($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), - $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @pg_affected_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - $v = $this->_version(); - $v = $v['server']; - - $table = func_num_args() > 0 ? func_get_arg(0) : NULL; - $column = func_num_args() > 1 ? func_get_arg(1) : NULL; - - if ($table == NULL && $v >= '8.1') - { - $sql='SELECT LASTVAL() as ins_id'; - } - elseif ($table != NULL && $column != NULL && $v >= '8.0') - { - $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column); - $query = $this->query($sql); - $row = $query->row(); - $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq); - } - elseif ($table != NULL) - { - // seq_name passed in table parameter - $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table); - } - else - { - return pg_last_oid($this->result_id); - } - $query = $this->query($sql); - $row = $query->row(); - return $row->ins_id; - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'"; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT * FROM ".$table." LIMIT 1"; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return pg_last_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return implode(', ', $tables); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Insert_batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert_batch($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - $sql .= "LIMIT ".$limit; - - if ($offset > 0) - { - $sql .= " OFFSET ".$offset; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @pg_close($conn_id); - } - - -} - - -/* End of file postgre_driver.php */ -/* Location: ./system/database/drivers/postgre/postgre_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/postgre/postgre_forge.php b/sources/web/system/database/drivers/postgre/postgre_forge.php deleted file mode 100644 index 91a1c68..0000000 --- a/sources/web/system/database/drivers/postgre/postgre_forge.php +++ /dev/null @@ -1,299 +0,0 @@ -db->table_exists($table)) - { - return "SELECT * FROM $table"; // Needs to return innocous but valid SQL statement - } - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $is_unsigned = (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE); - - // Convert datatypes to be PostgreSQL-compatible - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - break; - case 'SMALLINT': - $attributes['TYPE'] = ($is_unsigned) ? 'INTEGER' : 'SMALLINT'; - break; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - break; - case 'INT': - $attributes['TYPE'] = ($is_unsigned) ? 'BIGINT' : 'INTEGER'; - break; - case 'BIGINT': - $attributes['TYPE'] = ($is_unsigned) ? 'NUMERIC' : 'BIGINT'; - break; - case 'DOUBLE': - $attributes['TYPE'] = 'DOUBLE PRECISION'; - break; - case 'DATETIME': - $attributes['TYPE'] = 'TIMESTAMP'; - break; - case 'LONGTEXT': - $attributes['TYPE'] = 'TEXT'; - break; - case 'BLOB': - $attributes['TYPE'] = 'BYTEA'; - break; - } - - // If this is an auto-incrementing primary key, use the serial data type instead - if (in_array($field, $primary_keys) && array_key_exists('AUTO_INCREMENT', $attributes) - && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' SERIAL'; - } - else - { - $sql .= ' '.$attributes['TYPE']; - } - - // Modified to prevent constraints with integer data types - if (array_key_exists('CONSTRAINT', $attributes) && strpos($attributes['TYPE'], 'INT') === false) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - // Added new attribute to create unqite fields. Also works with MySQL - if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) - { - $sql .= ' UNIQUE'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - // Something seems to break when passing an array to _protect_identifiers() - foreach ($primary_keys as $index => $key) - { - $primary_keys[$index] = $this->db->_protect_identifiers($key); - } - - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - $sql .= "\n);"; - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - foreach ($key as $field) - { - $sql .= "CREATE INDEX " . $table . "_" . str_replace(array('"', "'"), '', $field) . "_index ON $table ($field); "; - } - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @access private - * @return bool - */ - function _drop_table($table) - { - return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table)." CASCADE"; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - - -} - -/* End of file postgre_forge.php */ -/* Location: ./system/database/drivers/postgre/postgre_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/postgre/postgre_result.php b/sources/web/system/database/drivers/postgre/postgre_result.php deleted file mode 100644 index e9a1d16..0000000 --- a/sources/web/system/database/drivers/postgre/postgre_result.php +++ /dev/null @@ -1,169 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @pg_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $field_names[] = pg_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $F = new stdClass(); - $F->name = pg_field_name($this->result_id, $i); - $F->type = pg_field_type($this->result_id, $i); - $F->max_length = pg_field_size($this->result_id, $i); - $F->primary_key = 0; - $F->default = ''; - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_resource($this->result_id)) - { - pg_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return pg_result_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return pg_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return pg_fetch_object($this->result_id); - } - -} - - -/* End of file postgre_result.php */ -/* Location: ./system/database/drivers/postgre/postgre_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/postgre/postgre_utility.php b/sources/web/system/database/drivers/postgre/postgre_utility.php deleted file mode 100644 index 741c52e..0000000 --- a/sources/web/system/database/drivers/postgre/postgre_utility.php +++ /dev/null @@ -1,88 +0,0 @@ -db->display_error('db_unsuported_feature'); - } -} - - -/* End of file postgre_utility.php */ -/* Location: ./system/database/drivers/postgre/postgre_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlite/index.html b/sources/web/system/database/drivers/sqlite/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/sqlite/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlite/sqlite_driver.php b/sources/web/system/database/drivers/sqlite/sqlite_driver.php deleted file mode 100644 index 0cc898b..0000000 --- a/sources/web/system/database/drivers/sqlite/sqlite_driver.php +++ /dev/null @@ -1,658 +0,0 @@ -database, FILE_WRITE_MODE, $error)) - { - log_message('error', $error); - - if ($this->db_debug) - { - $this->display_error($error, '', TRUE); - } - - return FALSE; - } - - return $conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error)) - { - log_message('error', $error); - - if ($this->db_debug) - { - $this->display_error($error, '', TRUE); - } - - return FALSE; - } - - return $conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - // not implemented in SQLite - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - return sqlite_libversion(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return @sqlite_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - $this->simple_query('BEGIN TRANSACTION'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('COMMIT'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - $this->simple_query('ROLLBACK'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - $str = sqlite_escape_string($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - $str = str_replace( array('%', '_', $this->_like_escape_chr), - array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), - $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return sqlite_changes($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @access public - * @return integer - */ - function insert_id() - { - return @sqlite_last_insert_rowid($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - { - return 0; - } - - $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); - - if ($query->num_rows() == 0) - { - return 0; - } - - $row = $query->row(); - $this->_reset_select(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT name from sqlite_master WHERE type='table'"; - - if ($prefix_limit !== FALSE AND $this->dbprefix != '') - { - $sql .= " AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access public - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - // Not supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT * FROM ".$table." LIMIT 1"; - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - return sqlite_error_string(sqlite_last_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - return sqlite_last_error($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - if ($this->_escape_char == '') - { - return $item; - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - } - - if (strpos($item, '.') !== FALSE) - { - $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; - } - else - { - $str = $this->_escape_char.$item.$this->_escape_char; - } - - // remove duplicates if the user already included the escape - return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return '('.implode(', ', $tables).')'; - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where, $orderby = array(), $limit = FALSE) - { - foreach ($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; - - $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); - - $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; - - $sql .= $orderby.$limit; - - return $sql; - } - - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return $this->_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where = array(), $like = array(), $limit = FALSE) - { - $conditions = ''; - - if (count($where) > 0 OR count($like) > 0) - { - $conditions = "\nWHERE "; - $conditions .= implode("\n", $this->ar_where); - - if (count($where) > 0 && count($like) > 0) - { - $conditions .= " AND "; - } - $conditions .= implode("\n", $like); - } - - $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; - - return "DELETE FROM ".$table.$conditions.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - if ($offset == 0) - { - $offset = ''; - } - else - { - $offset .= ", "; - } - - return $sql."LIMIT ".$offset.$limit; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @sqlite_close($conn_id); - } - - -} - - -/* End of file sqlite_driver.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlite/sqlite_forge.php b/sources/web/system/database/drivers/sqlite/sqlite_forge.php deleted file mode 100644 index 5690408..0000000 --- a/sources/web/system/database/drivers/sqlite/sqlite_forge.php +++ /dev/null @@ -1,265 +0,0 @@ -db->database) OR ! @unlink($this->db->database)) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unable_to_drop'); - } - return FALSE; - } - return TRUE; - } - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param array the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - // IF NOT EXISTS added to SQLite in 3.3.0 - if ($if_not_exists === TRUE && version_compare($this->db->_version(), '3.3.0', '>=') === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)."("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * Unsupported feature in SQLite - * - * @access private - * @return bool - */ - function _drop_table($table) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - // SQLite does not support dropping columns - // http://www.sqlite.org/omitted.html - // http://www.sqlite.org/faq.html#q11 - return FALSE; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } -} - -/* End of file sqlite_forge.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlite/sqlite_result.php b/sources/web/system/database/drivers/sqlite/sqlite_result.php deleted file mode 100644 index 7bd30db..0000000 --- a/sources/web/system/database/drivers/sqlite/sqlite_result.php +++ /dev/null @@ -1,179 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @sqlite_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $field_names[] = sqlite_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - for ($i = 0; $i < $this->num_fields(); $i++) - { - $F = new stdClass(); - $F->name = sqlite_field_name($this->result_id, $i); - $F->type = 'varchar'; - $F->max_length = 0; - $F->primary_key = 0; - $F->default = ''; - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - // Not implemented in SQLite - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - return sqlite_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return sqlite_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - if (function_exists('sqlite_fetch_object')) - { - return sqlite_fetch_object($this->result_id); - } - else - { - $arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC); - if (is_array($arr)) - { - $obj = (object) $arr; - return $obj; - } else { - return NULL; - } - } - } - -} - - -/* End of file sqlite_result.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlite/sqlite_utility.php b/sources/web/system/database/drivers/sqlite/sqlite_utility.php deleted file mode 100644 index 508023e..0000000 --- a/sources/web/system/database/drivers/sqlite/sqlite_utility.php +++ /dev/null @@ -1,96 +0,0 @@ -db_debug) - { - return $this->db->display_error('db_unsuported_feature'); - } - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Optimize table query - * - * Is optimization even supported in SQLite? - * - * @access private - * @param string the table name - * @return object - */ - function _optimize_table($table) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Repair table query - * - * Are table repairs even supported in SQLite? - * - * @access private - * @param string the table name - * @return object - */ - function _repair_table($table) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * SQLite Export - * - * @access private - * @param array Preferences - * @return mixed - */ - function _backup($params = array()) - { - // Currently unsupported - return $this->db->display_error('db_unsuported_feature'); - } -} - -/* End of file sqlite_utility.php */ -/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlsrv/index.html b/sources/web/system/database/drivers/sqlsrv/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/drivers/sqlsrv/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlsrv/sqlsrv_driver.php b/sources/web/system/database/drivers/sqlsrv/sqlsrv_driver.php deleted file mode 100644 index 400fd31..0000000 --- a/sources/web/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ /dev/null @@ -1,599 +0,0 @@ -char_set)) ? 'UTF-8' : $this->char_set; - - $connection = array( - 'UID' => empty($this->username) ? '' : $this->username, - 'PWD' => empty($this->password) ? '' : $this->password, - 'Database' => $this->database, - 'ConnectionPooling' => $pooling ? 1 : 0, - 'CharacterSet' => $character_set, - 'ReturnDatesAsStrings' => 1 - ); - - // If the username and password are both empty, assume this is a - // 'Windows Authentication Mode' connection. - if(empty($connection['UID']) && empty($connection['PWD'])) { - unset($connection['UID'], $connection['PWD']); - } - - return sqlsrv_connect($this->hostname, $connection); - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @access private called by the base class - * @return resource - */ - function db_pconnect() - { - $this->db_connect(TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @access public - * @return void - */ - function reconnect() - { - // not implemented in MSSQL - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @access private called by the base class - * @return resource - */ - function db_select() - { - return $this->_execute('USE ' . $this->database); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @access public - * @param string - * @param string - * @return resource - */ - function db_set_charset($charset, $collation) - { - // @todo - add support if needed - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @access private called by the base class - * @param string an SQL query - * @return resource - */ - function _execute($sql) - { - $sql = $this->_prep_query($sql); - return sqlsrv_query($this->conn_id, $sql, null, array( - 'Scrollable' => SQLSRV_CURSOR_STATIC, - 'SendStreamParamsAtExec' => true - )); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @access private called by execute() - * @param string an SQL query - * @return string - */ - function _prep_query($sql) - { - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @access public - * @return bool - */ - function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; - - return sqlsrv_begin_transaction($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @access public - * @return bool - */ - function trans_commit() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - return sqlsrv_commit($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @access public - * @return bool - */ - function trans_rollback() - { - if ( ! $this->trans_enabled) - { - return TRUE; - } - - // When transactions are nested we only begin/commit/rollback the outermost ones - if ($this->_trans_depth > 0) - { - return TRUE; - } - - return sqlsrv_rollback($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @access public - * @param string - * @param bool whether or not the string will be used in a LIKE condition - * @return string - */ - function escape_str($str, $like = FALSE) - { - // Escape single quotes - return str_replace("'", "''", $str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @access public - * @return integer - */ - function affected_rows() - { - return @sqlrv_rows_affected($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @access public - * @return integer - */ - function insert_id() - { - return $this->query('select @@IDENTITY as insert_id')->row('insert_id'); - } - - // -------------------------------------------------------------------- - - /** - * Parse major version - * - * Grabs the major version number from the - * database server version string passed in. - * - * @access private - * @param string $version - * @return int16 major version number - */ - function _parse_major_version($version) - { - preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); - return $ver_info[1]; // return the major version b/c that's all we're interested in. - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @access public - * @return string - */ - function _version() - { - $info = sqlsrv_server_info($this->conn_id); - return sprintf("select '%s' as ver", $info['SQLServerVersion']); - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @access public - * @param string - * @return string - */ - function count_all($table = '') - { - if ($table == '') - return '0'; - - $query = $this->query("SELECT COUNT(*) AS numrows FROM " . $this->dbprefix . $table); - - if ($query->num_rows() == 0) - return '0'; - - $row = $query->row(); - $this->_reset_select(); - return $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @access private - * @param boolean - * @return string - */ - function _list_tables($prefix_limit = FALSE) - { - return "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @access private - * @param string the table name - * @return string - */ - function _list_columns($table = '') - { - return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->_escape_table($table)."'"; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @access public - * @param string the table name - * @return object - */ - function _field_data($table) - { - return "SELECT TOP 1 * FROM " . $this->_escape_table($table); - } - - // -------------------------------------------------------------------- - - /** - * The error message string - * - * @access private - * @return string - */ - function _error_message() - { - $error = array_shift(sqlsrv_errors()); - return !empty($error['message']) ? $error['message'] : null; - } - - // -------------------------------------------------------------------- - - /** - * The error message number - * - * @access private - * @return integer - */ - function _error_number() - { - $error = array_shift(sqlsrv_errors()); - return isset($error['SQLSTATE']) ? $error['SQLSTATE'] : null; - } - - // -------------------------------------------------------------------- - - /** - * Escape Table Name - * - * This function adds backticks if the table name has a period - * in it. Some DBs will get cranky unless periods are escaped - * - * @access private - * @param string the table name - * @return string - */ - function _escape_table($table) - { - return $table; - } - - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @access private - * @param string - * @return string - */ - function _escape_identifiers($item) - { - return $item; - } - - // -------------------------------------------------------------------- - - /** - * From Tables - * - * This function implicitly groups FROM tables so there is no confusion - * about operator precedence in harmony with SQL standards - * - * @access public - * @param type - * @return type - */ - function _from_tables($tables) - { - if ( ! is_array($tables)) - { - $tables = array($tables); - } - - return implode(', ', $tables); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @access public - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - function _insert($table, $keys, $values) - { - return "INSERT INTO ".$this->_escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @access public - * @param string the table name - * @param array the update data - * @param array the where clause - * @param array the orderby clause - * @param array the limit clause - * @return string - */ - function _update($table, $values, $where) - { - foreach($values as $key => $val) - { - $valstr[] = $key." = ".$val; - } - - return "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @access public - * @param string the table name - * @return string - */ - function _truncate($table) - { - return "TRUNCATE ".$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @access public - * @param string the table name - * @param array the where clause - * @param string the limit clause - * @return string - */ - function _delete($table, $where) - { - return "DELETE FROM ".$this->_escape_table($table)." WHERE ".implode(" ", $where); - } - - // -------------------------------------------------------------------- - - /** - * Limit string - * - * Generates a platform-specific LIMIT clause - * - * @access public - * @param string the sql query string - * @param integer the number of rows to limit the query to - * @param integer the offset value - * @return string - */ - function _limit($sql, $limit, $offset) - { - $i = $limit + $offset; - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @access public - * @param resource - * @return void - */ - function _close($conn_id) - { - @sqlsrv_close($conn_id); - } - -} - - - -/* End of file mssql_driver.php */ -/* Location: ./system/database/drivers/mssql/mssql_driver.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlsrv/sqlsrv_forge.php b/sources/web/system/database/drivers/sqlsrv/sqlsrv_forge.php deleted file mode 100644 index cc88ec5..0000000 --- a/sources/web/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ /dev/null @@ -1,248 +0,0 @@ -db->_escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @access private - * @param string the table name - * @param array the fields - * @param mixed primary key(s) - * @param mixed key(s) - * @param boolean should 'IF NOT EXISTS' be added to the SQL - * @return bool - */ - function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) - { - $sql = 'CREATE TABLE '; - - if ($if_not_exists === TRUE) - { - $sql .= 'IF NOT EXISTS '; - } - - $sql .= $this->db->_escape_identifiers($table)." ("; - $current_field_count = 0; - - foreach ($fields as $field=>$attributes) - { - // Numeric field names aren't allowed in databases, so if the key is - // numeric, we know it was assigned by PHP and the developer manually - // entered the field information, so we'll simply add it to the list - if (is_numeric($field)) - { - $sql .= "\n\t$attributes"; - } - else - { - $attributes = array_change_key_case($attributes, CASE_UPPER); - - $sql .= "\n\t".$this->db->_protect_identifiers($field); - - $sql .= ' '.$attributes['TYPE']; - - if (array_key_exists('CONSTRAINT', $attributes)) - { - $sql .= '('.$attributes['CONSTRAINT'].')'; - } - - if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) - { - $sql .= ' UNSIGNED'; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; - } - - if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $sql .= ' AUTO_INCREMENT'; - } - } - - // don't add a comma on the end of the last field - if (++$current_field_count < count($fields)) - { - $sql .= ','; - } - } - - if (count($primary_keys) > 0) - { - $primary_keys = $this->db->_protect_identifiers($primary_keys); - $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; - } - - if (is_array($keys) && count($keys) > 0) - { - foreach ($keys as $key) - { - if (is_array($key)) - { - $key = $this->db->_protect_identifiers($key); - } - else - { - $key = array($this->db->_protect_identifiers($key)); - } - - $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; - } - } - - $sql .= "\n)"; - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Alter table query - * - * Generates a platform-specific query so that a table can be altered - * Called by add_column(), drop_column(), and column_alter(), - * - * @access private - * @param string the ALTER type (ADD, DROP, CHANGE) - * @param string the column name - * @param string the table name - * @param string the column definition - * @param string the default value - * @param boolean should 'NOT NULL' be added - * @param string the field after which we should add the new field - * @return object - */ - function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') - { - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); - - // DROP has everything it needs now. - if ($alter_type == 'DROP') - { - return $sql; - } - - $sql .= " $column_definition"; - - if ($default_value != '') - { - $sql .= " DEFAULT \"$default_value\""; - } - - if ($null === NULL) - { - $sql .= ' NULL'; - } - else - { - $sql .= ' NOT NULL'; - } - - if ($after_field != '') - { - $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); - } - - return $sql; - - } - - // -------------------------------------------------------------------- - - /** - * Rename a table - * - * Generates a platform-specific query so that a table can be renamed - * - * @access private - * @param string the old table name - * @param string the new table name - * @return string - */ - function _rename_table($table_name, $new_table_name) - { - // I think this syntax will work, but can find little documentation on renaming tables in MSSQL - $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); - return $sql; - } - -} - -/* End of file mssql_forge.php */ -/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlsrv/sqlsrv_result.php b/sources/web/system/database/drivers/sqlsrv/sqlsrv_result.php deleted file mode 100644 index bf0abd1..0000000 --- a/sources/web/system/database/drivers/sqlsrv/sqlsrv_result.php +++ /dev/null @@ -1,169 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @access public - * @return integer - */ - function num_fields() - { - return @sqlsrv_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @access public - * @return array - */ - function list_fields() - { - $field_names = array(); - foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) - { - $field_names[] = $field['Name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @access public - * @return array - */ - function field_data() - { - $retval = array(); - foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) - { - $F = new stdClass(); - $F->name = $field['Name']; - $F->type = $field['Type']; - $F->max_length = $field['Size']; - $F->primary_key = 0; - $F->default = ''; - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return null - */ - function free_result() - { - if (is_resource($this->result_id)) - { - sqlsrv_free_stmt($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero - * - * @access private - * @return array - */ - function _data_seek($n = 0) - { - // Not implemented - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @access private - * @return array - */ - function _fetch_assoc() - { - return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @access private - * @return object - */ - function _fetch_object() - { - return sqlsrv_fetch_object($this->result_id); - } - -} - - -/* End of file mssql_result.php */ -/* Location: ./system/database/drivers/mssql/mssql_result.php */ \ No newline at end of file diff --git a/sources/web/system/database/drivers/sqlsrv/sqlsrv_utility.php b/sources/web/system/database/drivers/sqlsrv/sqlsrv_utility.php deleted file mode 100644 index 13a1850..0000000 --- a/sources/web/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ /dev/null @@ -1,88 +0,0 @@ -db->display_error('db_unsuported_feature'); - } - -} - -/* End of file mssql_utility.php */ -/* Location: ./system/database/drivers/mssql/mssql_utility.php */ \ No newline at end of file diff --git a/sources/web/system/database/index.html b/sources/web/system/database/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/database/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/fonts/index.html b/sources/web/system/fonts/index.html deleted file mode 100644 index c942a79..0000000 --- a/sources/web/system/fonts/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

          Directory access is forbidden.

          - - - \ No newline at end of file diff --git a/sources/web/system/fonts/texb.ttf b/sources/web/system/fonts/texb.ttf deleted file mode 100644 index 383c88b..0000000 Binary files a/sources/web/system/fonts/texb.ttf and /dev/null differ diff --git a/sources/web/system/helpers/array_helper.php b/sources/web/system/helpers/array_helper.php deleted file mode 100644 index 075a31f..0000000 --- a/sources/web/system/helpers/array_helper.php +++ /dev/null @@ -1,119 +0,0 @@ - '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200); - - foreach ($defaults as $key => $val) - { - if ( ! is_array($data)) - { - if ( ! isset($$key) OR $$key == '') - { - $$key = $val; - } - } - else - { - $$key = ( ! isset($data[$key])) ? $val : $data[$key]; - } - } - - if ($img_path == '' OR $img_url == '') - { - return FALSE; - } - - if ( ! @is_dir($img_path)) - { - return FALSE; - } - - if ( ! is_writable($img_path)) - { - return FALSE; - } - - if ( ! extension_loaded('gd')) - { - return FALSE; - } - - // ----------------------------------- - // Remove old images - // ----------------------------------- - - list($usec, $sec) = explode(" ", microtime()); - $now = ((float)$usec + (float)$sec); - - $current_dir = @opendir($img_path); - - while ($filename = @readdir($current_dir)) - { - if ($filename != "." and $filename != ".." and $filename != "index.html") - { - $name = str_replace(".jpg", "", $filename); - - if (($name + $expiration) < $now) - { - @unlink($img_path.$filename); - } - } - } - - @closedir($current_dir); - - // ----------------------------------- - // Do we have a "word" yet? - // ----------------------------------- - - if ($word == '') - { - $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - $str = ''; - for ($i = 0; $i < 8; $i++) - { - $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); - } - - $word = $str; - } - - // ----------------------------------- - // Determine angle and position - // ----------------------------------- - - $length = strlen($word); - $angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0; - $x_axis = rand(6, (360/$length)-16); - $y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height); - - // ----------------------------------- - // Create image - // ----------------------------------- - - // PHP.net recommends imagecreatetruecolor(), but it isn't always available - if (function_exists('imagecreatetruecolor')) - { - $im = imagecreatetruecolor($img_width, $img_height); - } - else - { - $im = imagecreate($img_width, $img_height); - } - - // ----------------------------------- - // Assign colors - // ----------------------------------- - - $bg_color = imagecolorallocate ($im, 255, 255, 255); - $border_color = imagecolorallocate ($im, 153, 102, 102); - $text_color = imagecolorallocate ($im, 204, 153, 153); - $grid_color = imagecolorallocate($im, 255, 182, 182); - $shadow_color = imagecolorallocate($im, 255, 240, 240); - - // ----------------------------------- - // Create the rectangle - // ----------------------------------- - - ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color); - - // ----------------------------------- - // Create the spiral pattern - // ----------------------------------- - - $theta = 1; - $thetac = 7; - $radius = 16; - $circles = 20; - $points = 32; - - for ($i = 0; $i < ($circles * $points) - 1; $i++) - { - $theta = $theta + $thetac; - $rad = $radius * ($i / $points ); - $x = ($rad * cos($theta)) + $x_axis; - $y = ($rad * sin($theta)) + $y_axis; - $theta = $theta + $thetac; - $rad1 = $radius * (($i + 1) / $points); - $x1 = ($rad1 * cos($theta)) + $x_axis; - $y1 = ($rad1 * sin($theta )) + $y_axis; - imageline($im, $x, $y, $x1, $y1, $grid_color); - $theta = $theta - $thetac; - } - - // ----------------------------------- - // Write the text - // ----------------------------------- - - $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; - - if ($use_font == FALSE) - { - $font_size = 5; - $x = rand(0, $img_width/($length/3)); - $y = 0; - } - else - { - $font_size = 16; - $x = rand(0, $img_width/($length/1.5)); - $y = $font_size+2; - } - - for ($i = 0; $i < strlen($word); $i++) - { - if ($use_font == FALSE) - { - $y = rand(0 , $img_height/2); - imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color); - $x += ($font_size*2); - } - else - { - $y = rand($img_height/2, $img_height-3); - imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1)); - $x += $font_size; - } - } - - - // ----------------------------------- - // Create the border - // ----------------------------------- - - imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); - - // ----------------------------------- - // Generate the image - // ----------------------------------- - - $img_name = $now.'.jpg'; - - ImageJPEG($im, $img_path.$img_name); - - $img = "\""; - - ImageDestroy($im); - - return array('word' => $word, 'time' => $now, 'image' => $img); - } -} - -// ------------------------------------------------------------------------ - -/* End of file captcha_helper.php */ -/* Location: ./system/heleprs/captcha_helper.php */ \ No newline at end of file diff --git a/sources/web/system/helpers/cookie_helper.php b/sources/web/system/helpers/cookie_helper.php deleted file mode 100644 index 7cee028..0000000 --- a/sources/web/system/helpers/cookie_helper.php +++ /dev/null @@ -1,103 +0,0 @@ -input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure); - } -} - -// -------------------------------------------------------------------- - -/** - * Fetch an item from the COOKIE array - * - * @access public - * @param string - * @param bool - * @return mixed - */ -if ( ! function_exists('get_cookie')) -{ - function get_cookie($index = '', $xss_clean = FALSE) - { - $CI =& get_instance(); - - $prefix = ''; - - if ( ! isset($_COOKIE[$index]) && config_item('cookie_prefix') != '') - { - $prefix = config_item('cookie_prefix'); - } - - return $CI->input->cookie($prefix.$index, $xss_clean); - } -} - -// -------------------------------------------------------------------- - -/** - * Delete a COOKIE - * - * @param mixed - * @param string the cookie domain. Usually: .yourdomain.com - * @param string the cookie path - * @param string the cookie prefix - * @return void - */ -if ( ! function_exists('delete_cookie')) -{ - function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '') - { - set_cookie($name, '', '', $domain, $path, $prefix); - } -} - - -/* End of file cookie_helper.php */ -/* Location: ./system/helpers/cookie_helper.php */ \ No newline at end of file diff --git a/sources/web/system/helpers/date_helper.php b/sources/web/system/helpers/date_helper.php deleted file mode 100644 index 0aeb7fa..0000000 --- a/sources/web/system/helpers/date_helper.php +++ /dev/null @@ -1,611 +0,0 @@ -config->item('time_reference')) == 'gmt') - { - $now = time(); - $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); - - if (strlen($system_time) < 10) - { - $system_time = time(); - log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.'); - } - - return $system_time; - } - else - { - return time(); - } - } -} - -// ------------------------------------------------------------------------ - -/** - * Convert MySQL Style Datecodes - * - * This function is identical to PHPs date() function, - * except that it allows date codes to be formatted using - * the MySQL style, where each code letter is preceded - * with a percent sign: %Y %m %d etc... - * - * The benefit of doing dates this way is that you don't - * have to worry about escaping your text letters that - * match the date codes. - * - * @access public - * @param string - * @param integer - * @return integer - */ -if ( ! function_exists('mdate')) -{ - function mdate($datestr = '', $time = '') - { - if ($datestr == '') - return ''; - - if ($time == '') - $time = now(); - - $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr)); - return date($datestr, $time); - } -} - -// ------------------------------------------------------------------------ - -/** - * Standard Date - * - * Returns a date formatted according to the submitted standard. - * - * @access public - * @param string the chosen format - * @param integer Unix timestamp - * @return string - */ -if ( ! function_exists('standard_date')) -{ - function standard_date($fmt = 'DATE_RFC822', $time = '') - { - $formats = array( - 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q', - 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', - 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%Q', - 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O', - 'DATE_RFC850' => '%l, %d-%M-%y %H:%i:%s UTC', - 'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O', - 'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O', - 'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O', - 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q' - ); - - if ( ! isset($formats[$fmt])) - { - return FALSE; - } - - return mdate($formats[$fmt], $time); - } -} - -// ------------------------------------------------------------------------ - -/** - * Timespan - * - * Returns a span of seconds in this format: - * 10 days 14 hours 36 minutes 47 seconds - * - * @access public - * @param integer a number of seconds - * @param integer Unix timestamp - * @return integer - */ -if ( ! function_exists('timespan')) -{ - function timespan($seconds = 1, $time = '') - { - $CI =& get_instance(); - $CI->lang->load('date'); - - if ( ! is_numeric($seconds)) - { - $seconds = 1; - } - - if ( ! is_numeric($time)) - { - $time = time(); - } - - if ($time <= $seconds) - { - $seconds = 1; - } - else - { - $seconds = $time - $seconds; - } - - $str = ''; - $years = floor($seconds / 31536000); - - if ($years > 0) - { - $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', '; - } - - $seconds -= $years * 31536000; - $months = floor($seconds / 2628000); - - if ($years > 0 OR $months > 0) - { - if ($months > 0) - { - $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', '; - } - - $seconds -= $months * 2628000; - } - - $weeks = floor($seconds / 604800); - - if ($years > 0 OR $months > 0 OR $weeks > 0) - { - if ($weeks > 0) - { - $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', '; - } - - $seconds -= $weeks * 604800; - } - - $days = floor($seconds / 86400); - - if ($months > 0 OR $weeks > 0 OR $days > 0) - { - if ($days > 0) - { - $str .= $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')).', '; - } - - $seconds -= $days * 86400; - } - - $hours = floor($seconds / 3600); - - if ($days > 0 OR $hours > 0) - { - if ($hours > 0) - { - $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', '; - } - - $seconds -= $hours * 3600; - } - - $minutes = floor($seconds / 60); - - if ($days > 0 OR $hours > 0 OR $minutes > 0) - { - if ($minutes > 0) - { - $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', '; - } - - $seconds -= $minutes * 60; - } - - if ($str == '') - { - $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', '; - } - - return substr(trim($str), 0, -1); - } -} - -// ------------------------------------------------------------------------ - -/** - * Number of days in a month - * - * Takes a month/year as input and returns the number of days - * for the given month/year. Takes leap years into consideration. - * - * @access public - * @param integer a numeric month - * @param integer a numeric year - * @return integer - */ -if ( ! function_exists('days_in_month')) -{ - function days_in_month($month = 0, $year = '') - { - if ($month < 1 OR $month > 12) - { - return 0; - } - - if ( ! is_numeric($year) OR strlen($year) != 4) - { - $year = date('Y'); - } - - if ($month == 2) - { - if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) - { - return 29; - } - } - - $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); - return $days_in_month[$month - 1]; - } -} - -// ------------------------------------------------------------------------ - -/** - * Converts a local Unix timestamp to GMT - * - * @access public - * @param integer Unix timestamp - * @return integer - */ -if ( ! function_exists('local_to_gmt')) -{ - function local_to_gmt($time = '') - { - if ($time == '') - $time = time(); - - return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time)); - } -} - -// ------------------------------------------------------------------------ - -/** - * Converts GMT time to a localized value - * - * Takes a Unix timestamp (in GMT) as input, and returns - * at the local value based on the timezone and DST setting - * submitted - * - * @access public - * @param integer Unix timestamp - * @param string timezone - * @param bool whether DST is active - * @return integer - */ -if ( ! function_exists('gmt_to_local')) -{ - function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) - { - if ($time == '') - { - return now(); - } - - $time += timezones($timezone) * 3600; - - if ($dst == TRUE) - { - $time += 3600; - } - - return $time; - } -} - -// ------------------------------------------------------------------------ - -/** - * Converts a MySQL Timestamp to Unix - * - * @access public - * @param integer Unix timestamp - * @return integer - */ -if ( ! function_exists('mysql_to_unix')) -{ - function mysql_to_unix($time = '') - { - // We'll remove certain characters for backward compatibility - // since the formatting changed with MySQL 4.1 - // YYYY-MM-DD HH:MM:SS - - $time = str_replace('-', '', $time); - $time = str_replace(':', '', $time); - $time = str_replace(' ', '', $time); - - // YYYYMMDDHHMMSS - return mktime( - substr($time, 8, 2), - substr($time, 10, 2), - substr($time, 12, 2), - substr($time, 4, 2), - substr($time, 6, 2), - substr($time, 0, 4) - ); - } -} - -// ------------------------------------------------------------------------ - -/** - * Unix to "Human" - * - * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM - * - * @access public - * @param integer Unix timestamp - * @param bool whether to show seconds - * @param string format: us or euro - * @return string - */ -if ( ! function_exists('unix_to_human')) -{ - function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') - { - $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; - - if ($fmt == 'us') - { - $r .= date('h', $time).':'.date('i', $time); - } - else - { - $r .= date('H', $time).':'.date('i', $time); - } - - if ($seconds) - { - $r .= ':'.date('s', $time); - } - - if ($fmt == 'us') - { - $r .= ' '.date('A', $time); - } - - return $r; - } -} - -// ------------------------------------------------------------------------ - -/** - * Convert "human" date to GMT - * - * Reverses the above process - * - * @access public - * @param string format: us or euro - * @return integer - */ -if ( ! function_exists('human_to_unix')) -{ - function human_to_unix($datestr = '') - { - if ($datestr == '') - { - return FALSE; - } - - $datestr = trim($datestr); - $datestr = preg_replace("/\040+/", ' ', $datestr); - - if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) - { - return FALSE; - } - - $split = explode(' ', $datestr); - - $ex = explode("-", $split['0']); - - $year = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0']; - $month = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; - $day = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; - - $ex = explode(":", $split['1']); - - $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0']; - $min = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; - - if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) - { - $sec = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; - } - else - { - // Unless specified, seconds get set to zero. - $sec = '00'; - } - - if (isset($split['2'])) - { - $ampm = strtolower($split['2']); - - if (substr($ampm, 0, 1) == 'p' AND $hour < 12) - $hour = $hour + 12; - - if (substr($ampm, 0, 1) == 'a' AND $hour == 12) - $hour = '00'; - - if (strlen($hour) == 1) - $hour = '0'.$hour; - } - - return mktime($hour, $min, $sec, $month, $day, $year); - } -} - -// ------------------------------------------------------------------------ - -/** - * Timezone Menu - * - * Generates a drop-down menu of timezones. - * - * @access public - * @param string timezone - * @param string classname - * @param string menu name - * @return string - */ -if ( ! function_exists('timezone_menu')) -{ - function timezone_menu($default = 'UTC', $class = "", $name = 'timezones') - { - $CI =& get_instance(); - $CI->lang->load('date'); - - if ($default == 'GMT') - $default = 'UTC'; - - $menu = '"; - - return $menu; - } -} - -// ------------------------------------------------------------------------ - -/** - * Timezones - * - * Returns an array of timezones. This is a helper function - * for various other ones in this library - * - * @access public - * @param string timezone - * @return string - */ -if ( ! function_exists('timezones')) -{ - function timezones($tz = '') - { - // Note: Don't change the order of these even though - // some items appear to be in the wrong order - - $zones = array( - 'UM12' => -12, - 'UM11' => -11, - 'UM10' => -10, - 'UM95' => -9.5, - 'UM9' => -9, - 'UM8' => -8, - 'UM7' => -7, - 'UM6' => -6, - 'UM5' => -5, - 'UM45' => -4.5, - 'UM4' => -4, - 'UM35' => -3.5, - 'UM3' => -3, - 'UM2' => -2, - 'UM1' => -1, - 'UTC' => 0, - 'UP1' => +1, - 'UP2' => +2, - 'UP3' => +3, - 'UP35' => +3.5, - 'UP4' => +4, - 'UP45' => +4.5, - 'UP5' => +5, - 'UP55' => +5.5, - 'UP575' => +5.75, - 'UP6' => +6, - 'UP65' => +6.5, - 'UP7' => +7, - 'UP8' => +8, - 'UP875' => +8.75, - 'UP9' => +9, - 'UP95' => +9.5, - 'UP10' => +10, - 'UP105' => +10.5, - 'UP11' => +11, - 'UP115' => +11.5, - 'UP12' => +12, - 'UP1275' => +12.75, - 'UP13' => +13, - 'UP14' => +14 - ); - - if ($tz == '') - { - return $zones; - } - - if ($tz == 'GMT') - $tz = 'UTC'; - - return ( ! isset($zones[$tz])) ? 0 : $zones[$tz]; - } -} - - -/* End of file date_helper.php */ -/* Location: ./system/helpers/date_helper.php */ \ No newline at end of file diff --git a/sources/web/system/helpers/directory_helper.php b/sources/web/system/helpers/directory_helper.php deleted file mode 100644 index 38347fa..0000000 --- a/sources/web/system/helpers/directory_helper.php +++ /dev/null @@ -1,80 +0,0 @@ - 0) && @is_dir($source_dir.$file)) - { - $filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden); - } - else - { - $filedata[] = $file; - } - } - - closedir($fp); - return $filedata; - } - - return FALSE; - } -} - - -/* End of file directory_helper.php */ -/* Location: ./system/helpers/directory_helper.php */ \ No newline at end of file diff --git a/sources/web/system/helpers/download_helper.php b/sources/web/system/helpers/download_helper.php deleted file mode 100644 index 1145688..0000000 --- a/sources/web/system/helpers/download_helper.php +++ /dev/null @@ -1,107 +0,0 @@ - 0) - { - $data =& fread($fp, filesize($file)); - } - - flock($fp, LOCK_UN); - fclose($fp); - - return $data; - } -} - -// ------------------------------------------------------------------------ - -/** - * Write File - * - * Writes data to the file specified in the path. - * Creates a new file if non-existent. - * - * @access public - * @param string path to file - * @param string file data - * @return bool - */ -if ( ! function_exists('write_file')) -{ - function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE) - { - if ( ! $fp = @fopen($path, $mode)) - { - return FALSE; - } - - flock($fp, LOCK_EX); - fwrite($fp, $data); - flock($fp, LOCK_UN); - fclose($fp); - - return TRUE; - } -} - -// ------------------------------------------------------------------------ - -/** - * Delete Files - * - * Deletes all files contained in the supplied directory path. - * Files must be writable or owned by the system in order to be deleted. - * If the second parameter is set to TRUE, any directories contained - * within the supplied base directory will be nuked as well. - * - * @access public - * @param string path to file - * @param bool whether to delete any directories found in the path - * @return bool - */ -if ( ! function_exists('delete_files')) -{ - function delete_files($path, $del_dir = FALSE, $level = 0) - { - // Trim the trailing slash - $path = rtrim($path, DIRECTORY_SEPARATOR); - - if ( ! $current_dir = @opendir($path)) - { - return FALSE; - } - - while (FALSE !== ($filename = @readdir($current_dir))) - { - if ($filename != "." and $filename != "..") - { - if (is_dir($path.DIRECTORY_SEPARATOR.$filename)) - { - // Ignore empty folders - if (substr($filename, 0, 1) != '.') - { - delete_files($path.DIRECTORY_SEPARATOR.$filename, $del_dir, $level + 1); - } - } - else - { - unlink($path.DIRECTORY_SEPARATOR.$filename); - } - } - } - @closedir($current_dir); - - if ($del_dir == TRUE AND $level > 0) - { - return @rmdir($path); - } - - return TRUE; - } -} - -// ------------------------------------------------------------------------ - -/** - * Get Filenames - * - * Reads the specified directory and builds an array containing the filenames. - * Any sub-folders contained within the specified path are read as well. - * - * @access public - * @param string path to source - * @param bool whether to include the path as part of the filename - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ -if ( ! function_exists('get_filenames')) -{ - function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) - { - static $_filedata = array(); - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - while (FALSE !== ($file = readdir($fp))) - { - if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0) - { - get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); - } - elseif (strncmp($file, '.', 1) !== 0) - { - $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file; - } - } - return $_filedata; - } - else - { - return FALSE; - } - } -} - -// -------------------------------------------------------------------- - -/** - * Get Directory File Information - * - * Reads the specified directory and builds an array containing the filenames, - * filesize, dates, and permissions - * - * Any sub-folders contained within the specified path are read as well. - * - * @access public - * @param string path to source - * @param bool Look only at the top level directory specified? - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ -if ( ! function_exists('get_dir_file_info')) -{ - function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) - { - static $_filedata = array(); - $relative_path = $source_dir; - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - // foreach (scandir($source_dir, 1) as $file) // In addition to being PHP5+, scandir() is simply not as fast - while (FALSE !== ($file = readdir($fp))) - { - if (@is_dir($source_dir.$file) AND strncmp($file, '.', 1) !== 0 AND $top_level_only === FALSE) - { - get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); - } - elseif (strncmp($file, '.', 1) !== 0) - { - $_filedata[$file] = get_file_info($source_dir.$file); - $_filedata[$file]['relative_path'] = $relative_path; - } - } - - return $_filedata; - } - else - { - return FALSE; - } - } -} - -// -------------------------------------------------------------------- - -/** -* Get File Info -* -* Given a file and path, returns the name, path, size, date modified -* Second parameter allows you to explicitly declare what information you want returned -* Options are: name, server_path, size, date, readable, writable, executable, fileperms -* Returns FALSE if the file cannot be found. -* -* @access public -* @param string path to file -* @param mixed array or comma separated string of information returned -* @return array -*/ -if ( ! function_exists('get_file_info')) -{ - function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) - { - - if ( ! file_exists($file)) - { - return FALSE; - } - - if (is_string($returned_values)) - { - $returned_values = explode(',', $returned_values); - } - - foreach ($returned_values as $key) - { - switch ($key) - { - case 'name': - $fileinfo['name'] = substr(strrchr($file, DIRECTORY_SEPARATOR), 1); - break; - case 'server_path': - $fileinfo['server_path'] = $file; - break; - case 'size': - $fileinfo['size'] = filesize($file); - break; - case 'date': - $fileinfo['date'] = filemtime($file); - break; - case 'readable': - $fileinfo['readable'] = is_readable($file); - break; - case 'writable': - // There are known problems using is_weritable on IIS. It may not be reliable - consider fileperms() - $fileinfo['writable'] = is_writable($file); - break; - case 'executable': - $fileinfo['executable'] = is_executable($file); - break; - case 'fileperms': - $fileinfo['fileperms'] = fileperms($file); - break; - } - } - - return $fileinfo; - } -} - -// -------------------------------------------------------------------- - -/** - * Get Mime by Extension - * - * Translates a file extension into a mime type based on config/mimes.php. - * Returns FALSE if it can't determine the type, or open the mime config file - * - * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience - * It should NOT be trusted, and should certainly NOT be used for security - * - * @access public - * @param string path to file - * @return mixed - */ -if ( ! function_exists('get_mime_by_extension')) -{ - function get_mime_by_extension($file) - { - $extension = strtolower(substr(strrchr($file, '.'), 1)); - - global $mimes; - - if ( ! is_array($mimes)) - { - if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); - } - elseif (is_file(APPPATH.'config/mimes.php')) - { - include(APPPATH.'config/mimes.php'); - } - - if ( ! is_array($mimes)) - { - return FALSE; - } - } - - if (array_key_exists($extension, $mimes)) - { - if (is_array($mimes[$extension])) - { - // Multiple mime types, just give the first one - return current($mimes[$extension]); - } - else - { - return $mimes[$extension]; - } - } - else - { - return FALSE; - } - } -} - -// -------------------------------------------------------------------- - -/** - * Symbolic Permissions - * - * Takes a numeric value representing a file's permissions and returns - * standard symbolic notation representing that value - * - * @access public - * @param int - * @return string - */ -if ( ! function_exists('symbolic_permissions')) -{ - function symbolic_permissions($perms) - { - if (($perms & 0xC000) == 0xC000) - { - $symbolic = 's'; // Socket - } - elseif (($perms & 0xA000) == 0xA000) - { - $symbolic = 'l'; // Symbolic Link - } - elseif (($perms & 0x8000) == 0x8000) - { - $symbolic = '-'; // Regular - } - elseif (($perms & 0x6000) == 0x6000) - { - $symbolic = 'b'; // Block special - } - elseif (($perms & 0x4000) == 0x4000) - { - $symbolic = 'd'; // Directory - } - elseif (($perms & 0x2000) == 0x2000) - { - $symbolic = 'c'; // Character special - } - elseif (($perms & 0x1000) == 0x1000) - { - $symbolic = 'p'; // FIFO pipe - } - else - { - $symbolic = 'u'; // Unknown - } - - // Owner - $symbolic .= (($perms & 0x0100) ? 'r' : '-'); - $symbolic .= (($perms & 0x0080) ? 'w' : '-'); - $symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); - - // Group - $symbolic .= (($perms & 0x0020) ? 'r' : '-'); - $symbolic .= (($perms & 0x0010) ? 'w' : '-'); - $symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); - - // World - $symbolic .= (($perms & 0x0004) ? 'r' : '-'); - $symbolic .= (($perms & 0x0002) ? 'w' : '-'); - $symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); - - return $symbolic; - } -} - -// -------------------------------------------------------------------- - -/** - * Octal Permissions - * - * Takes a numeric value representing a file's permissions and returns - * a three character string representing the file's octal permissions - * - * @access public - * @param int - * @return string - */ -if ( ! function_exists('octal_permissions')) -{ - function octal_permissions($perms) - { - return substr(sprintf('%o', $perms), -3); - } -} - - -/* End of file file_helper.php */ -/* Location: ./system/helpers/file_helper.php */ \ No newline at end of file diff --git a/sources/web/system/helpers/form_helper.php b/sources/web/system/helpers/form_helper.php deleted file mode 100644 index 8733ae0..0000000 --- a/sources/web/system/helpers/form_helper.php +++ /dev/null @@ -1,1054 +0,0 @@ -config->site_url($action); - } - - // If no action is provided then set to the current url - $action OR $action = $CI->config->site_url($CI->uri->uri_string()); - - $form = '
          config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) - { - $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); - } - - if (is_array($hidden) AND count($hidden) > 0) - { - $form .= sprintf("
          %s
          ", form_hidden($hidden)); - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Declaration - Multipart type - * - * Creates the opening portion of the form, but with "multipart/form-data". - * - * @access public - * @param string the URI segments of the form destination - * @param array a key/value pair of attributes - * @param array a key/value pair hidden data - * @return string - */ -if ( ! function_exists('form_open_multipart')) -{ - function form_open_multipart($action = '', $attributes = array(), $hidden = array()) - { - if (is_string($attributes)) - { - $attributes .= ' enctype="multipart/form-data"'; - } - else - { - $attributes['enctype'] = 'multipart/form-data'; - } - - return form_open($action, $attributes, $hidden); - } -} - -// ------------------------------------------------------------------------ - -/** - * Hidden Input Field - * - * Generates hidden fields. You can pass a simple key/value string or an associative - * array with multiple values. - * - * @access public - * @param mixed - * @param string - * @return string - */ -if ( ! function_exists('form_hidden')) -{ - function form_hidden($name, $value = '', $recursing = FALSE) - { - static $form; - - if ($recursing === FALSE) - { - $form = "\n"; - } - - if (is_array($name)) - { - foreach ($name as $key => $val) - { - form_hidden($key, $val, TRUE); - } - return $form; - } - - if ( ! is_array($value)) - { - $form .= ''."\n"; - } - else - { - foreach ($value as $k => $v) - { - $k = (is_int($k)) ? '' : $k; - form_hidden($name.'['.$k.']', $v, TRUE); - } - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -/** - * Text Input Field - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_input')) -{ - function form_input($data = '', $value = '', $extra = '') - { - $defaults = array('type' => 'text', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); - - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Password Field - * - * Identical to the input function but adds the "password" type - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_password')) -{ - function form_password($data = '', $value = '', $extra = '') - { - if ( ! is_array($data)) - { - $data = array('name' => $data); - } - - $data['type'] = 'password'; - return form_input($data, $value, $extra); - } -} - -// ------------------------------------------------------------------------ - -/** - * Upload Field - * - * Identical to the input function but adds the "file" type - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_upload')) -{ - function form_upload($data = '', $value = '', $extra = '') - { - if ( ! is_array($data)) - { - $data = array('name' => $data); - } - - $data['type'] = 'file'; - return form_input($data, $value, $extra); - } -} - -// ------------------------------------------------------------------------ - -/** - * Textarea field - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_textarea')) -{ - function form_textarea($data = '', $value = '', $extra = '') - { - $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'cols' => '40', 'rows' => '10'); - - if ( ! is_array($data) OR ! isset($data['value'])) - { - $val = $value; - } - else - { - $val = $data['value']; - unset($data['value']); // textareas don't use the value attribute - } - - $name = (is_array($data)) ? $data['name'] : $data; - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Multi-select menu - * - * @access public - * @param string - * @param array - * @param mixed - * @param string - * @return type - */ -if ( ! function_exists('form_multiselect')) -{ - function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') - { - if ( ! strpos($extra, 'multiple')) - { - $extra .= ' multiple="multiple"'; - } - - return form_dropdown($name, $options, $selected, $extra); - } -} - -// -------------------------------------------------------------------- - -/** - * Drop-down Menu - * - * @access public - * @param string - * @param array - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_dropdown')) -{ - function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '') - { - if ( ! is_array($selected)) - { - $selected = array($selected); - } - - // If no selected state was submitted we will attempt to set it automatically - if (count($selected) === 0) - { - // If the form name appears in the $_POST array we have a winner! - if (isset($_POST[$name])) - { - $selected = array($_POST[$name]); - } - } - - if ($extra != '') $extra = ' '.$extra; - - $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; - - $form = ''; - - return $form; - } -} - -// ------------------------------------------------------------------------ - -/** - * Checkbox Field - * - * @access public - * @param mixed - * @param string - * @param bool - * @param string - * @return string - */ -if ( ! function_exists('form_checkbox')) -{ - function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') - { - $defaults = array('type' => 'checkbox', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); - - if (is_array($data) AND array_key_exists('checked', $data)) - { - $checked = $data['checked']; - - if ($checked == FALSE) - { - unset($data['checked']); - } - else - { - $data['checked'] = 'checked'; - } - } - - if ($checked == TRUE) - { - $defaults['checked'] = 'checked'; - } - else - { - unset($defaults['checked']); - } - - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Radio Button - * - * @access public - * @param mixed - * @param string - * @param bool - * @param string - * @return string - */ -if ( ! function_exists('form_radio')) -{ - function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') - { - if ( ! is_array($data)) - { - $data = array('name' => $data); - } - - $data['type'] = 'radio'; - return form_checkbox($data, $value, $checked, $extra); - } -} - -// ------------------------------------------------------------------------ - -/** - * Submit Button - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_submit')) -{ - function form_submit($data = '', $value = '', $extra = '') - { - $defaults = array('type' => 'submit', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); - - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Reset Button - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_reset')) -{ - function form_reset($data = '', $value = '', $extra = '') - { - $defaults = array('type' => 'reset', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); - - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Button - * - * @access public - * @param mixed - * @param string - * @param string - * @return string - */ -if ( ! function_exists('form_button')) -{ - function form_button($data = '', $content = '', $extra = '') - { - $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'type' => 'button'); - - if ( is_array($data) AND isset($data['content'])) - { - $content = $data['content']; - unset($data['content']); // content is not an attribute - } - - return ""; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Label Tag - * - * @access public - * @param string The text to appear onscreen - * @param string The id the label applies to - * @param string Additional attributes - * @return string - */ -if ( ! function_exists('form_label')) -{ - function form_label($label_text = '', $id = '', $attributes = array()) - { - - $label = ' 0) - { - foreach ($attributes as $key => $val) - { - $label .= ' '.$key.'="'.$val.'"'; - } - } - - $label .= ">$label_text"; - - return $label; - } -} - -// ------------------------------------------------------------------------ -/** - * Fieldset Tag - * - * Used to produce
          text. To close fieldset - * use form_fieldset_close() - * - * @access public - * @param string The legend text - * @param string Additional attributes - * @return string - */ -if ( ! function_exists('form_fieldset')) -{ - function form_fieldset($legend_text = '', $attributes = array()) - { - $fieldset = "".$extra; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Close Tag - * - * @access public - * @param string - * @return string - */ -if ( ! function_exists('form_close')) -{ - function form_close($extra = '') - { - return "".$extra; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Prep - * - * Formats text so that it can be safely placed in a form field in the event it has HTML tags. - * - * @access public - * @param string - * @return string - */ -if ( ! function_exists('form_prep')) -{ - function form_prep($str = '', $field_name = '') - { - static $prepped_fields = array(); - - // if the field name is an array we do this recursively - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = form_prep($val); - } - - return $str; - } - - if ($str === '') - { - return ''; - } - - // we've already prepped a field with this name - // @todo need to figure out a way to namespace this so - // that we know the *exact* field and not just one with - // the same name - if (isset($prepped_fields[$field_name])) - { - return $str; - } - - $str = htmlspecialchars($str); - - // In case htmlspecialchars misses these. - $str = str_replace(array("'", '"'), array("'", """), $str); - - if ($field_name != '') - { - $prepped_fields[$field_name] = $field_name; - } - - return $str; - } -} - -// ------------------------------------------------------------------------ - -/** - * Form Value - * - * Grabs a value from the POST array for the specified field so you can - * re-populate an input field or textarea. If Form Validation - * is active it retrieves the info from the validation class - * - * @access public - * @param string - * @return mixed - */ -if ( ! function_exists('set_value')) -{ - function set_value($field = '', $default = '') - { - if (FALSE === ($OBJ =& _get_validation_object())) - { - if ( ! isset($_POST[$field])) - { - return $default; - } - - return form_prep($_POST[$field], $field); - } - - return form_prep($OBJ->set_value($field, $default), $field); - } -} - -// ------------------------------------------------------------------------ - -/** - * Set Select - * - * Let's you set the selected value of a -{>form_element_start for="displayname" label="displayname" /} - -{>form_element_end/} -{>form_element_start for="color" label="color" /} - -{>form_element_end/} -{?public_url} - -{/public_url} diff --git a/sources/web/templates_src/src/calendar_create_dialog.dust b/sources/web/templates_src/src/calendar_create_dialog.dust deleted file mode 100644 index 70fc73e..0000000 --- a/sources/web/templates_src/src/calendar_create_dialog.dust +++ /dev/null @@ -1,5 +0,0 @@ -
          -{>form_open applyclass="form-horizontal" applyid="calendar_create_form" /} -{>calendar_basic_form_part/} -{>form_close/} -
          diff --git a/sources/web/templates_src/src/calendar_delete_dialog.dust b/sources/web/templates_src/src/calendar_delete_dialog.dust deleted file mode 100644 index 16539dd..0000000 --- a/sources/web/templates_src/src/calendar_delete_dialog.dust +++ /dev/null @@ -1,16 +0,0 @@ -
          -{>form_open/} - - -

          -{@i18n type="messages" name="info_confirmcaldelete" /} -

          - -

          {displayname}

          - -

          -{@i18n type="messages" name="info_permanentremoval" /} -

          - -{>form_close/} -
          diff --git a/sources/web/templates_src/src/calendar_list_entry.dust b/sources/web/templates_src/src/calendar_list_entry.dust deleted file mode 100644 index e6e3311..0000000 --- a/sources/web/templates_src/src/calendar_list_entry.dust +++ /dev/null @@ -1,24 +0,0 @@ -
        • -
          - - - {?shared} - {@eq key="{write_access}" value="0"} - - {/eq} - {:else} - {?share_with} - - {/share_with} - {/shared} - - - {displayname} - -
        • diff --git a/sources/web/templates_src/src/calendar_modify_dialog.dust b/sources/web/templates_src/src/calendar_modify_dialog.dust deleted file mode 100644 index f6f0fc8..0000000 --- a/sources/web/templates_src/src/calendar_modify_dialog.dust +++ /dev/null @@ -1,41 +0,0 @@ -
          -
          - -{>form_open applyclass="form-horizontal" applyid="calendar_modify_form" /} -
          - -{?user_from} - -{/user_from} - -{>calendar_basic_form_part/} -
          - -{?enable_calendar_sharing} - {^shared} -
          - {>calendar_share_table/} -
          - {/shared} -{/enable_calendar_sharing} - - -{>form_close/} -
          diff --git a/sources/web/templates_src/src/calendar_share_access_options.dust b/sources/web/templates_src/src/calendar_share_access_options.dust deleted file mode 100644 index ba771b0..0000000 --- a/sources/web/templates_src/src/calendar_share_access_options.dust +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/sources/web/templates_src/src/calendar_share_row.dust b/sources/web/templates_src/src/calendar_share_row.dust deleted file mode 100644 index 2663edd..0000000 --- a/sources/web/templates_src/src/calendar_share_row.dust +++ /dev/null @@ -1,16 +0,0 @@ - -{username} - - - - - - - - - diff --git a/sources/web/templates_src/src/calendar_share_table.dust b/sources/web/templates_src/src/calendar_share_table.dust deleted file mode 100644 index 4e9aad7..0000000 --- a/sources/web/templates_src/src/calendar_share_table.dust +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - {#share_with} - {>calendar_share_row/} - {/share_with} - - - - -
          {@i18n type="labels" name="username"/}{@i18n type="labels" name="access"/}
          {@i18n type="messages" name="info_notshared"/}
          - -{@i18n type="labels" name="sharewith"/} - - - - - - - - - -
          - -
          - - - {@i18n type= -
          diff --git a/sources/web/templates_src/src/datepicker_button.dust b/sources/web/templates_src/src/datepicker_button.dust deleted file mode 100644 index b94382f..0000000 --- a/sources/web/templates_src/src/datepicker_button.dust +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/sources/web/templates_src/src/event_delete_dialog.dust b/sources/web/templates_src/src/event_delete_dialog.dust deleted file mode 100644 index 03f4c32..0000000 --- a/sources/web/templates_src/src/event_delete_dialog.dust +++ /dev/null @@ -1,20 +0,0 @@ -
          -{>form_open/} - - - - - - -

          {@i18n type="messages" name="info_confirmeventdelete"/}

          - -

          -{title} -

          - -{?rrule} -

          {@i18n type="messages" name="info_repetitivedeleteall"/}

          -{/rrule} - -{>form_close/} -
          diff --git a/sources/web/templates_src/src/event_details_popup.dust b/sources/web/templates_src/src/event_details_popup.dust deleted file mode 100644 index ed2b73e..0000000 --- a/sources/web/templates_src/src/event_details_popup.dust +++ /dev/null @@ -1,42 +0,0 @@ -

          {formatted_start} {formatted_end}

          -
          -
          {@i18n type="labels" name="calendar"/}
          -
          -{caldata.displayname}
          - -{?location} -
          {@i18n type="labels" name="location"/}
          -
          {location}
          -{/location} - -{?description} -
          {@i18n type="labels" name="description"/}
          -
          {formatted_description}
          -{/description} - -{?rrule} -
          {@i18n type="labels" name="repeat"/}
          -{?rrule_explained} -
          {@i18n type="messages" name="info_repetition_human" explanation="{rrule_explained}"/}
          - {:else} -
          {@i18n type="messages" name="info_repetition_unparseable"/} {rrule}
          - {/rrule_explained} -{/rrule} - -{#reminders} -
          {@i18n type="labels" name="reminder"/}
          -
          {>reminder_description /}
          -{/reminders} - -{^disable_actions} -
          - - -
          -{/disable_actions} - -
          - diff --git a/sources/web/templates_src/src/form_close.dust b/sources/web/templates_src/src/form_close.dust deleted file mode 100644 index 5582354..0000000 --- a/sources/web/templates_src/src/form_close.dust +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sources/web/templates_src/src/form_element_end.dust b/sources/web/templates_src/src/form_element_end.dust deleted file mode 100644 index 5aa9962..0000000 --- a/sources/web/templates_src/src/form_element_end.dust +++ /dev/null @@ -1,3 +0,0 @@ -{?input_help}

          {input_help}

          {/input_help} -
          -
          diff --git a/sources/web/templates_src/src/form_element_start.dust b/sources/web/templates_src/src/form_element_start.dust deleted file mode 100644 index 3b38518..0000000 --- a/sources/web/templates_src/src/form_element_start.dust +++ /dev/null @@ -1,4 +0,0 @@ -
          - -
          diff --git a/sources/web/templates_src/src/form_open.dust b/sources/web/templates_src/src/form_open.dust deleted file mode 100644 index ed7c284..0000000 --- a/sources/web/templates_src/src/form_open.dust +++ /dev/null @@ -1,4 +0,0 @@ -
          - diff --git a/sources/web/templates_src/src/reminder_description.dust b/sources/web/templates_src/src/reminder_description.dust deleted file mode 100644 index 58e1df2..0000000 --- a/sources/web/templates_src/src/reminder_description.dust +++ /dev/null @@ -1,14 +0,0 @@ -{?is_absolute} -{tdate} {ttime} -{:else} -{qty} -{@select key="{interval}"} - {@eq value="min"}{@i18n type="labels" name="minutes"/}{/eq} - {@eq value="hour"}{@i18n type="labels" name="hours"/}{/eq} - {@eq value="day"}{@i18n type="labels" name="days"/}{/eq} - {@eq value="week"}{@i18n type="labels" name="weeks"/}{/eq} -{/select} - -{?before}{@i18n type="labels" name="before"/}{:else}{@i18n type="labels" name="after"/}{/before} -{?relatedStart}{@i18n type="labels" name="start"/}{:else}{@i18n type="labels" name="end"/}{/relatedStart} -{/is_absolute} diff --git a/sources/web/templates_src/src/reminder_row.dust b/sources/web/templates_src/src/reminder_row.dust deleted file mode 100644 index 7d93d35..0000000 --- a/sources/web/templates_src/src/reminder_row.dust +++ /dev/null @@ -1,63 +0,0 @@ - - - - -{^add} - -{/add} - -{?is_absolute} - -{:else} - -{/is_absolute} - - -{?is_absolute} - - - - - -{^add} - - - -{/add} -{:else} - - - - - - - -{^add} - - -{/add} - -{/is_absolute} - - -{?add} -{@i18n type= -{:else} -{@i18n type= -{/add} - - - - diff --git a/sources/web/templates_src/src/reminders_table.dust b/sources/web/templates_src/src/reminders_table.dust deleted file mode 100644 index 7645e40..0000000 --- a/sources/web/templates_src/src/reminders_table.dust +++ /dev/null @@ -1,35 +0,0 @@ -{#visible_reminders} - -{/visible_reminders} - - - - - - - - {#reminders} - {>reminder_row/} - {/reminders} - - - - -
          - {@i18n type="messages" name="info_noreminders"/} -
          - -{@i18n type="labels" name="newreminder"/} - - -{>reminder_row add="true" /} - -
          - -{@i18n type="labels" name="newreminder"/} - - -{>reminder_row add="true" is_absolute="true"/} - -
          -