From 0d3c20023493f23cd9dc56972d609a02bb34ec1e Mon Sep 17 00:00:00 2001 From: Kuzkay <31634013+Kuzkay@users.noreply.github.com> Date: Sun, 15 Dec 2019 19:51:32 +0100 Subject: [PATCH] part 2 --- OKAYY Framework Basic/Basic.sql | 198 + OKAYY Framework Basic/LICENSE | 674 + OKAYY Framework Basic/OAC/ac_s.lua | 119 + OKAYY Framework Basic/OAC/package.json | 9 + OKAYY Framework Basic/README.md | 110 + OKAYY Framework Basic/database.lua | 51 + .../kuz_Notifications/client.lua | 105 + .../kuz_Notifications/gui/notify.css | 122 + .../kuz_Notifications/gui/notify.html | 23 + .../kuz_Notifications/gui/notify.js | 65 + .../kuz_Notifications/package.json | 20 + .../kuz_Notifications/sounds/notification.wav | Bin 0 -> 86664 bytes .../kuz_Notifications/utils/Yanone.ttf | Bin 0 -> 106352 bytes .../kuz_Notifications/utils/jquery-ui.js | 18706 ++++++++++++++++ .../kuz_Notifications/utils/jquery.js | 2 + OKAYY Framework Basic/kuz_UI/client.lua | 93 + OKAYY Framework Basic/kuz_UI/gui/ui.css | 158 + OKAYY Framework Basic/kuz_UI/gui/ui.html | 44 + OKAYY Framework Basic/kuz_UI/gui/ui.js | 56 + OKAYY Framework Basic/kuz_UI/package.json | 18 + OKAYY Framework Basic/kuz_UI/utils/Yanone.ttf | Bin 0 -> 106352 bytes OKAYY Framework Basic/kuz_UI/utils/click.wav | Bin 0 -> 15940 bytes .../kuz_UI/utils/jquery-ui.js | 18706 ++++++++++++++++ OKAYY Framework Basic/kuz_UI/utils/jquery.js | 2 + OKAYY Framework Basic/kuz_Undermap/client.lua | 21 + .../kuz_Undermap/package.json | 11 + OKAYY Framework Basic/kuz_Undermap/server.lua | 7 + OKAYY Framework Basic/kuz_Usable/client.lua | 4 + OKAYY Framework Basic/kuz_Usable/package.json | 11 + OKAYY Framework Basic/kuz_Usable/server.lua | 139 + OKAYY Framework Basic/server_config.json | 33 + 31 files changed, 39507 insertions(+) create mode 100644 OKAYY Framework Basic/Basic.sql create mode 100644 OKAYY Framework Basic/LICENSE create mode 100644 OKAYY Framework Basic/OAC/ac_s.lua create mode 100644 OKAYY Framework Basic/OAC/package.json create mode 100644 OKAYY Framework Basic/README.md create mode 100644 OKAYY Framework Basic/database.lua create mode 100644 OKAYY Framework Basic/kuz_Notifications/client.lua create mode 100644 OKAYY Framework Basic/kuz_Notifications/gui/notify.css create mode 100644 OKAYY Framework Basic/kuz_Notifications/gui/notify.html create mode 100644 OKAYY Framework Basic/kuz_Notifications/gui/notify.js create mode 100644 OKAYY Framework Basic/kuz_Notifications/package.json create mode 100644 OKAYY Framework Basic/kuz_Notifications/sounds/notification.wav create mode 100644 OKAYY Framework Basic/kuz_Notifications/utils/Yanone.ttf create mode 100644 OKAYY Framework Basic/kuz_Notifications/utils/jquery-ui.js create mode 100644 OKAYY Framework Basic/kuz_Notifications/utils/jquery.js create mode 100644 OKAYY Framework Basic/kuz_UI/client.lua create mode 100644 OKAYY Framework Basic/kuz_UI/gui/ui.css create mode 100644 OKAYY Framework Basic/kuz_UI/gui/ui.html create mode 100644 OKAYY Framework Basic/kuz_UI/gui/ui.js create mode 100644 OKAYY Framework Basic/kuz_UI/package.json create mode 100644 OKAYY Framework Basic/kuz_UI/utils/Yanone.ttf create mode 100644 OKAYY Framework Basic/kuz_UI/utils/click.wav create mode 100644 OKAYY Framework Basic/kuz_UI/utils/jquery-ui.js create mode 100644 OKAYY Framework Basic/kuz_UI/utils/jquery.js create mode 100644 OKAYY Framework Basic/kuz_Undermap/client.lua create mode 100644 OKAYY Framework Basic/kuz_Undermap/package.json create mode 100644 OKAYY Framework Basic/kuz_Undermap/server.lua create mode 100644 OKAYY Framework Basic/kuz_Usable/client.lua create mode 100644 OKAYY Framework Basic/kuz_Usable/package.json create mode 100644 OKAYY Framework Basic/kuz_Usable/server.lua create mode 100644 OKAYY Framework Basic/server_config.json diff --git a/OKAYY Framework Basic/Basic.sql b/OKAYY Framework Basic/Basic.sql new file mode 100644 index 0000000..a74472b --- /dev/null +++ b/OKAYY Framework Basic/Basic.sql @@ -0,0 +1,198 @@ +-- -------------------------------------------------------- +-- Host: 185.158.249.251 +-- Server version: 5.7.28-0ubuntu0.18.04.4 - (Ubuntu) +-- Server OS: Linux +-- HeidiSQL Version: 9.5.0.5338 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + + +-- Dumping database structure for basic +CREATE DATABASE IF NOT EXISTS `basic` /*!40100 DEFAULT CHARACTER SET latin1 */; +USE `basic`; + +-- Dumping structure for table basic.items +CREATE TABLE IF NOT EXISTS `items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `item` varchar(50) NOT NULL DEFAULT '0', + `title` varchar(50) NOT NULL DEFAULT '0', + `title_plural` varchar(50) DEFAULT NULL, + `max` int(11) NOT NULL DEFAULT '1', + `model` int(11) DEFAULT NULL, + `model_scale` float DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `item` (`item`) +) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.items: ~31 rows (approximately) +/*!40000 ALTER TABLE `items` DISABLE KEYS */; +INSERT INTO `items` (`id`, `item`, `title`, `title_plural`, `max`, `model`, `model_scale`) VALUES + (1, 'cocaine', 'Cocaine', 'Cocaine', 5, 619, 0.5), + (2, 'weed', 'Weed', 'Weed', 10, NULL, 0.4), + (3, 'empty', 'Test Item', 'Test Items', 10, NULL, NULL), + (4, 'bandage', 'Bandage', 'Bandages', 3, 803, 2.5), + (5, 'medkit', 'First Aid Kit', 'First Aid Kits', 1, 800, 1), + (6, 'ammo', 'Ammo Box', 'Ammo Boxes', 3, 989, 1), + (7, 'donut', 'Donut', 'Donuts', 12, NULL, NULL), + (8, 'cannabis', 'Cannabis', 'Cannabis', 20, NULL, NULL), + (9, 'meth', 'Meth', 'Meth', 10, NULL, NULL), + (10, 'coca', 'Coca leaf', 'Coca leaves', 8, NULL, NULL), + (11, 'garbage', 'Garbage', 'Garbage', 1, 514, 0.7), + (12, 'asphalt', 'Asphalt', 'Asphalt', 1, NULL, NULL), + (13, 'package', 'Package', 'Packages', 1, NULL, NULL), + (14, 'firework', 'Fireworks', 'Fireworks', 5, NULL, NULL), + (15, 'bigfirework', 'Fireworks Pack', 'Fireworks Pack', 1, NULL, NULL), + (16, 'gas', 'Gasoline', 'Gasoline', 2, 507, 0.9), + (17, 'acetone', 'Acetone', 'Acetone', 2, 564, 0.7), + (18, 'calcium', 'Calcium Chloride', 'Calcium Chloride', 3, 807, 3), + (19, 'poppy', 'Opium Poppy', 'Opium Poppies', 12, NULL, NULL), + (20, 'heroin', 'Heroin', 'Heroin', 5, NULL, NULL), + (21, 'repairkit', 'Repair kit', 'Repair kits', 1, 551, 0.7), + (22, 'ore', 'Ore', 'Ores', 1, NULL, NULL), + (23, 'ziptie', 'Ziptie', 'Zipties', 1, NULL, NULL), + (24, 'cuffs', 'Cuffs', 'Cuffs', 1, 1439, 1.2), + (25, 'beer', 'Beer', 'Beers', 6, 1630, 1), + (26, 'vodka', 'Vodka', 'Vodka', 2, 1613, 1), + (27, 'tequilla', 'Tequilla', 'Tequilla', 2, 1238, 1), + (28, 'pliers', 'Pliers', 'Pliers', 1, 552, 1.2), + (29, 'pizza', 'Pizza', 'Pizzas', 1, NULL, NULL), + (30, 'fastfood', 'Fastfood bag', 'Fastfood Bags', 1, NULL, NULL), + (31, 'lumber', 'Lumber', 'Lumber', 4, NULL, NULL); +/*!40000 ALTER TABLE `items` ENABLE KEYS */; + +-- Dumping structure for table basic.jobs +CREATE TABLE IF NOT EXISTS `jobs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` char(50) DEFAULT NULL, + `title` char(50) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.jobs: ~12 rows (approximately) +/*!40000 ALTER TABLE `jobs` DISABLE KEYS */; +INSERT INTO `jobs` (`id`, `name`, `title`) VALUES + (1, 'unemployed', 'Unemployed'), + (2, 'police', 'Police'), + (3, 'roadworker', 'Roadworker'), + (4, 'garbage', 'Garbage'), + (5, 'delivery', 'Delivery'), + (6, 'offpolice', 'Police'), + (7, 'ems', 'EMS'), + (8, 'offems', 'EMS'), + (9, 'miner', 'Miner'), + (10, 'pizza', 'Pizza'), + (11, 'fastfood', 'Fastfood'), + (12, 'lumberjack', 'Lumberjack'); +/*!40000 ALTER TABLE `jobs` ENABLE KEYS */; + +-- Dumping structure for table basic.jobs_grades +CREATE TABLE IF NOT EXISTS `jobs_grades` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job` char(50) NOT NULL DEFAULT '0', + `job_grade` int(11) NOT NULL DEFAULT '0', + `job_grade_title` char(50) NOT NULL DEFAULT '0', + `paycheck` int(11) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.jobs_grades: ~34 rows (approximately) +/*!40000 ALTER TABLE `jobs_grades` DISABLE KEYS */; +INSERT INTO `jobs_grades` (`id`, `job`, `job_grade`, `job_grade_title`, `paycheck`) VALUES + (1, 'unemployed', 1, 'Citizen', 350), + (2, 'police', 1, 'Cadet', 460), + (3, 'police', 2, 'Officer', 650), + (4, 'police', 3, 'Corporal', 780), + (5, 'police', 4, 'Sergeant', 850), + (6, 'police', 5, 'Lieutenant', 900), + (7, 'police', 6, 'Captain', 1100), + (8, 'police', 7, 'Deputy Chief', 1550), + (9, 'police', 8, 'Chief', 2000), + (10, 'roadworker', 1, 'Worker', 350), + (11, 'garbage', 1, 'Worker', 350), + (12, 'delivery', 1, 'Driver', 350), + (13, 'offpolice', 1, 'Off-duty', 400), + (14, 'offpolice', 2, 'Off-duty', 500), + (15, 'offpolice', 3, 'Off-duty', 600), + (16, 'offpolice', 4, 'Off-duty', 700), + (17, 'offpolice', 5, 'Off-duty', 800), + (18, 'offpolice', 6, 'Off-duty', 900), + (19, 'offpolice', 7, 'Off-duty', 1000), + (20, 'offpolice', 8, 'Off-duty', 1200), + (21, 'ems', 1, 'Trainee', 500), + (22, 'ems', 2, 'EMT', 600), + (23, 'ems', 3, 'Paramedic', 900), + (24, 'ems', 4, 'Deputy-Chief', 1500), + (25, 'ems', 5, 'Chief', 2000), + (26, 'offems', 1, 'Off-duty', 400), + (27, 'offems', 2, 'Off-duty', 500), + (28, 'offems', 3, 'Off-duty', 700), + (29, 'offems', 4, 'Off-duty', 900), + (30, 'offems', 5, 'Off-duty', 1100), + (31, 'miner', 1, 'Worker', 350), + (32, 'pizza', 1, 'Delivery', 350), + (33, 'fastfood', 1, 'Delivery', 350), + (34, 'lumberjack', 1, 'Worker', 350); +/*!40000 ALTER TABLE `jobs_grades` ENABLE KEYS */; + +-- Dumping structure for table basic.profiles +CREATE TABLE IF NOT EXISTS `profiles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `steamid` varchar(50) DEFAULT NULL, + `name` varchar(50) DEFAULT NULL, + `money` int(11) DEFAULT '0', + `bank` int(11) DEFAULT '0', + `role` varchar(50) DEFAULT NULL, + `level` int(11) DEFAULT NULL, + `experience` int(11) DEFAULT NULL, + `position` text, + `inventory` longtext NOT NULL, + `job` varchar(50) DEFAULT 'unemployed', + `job_grade` int(11) DEFAULT '1', + `phone` int(6) DEFAULT NULL, + `dead` int(11) NOT NULL DEFAULT '0', + `donator` int(11) DEFAULT '0', + `last_update` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.profiles: ~1 rows (approximately) +/*!40000 ALTER TABLE `profiles` DISABLE KEYS */; +/*!40000 ALTER TABLE `profiles` ENABLE KEYS */; + +-- Dumping structure for table basic.server_info +CREATE TABLE IF NOT EXISTS `server_info` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `data` varchar(50) DEFAULT NULL, + `value` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.server_info: ~0 rows (approximately) +/*!40000 ALTER TABLE `server_info` DISABLE KEYS */; +INSERT INTO `server_info` (`id`, `data`, `value`) VALUES + (1, 'time', '12'); +/*!40000 ALTER TABLE `server_info` ENABLE KEYS */; + +-- Dumping structure for table basic.storages +CREATE TABLE IF NOT EXISTS `storages` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `server` int(11) NOT NULL DEFAULT '1', + `storage` varchar(50) NOT NULL DEFAULT '0', + `slots` int(11) DEFAULT NULL, + `inventory` longtext, + `last_update` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=latin1; + +-- Dumping data for table basic.storages: ~0 rows (approximately) +/*!40000 ALTER TABLE `storages` DISABLE KEYS */; +/*!40000 ALTER TABLE `storages` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/OKAYY Framework Basic/LICENSE b/OKAYY Framework Basic/LICENSE new file mode 100644 index 0000000..871ce8e --- /dev/null +++ b/OKAYY Framework Basic/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/OKAYY Framework Basic/OAC/ac_s.lua b/OKAYY Framework Basic/OAC/ac_s.lua new file mode 100644 index 0000000..4bb6a15 --- /dev/null +++ b/OKAYY Framework Basic/OAC/ac_s.lua @@ -0,0 +1,119 @@ +local timer = 0 +local checkTime = 500 + +------------------------------------- +--- ANTI TELEPORT --- +------------------------------------- +local ANTI_TELEPORT = true + +local distanceThreshold = 900 +local aimingThreshold = 255 +local vehicleThreshold = 12000 +--UNEDITABLE +local lastLocations = {} +------------------------------------- + + + +function OnPackageStart() + Delay(2000, function() + timer = CreateTimer(AcMain, checkTime) + end) +end +AddEvent("OnPackageStart", OnPackageStart) + + +function AddOACMessage(player, message) + --AddPlayerChat(player, '[OAC] '..message..'') +end + + +function SafeTeleport(player, x,y,z) + PauseTimer(timer) + Delay(10, function() + lastLocations[player] = {} + lastLocations[player].x = x + lastLocations[player].y = y + lastLocations[player].z = z + SetPlayerLocation(player, x,y,z) + Delay(100, function() + UnpauseTimer(timer) + end) + end) + + +end +AddEvent("SafeTeleport", SafeTeleport) + + +function SafeTeleportVehicle(player, vehicle, x,y,z) + PauseTimer(timer) + Delay(10, function() + lastLocations[player] = {} + lastLocations[player].x = x + lastLocations[player].y = y + lastLocations[player].z = z + SetVehicleLocation(vehicle, x,y,z) + Delay(100, function() + UnpauseTimer(timer) + end) + end) + + +end +AddEvent("SafeTeleportVehicle", SafeTeleportVehicle) + +local lastVeh = {} +local lastAim = {} +function AcMain() + for _,v in pairs(GetAllPlayers()) do + --ANTI TELEPORT // SPEED HACK MODULE + if ANTI_TELEPORT and GetPlayerPropertyValue(v, "loaded") ~= nil then + + local x,y,z = GetPlayerLocation(v) + if lastLocations[v] ~= nil then + local l = lastLocations[v] + local inVeh = false + + local distance = distanceThreshold + if GetPlayerVehicle(v) ~= 0 or lastVeh[v] then + distance = vehicleThreshold + inVeh = true + lastVeh[v] = true + else + lastVeh[v] = false + end + + if IsPlayerAiming(v) then + if lastAim[v] then + distance = aimingThreshold + end + lastAim[v] = true + else + lastAim[v] = false + end + + if GetDistance3D(x,y,0,l.x,l.y,0) >= distance then + if inVeh then + CallEvent("SafeTeleportVehicle", v, GetPlayerVehicle(v), l.x,l.y,l.z + 100) + --print("(".. v ..") " .. GetPlayerName(v) .. " moved too quickly: " .. math.floor(GetDistance3D(x,y,0,l.x,l.y,0) / 100) .. " meters in " .. (checkTime / 1000) .." seconds") + AddOACMessage(v, "You moved too quickly!") + else + CallEvent("SafeTeleport", v, l.x,l.y,l.z + 50) + --print("(".. v ..") " .. GetPlayerName(v) .. " moved too quickly: " .. math.floor(GetDistance3D(x,y,0,l.x,l.y,0) / 100) .. " meters in " .. (checkTime / 1000) .." seconds") + AddOACMessage(v, "You moved too quickly!") + end + end + + end + lastLocations[v] = {} + lastLocations[v].x = x + lastLocations[v].y = y + lastLocations[v].z = z + end + end +end + +AddEvent("OnPlayerQuit", function(player) + lastLocations[player] = nil +end) \ No newline at end of file diff --git a/OKAYY Framework Basic/OAC/package.json b/OKAYY Framework Basic/OAC/package.json new file mode 100644 index 0000000..7fcb7c8 --- /dev/null +++ b/OKAYY Framework Basic/OAC/package.json @@ -0,0 +1,9 @@ +{ + "author": "Kuzkay", + "version": "1.0", + "server_scripts": [ + "ac_s.lua" + ], + "client_scripts": [], + "files": [] +} diff --git a/OKAYY Framework Basic/README.md b/OKAYY Framework Basic/README.md new file mode 100644 index 0000000..35c4c19 --- /dev/null +++ b/OKAYY Framework Basic/README.md @@ -0,0 +1,110 @@ +# OKAYY Framework (Basic) +This framework is the most basic version which is available for free to download and create scripts for. +This version contains: +* Inventory system +* Vehicle trunk system +* Storage system +* Basic Banking +* Shops +* Very basic anti-cheat +* Couple usable items +* Car speedometer +* Teleport players that fell underground +* Time + Weather sync + + +# Basics + +## Import OKAYY Framework to your own package +Good example of using the kuz_Essentials in an external package is the kuz_Usable package + +```lua + local kes = ImportPackage('kuz_Essentials') +``` + +# Profile functions + +## kes.savePlayer(player) +This function allows you to force save players position, inventory and balance + + +## kes.getPlayerData(player) +This function returns the player's PlayerData table + +## kes.getPlayerRole(player) +This function gets players role (only role in this version is 'criminal' This has no meaning but can be used to setup multiple characters and player saves, just ignore it if you don't understand) + +## kes.setPlayerJob(player, job, grade) +This function sets players job. + +## kes.getPlayerJob(player) +This function returns players job + +## kes.getPlayerJobGrade(player) +This function returns players job grade + +## kes.getMoney(player) +This function returns player CASH balance + +## kes.addMoney(player, amount) +This function adds onto players CASH balance + +## kes.removeMoney(player, amount) +This function removes from player CASH balance + +## kes.getBank(player) +This functions returns player BANK balance + +## kes.addBank(player, amount) +This function adds onto players BANK balance + +## kes.removeBank(player, amount) +This function removes from player BANK balance + +## kes.getLevel(player) +This function returns players level + +## kes.addLevel(player, amount) +This function add levels to player + +## kes.removeLevel(player, amount) +This function lowers players level + +## kes.getExperience(player) +This function returns players XP + +## kes.addExperience(player, amount) +This function adds XP to the player + +## kes.removeExperience(player, amount) +This function removes XP from the player + + + + +# Inventory functions + + +## kes.addItem(player, item, amount) +Adds an item to players inventory, returns true on success and false on failure + +## kes.removeItem(player, item, amount) +Removes an item from players inventory, returns true on success and false on failure + +## kes.clearPlayerInventory(player) +This function removes all players items + +## kes.getItemCount(player, item) +This function gets the amount of item that player has + +## kes.getItemNames(item) +This function returns the single and plural item names + + + +# Usable items + +When player right clicks and item and presses "Use" the SERVER sided event "Kuzkay:UseItem:{item name}" gets called +for example `Kuzkay:UseItem:bandage` gets called when player uses the item, The first parameter of this event is the player and second parameter is the item(could be used to call same function from different items) + +Good example of this can be found in package `kuz_Usable` diff --git a/OKAYY Framework Basic/database.lua b/OKAYY Framework Basic/database.lua new file mode 100644 index 0000000..394df31 --- /dev/null +++ b/OKAYY Framework Basic/database.lua @@ -0,0 +1,51 @@ +--[[ +Copyright (C) 2019 Blue Mountains GmbH + +This program is free software: you can redistribute it and/or modify it under the terms of the Onset +Open Source License as published by Blue Mountains GmbH. + +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 Onset Open Source License for more details. + +You should have received a copy of the Onset Open Source License along with this program. If not, +see https://bluemountains.io/Onset_OpenSourceSoftware_License.txt +]]-- + +sql = false + +local SQL_HOST = "localhost" +local SQL_PORT = 3306 +local SQL_USER = "root" +local SQL_PASS = "" +local SQL_DATA = "basic" +local SQL_CHAR = "utf8mb4" +local SQL_LOGL = "error" + +-- Setup a MariaDB connection when the package/server starts +local function OnPackageStart() + mariadb_log(SQL_LOGL) + + sql = mariadb_connect(SQL_HOST .. ':' .. SQL_PORT, SQL_USER, SQL_PASS, SQL_DATA) + + if (sql ~= false) then + print("MariaDB: Connected to " .. SQL_HOST) + mariadb_set_charset(sql, SQL_CHAR) + else + print("MariaDB: Connection failed to " .. SQL_HOST .. ", see mariadb_log file") + + -- Immediately stop the server if we cannot connect + ServerExit() + end + + CallEvent("database:connected") +end +AddEvent("OnPackageStart", OnPackageStart) + +-- Cleanup the MariaDB connection when the package/server stops +local function OnPackageStop() + mariadb_close(sql) +end +AddEvent("OnPackageStop", OnPackageStop) + +-- ALTER TABLE log_chat ADD FOREIGN KEY (id) REFERENCES accounts (id) ON UPDATE CASCADE ON DELETE CASCADE; diff --git a/OKAYY Framework Basic/kuz_Notifications/client.lua b/OKAYY Framework Basic/kuz_Notifications/client.lua new file mode 100644 index 0000000..e4ee809 --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/client.lua @@ -0,0 +1,105 @@ +local ui = 0 +local timer = 0 + +function OnPackageStart() + ui = CreateWebUI(0, 0, 0, 0, 5, 30) + LoadWebFile(ui, "http://asset/kuz_Notifications/gui/notify.html") + SetWebAlignment(ui, 0.0, 0.0) + SetWebAnchors(ui, 0.0, 0.0, 1.0, 1.0) + SetWebVisibility(ui, WEB_HIDDEN) +end +AddEvent("OnPackageStart", OnPackageStart) + +function SendNotification(text, color) + SetWebVisibility(ui, WEB_HITINVISIBLE) + if IsValidTimer(timer) then + DestroyTimer(timer) + end + timer = CreateTimer(HideUI, 8000) + if color == nil then color = "#999" end + ExecuteWebJS(ui, 'SendNotification("'..text..'","'..color..'")') +end +AddEvent('KNotify:Send', SendNotification) +AddRemoteEvent('KNotify:Send', SendNotification) + + +function SendPress(text) + SetWebVisibility(ui, WEB_HITINVISIBLE) + if IsValidTimer(timer) then + DestroyTimer(timer) + end + timer = CreateTimer(HideUI, 8000) + ExecuteWebJS(ui, 'SendPress("'..text..'")') +end +AddEvent('KNotify:SendPress', SendPress) +AddRemoteEvent('KNotify:SendPress', SendPress) + +function HidePress() + ExecuteWebJS(ui, 'HidePress()') +end +AddEvent('KNotify:HidePress', HidePress) +AddRemoteEvent('KNotify:HidePress', HidePress) + +function HideUI() + ExecuteWebJS(ui, 'HidePress()') +end + + +local progressBars = {} +function AddProgressBar(text, duration, color, id, automatic) + RemoveProgressBar(id) + local time = tonumber(duration - 1) * 10 + ExecuteWebJS(ui, 'AddProgressBar("'..text..'", "'..color..'","'..id..'")') + + if automatic or automatic == nil then + progressBars[id] = {} + progressBars[id].progress = 1 + progressBars[id].timer = CreateTimer(MoveProgressBar, time, id) + end +end +AddEvent('KNotify:AddProgressBar', AddProgressBar) +AddRemoteEvent('KNotify:AddProgressBar', AddProgressBar) + +function MoveProgressBar(id) + if progressBars[id].progress >= 100 then + if progressBars[id].timer ~= 0 then + DestroyTimer(progressBars[id].timer) + progressBars[id].timer = 0 + end + Delay(5000, function() + if progressBars[id].timer == 0 then + RemoveProgressBar(id) + end + end) + else + progressBars[id].progress = progressBars[id].progress + 1 + SetProgressBar(id, progressBars[id].progress) + end +end + +function SetProgressBarText(id, text) + ExecuteWebJS(ui, 'SetProgressBarText("'..id..'","'..text..'")') +end +AddEvent('KNotify:SetProgressBarText', SetProgressBarText) +AddRemoteEvent('KNotify:SetProgressBarText', SetProgressBarText) + + +function SetProgressBar(id, progress) + ExecuteWebJS(ui, 'MoveProgressBar("'..id..'","'..progress..'")') +end +AddEvent('KNotify:SetProgressBar', SetProgressBar) +AddRemoteEvent('KNotify:SetProgressBar', SetProgressBar) + +function RemoveProgressBar(id) + if progressBars[id] ~= nil then + if IsValidTimer(progressBars[id].timer) then + DestroyTimer(progressBars[id].timer) + end + end + ExecuteWebJS(ui, 'RemoveProgressBar("'..id..'")') +end +AddEvent('KNotify:RemoveProgressBar', RemoveProgressBar) +AddRemoteEvent('KNotify:RemoveProgressBar', RemoveProgressBar) + + + diff --git a/OKAYY Framework Basic/kuz_Notifications/gui/notify.css b/OKAYY Framework Basic/kuz_Notifications/gui/notify.css new file mode 100644 index 0000000..5dd63ab --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/gui/notify.css @@ -0,0 +1,122 @@ +@font-face { + font-family: Yanone Kaffeesatz; + src: url('http://asset/kuz_Notifications/utils/Yanone.ttf'); +} +html, body{ + margin:0 auto; + overflow: hidden; + font-family: 'Yanone Kaffeesatz', sans-serif !important; +} + + +.notificationsBox{ + position: absolute; + height: 80%; + width: 13%; + margin-left: 87%; + margin-top: 20%; + /*display: block;*/ + flex-direction: row-reverse; +} +.notification{ + transform: translate(100%, 0px); + transition-duration: 1s; + margin-bottom: 0%; + margin-top: 0%; + /*position: relative;*/ + background: rgba(90,90,90,0.8); + height: 0%; + width: 100%; + box-sizing: border-box; + -webkit-box-sizing: border-box; + border-left: 15px solid lightblue; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + text-align: center; + justify-content: center; + align-content: center; + display: table; +} + + +.notificationText{ + position: relative; + font-family: 'Yanone Kaffeesatz', sans-serif !important; + color: rgba(255,255,255,0.9); + font-size: 1.7vh; + text-align: center; + height: 90%; + width: 90%; + margin: 5%; + display: table-cell; + vertical-align: middle; +} + +.pressNoti{ + position: absolute; + height: 4%; + width: 12%; + left: 87%; + top: 95%; + right: 1%; + bottom: 1% + + /*display: block;*/ + flex-direction: row-reverse; + background-color: #262626; + border: solid 1px #545454; + border-radius: 4px; + + text-align: center; + justify-content: center; + align-content: center; + display: table; + -webkit-animation: colorchange 1.5s infinite; +} +@-webkit-keyframes colorchange + { + 0% {background: #262626;} + 50% {background: #424242;} + 100% {background: #262626;} + } + + +.progressBarsBox{ + opacity: 0.7; + position: absolute; + height: 25%; + width: 30%; + top: 3%; + left: 35%; + /*display: block;*/ + flex-direction: row-reverse; + +} +.progressBar{ + position: relative; + margin-bottom: 0%; + margin-top: 1%; + /*position: relative;*/ + height: 10%; + width: 100%; + background: #404040; + justify-content: center; + text-align: center; + overflow: hidden; + border: solid 1px #2e2e2e; + border-radius: 1.2vh; +} +.progress{ + position: absolute; + z-index: 4; + float: left; + clear: both; +} +.progressBar label{ + position: absolute; + transform: translate(-50%, 25%); + font-size: 2.1vh; + color: white; + z-index: 5; + vertical-align: middle; +} diff --git a/OKAYY Framework Basic/kuz_Notifications/gui/notify.html b/OKAYY Framework Basic/kuz_Notifications/gui/notify.html new file mode 100644 index 0000000..a2f9859 --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/gui/notify.html @@ -0,0 +1,23 @@ + + + + + + + + + +
+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/OKAYY Framework Basic/kuz_Notifications/gui/notify.js b/OKAYY Framework Basic/kuz_Notifications/gui/notify.js new file mode 100644 index 0000000..8ecfdf0 --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/gui/notify.js @@ -0,0 +1,65 @@ +function SendNotification(text, color){ + var num = $('.notification').length + 1; + + $(".notificationsBox").prepend('

'+text+'

'); + $('#'+num).css('border-left', '15px solid ' + color); + + + + $('#'+ num) + .delay(250) + .queue(function (next) { + $(this).css('transition-duration', "0.3s"); + $(this).css('height', "6%"); + $(this).css('margin-top', "5%"); + $(this).css('margin-bottom', "5%"); + next(); + }); + + var audio = new Audio('http://asset/kuz_Notifications/sounds/notification.wav'); + audio.play(); + + $('#'+ num) + .delay(300) + .queue(function (next) { + $(this).css('transition-duration', "1s"); + $(this).css('transform', "translate(0%, 0px)"); + next(); + }); + $('#'+ num) + .delay(6000) + .queue(function (next) { + $(this).css('transition-duration', "1.5s"); + $(this).css('transform', "translate(0%, 3000px)"); + next(); + }); + $('#'+ num) + .delay(1500) + .queue(function (next) { + $(this).remove(); + next(); + }); +} +function HidePress(text){ + $(".pressNoti").fadeOut(250); +} +function SendPress(text){ + $(".pressText").html(text); + $(".pressNoti").fadeIn(250); +} + +function AddProgressBar(text, color_, id){ + var color = '#fafafa'; + if(color_ != null){ color = color_ } + $(".progressBarsBox").append('
'); +} + +function MoveProgressBar(id, percentage){ + $("#bar_" + id).find(".progress").css("width", percentage + "%"); +} +function RemoveProgressBar(id){ + $("#bar_" + id).fadeOut(500, function(){ $(this).remove(); }); +} +function SetProgressBarText(id, text){ + $("#bar_" + id).find("label").html(text.toUpperCase()); +} \ No newline at end of file diff --git a/OKAYY Framework Basic/kuz_Notifications/package.json b/OKAYY Framework Basic/kuz_Notifications/package.json new file mode 100644 index 0000000..242ec9f --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/package.json @@ -0,0 +1,20 @@ +{ + "author": "Kuzkay", + "version": "1.0", + "server_scripts": [], + "client_scripts": [ + "client.lua" + ], + "files": [ + "utils/jquery.js", + "utils/jquery-ui.js", + "utils/Yanone.ttf", + + "sounds/notification.wav", + + "gui/notify.html", + "gui/notify.css", + "gui/notify.js" + + ] +} diff --git a/OKAYY Framework Basic/kuz_Notifications/sounds/notification.wav b/OKAYY Framework Basic/kuz_Notifications/sounds/notification.wav new file mode 100644 index 0000000000000000000000000000000000000000..a04fe9607d516403ffbe427996419b819ee25637 GIT binary patch literal 86664 zcmeHQ2e@5TvEFB&b8B*M0zxPPB2_~XLJ0^+PhLQZNqC_cG#Z*B*N&F!b`H~*RZt~u-OeeOvkgzPonJ!{s?KmW{{UG6^n zhL6#sMvORXbS4;LX~__rsoJ2(h}Ob`ZVJt)eYFvtaigD;O7Gxk1Nj@oy`exr6B zJ@zxA?>cGX35T7s?rw)2bJ*k)k3MS3x?60!)n>zoZ#Hb3&4v%#La@8cl^6i!HYk^vHcjH_B@CQIn3C4DY_X z?lT0@F`*|0qxK)Y2hjUW+4tDVhn3f3Ls@SXj2bgyY^!Kro^bNv+ibV_R>L;ma*M5l zi4!JInEI7W5G@!2FnXm`Jw#x}h$3{w4d}3Guhf$f1cWx~v~z}EMKye)2C!jJXI(Cr z`b!IH@$KYQ6mu{WygIlS@R#IAGjcb~k2uG)KrPn|o$RX9t2w}{-2p#*u-IG<&sw+_ z=A@lSSB=)Gc8jt)yy1fSk(sPyQx15@=Cr>1*WEJKajC{gFhSR$XzW=#OjdUk*h3)g zF>*U4htB$0iNqeAC^r$6cGRl%;?vfs6{1Sj)Q2^9#Qf|Pm{~KfI@Mh*YC{&y2#q<( zs{Cr#4k?=FOPRL3H`O!;vvMbHugD&X0HHcCumGcCMZlwGiD z>_V$X&)Bz8REUb@6|kxy8d!~YpU|{=T>F|&bF*5+QD-*fWfd;7YRtz~Q7TXyJ}bRi zhwcVChU-%pWXpo?sc5CJ>yLi2I`$PE)GmSzl?H+KhJ8Us)PibYD@1wu(a(I;TVCZC zeD*Hz1F5}MMs`cj9X)Gkt2~D2pw>{7Sv!Dis%a(cqU#!}Q3N{(7UglD&~zXt_Kl%^ z(k^J{vhw@0vYS952EBx)@#vSbFh@purvuD-)LA7xT9@NPHb`AiA2bDxA`K!_)@T^$o~W*g1v$-2m1y42K&ei{eOay!EPcu z1Um|HSg>*MxnOOPPX#N>4(fyMs5|;k^uAQ|nq+*YT*2?7hoZYgZj0`SrbRbJzm0B) zZj^aibaQlTbbItWkv|CLiDPB1jsB-mOi+*xw( zDRt~E@)fCWZ1BHjIVd<#=w2^t8yI zL>`PDkZNw1>TZax6Zu71rbfRMxki3&6u~|o5ae{J7CnDEdMD}>!7*AjSS46LSTER8 zq=L~R2Zenl!DC9;#q7J^6Ir$lfrbVMD(`i`)_EJyRH=#SAO z(LEx!OaD+C>OpN+i(DmwHR`=tEuGa|}J2AaZOlDL6Hl5`0hO z!r%gt3xo4S&Jvj{a)b!_j9zXgXEBZguDdxR=)t2RIBuxxC(%!%b45-PnIv+!$Tvm4 zCGu?%*e?)4Pwy4Mx$&+Du4wFka}it{2L|JU<3v!$Pepz$a6;=re?BLIbL$w9i$ty$`Mt>VBC|yPEi!+BydS(Dyd(00$R9**6#0P&dJ2wDi=a;Q z@G=q9wv)(eBE6;F((59B6L~`9FCtHg%oKS`q$sjVv`REgw;~fo zHWYck^nU4Xkspd2D{_d)c#$JTP8IpN$b%x-Lvz#|Z6ktMoU?xu!Tk(1;=FrIWN>D1 zW{k)WMIIA*UF2zzXGH!ga<|BhBIk)5BC@9l_JqFQDuVL`#~%H}xwwx=lgNzHjM9%p zju1Iq@7Ac6}c;6;6R_<~SiL_=~GpCEZB(ih3b9jx&TOtQ!56C_*GBP(ZH%sKW zy5s7e7a3MRtbVk}+9I#iy;Ao*kti4Cjum+<`&hP4^n8@lPbs|}jK_VNA zd`;wbk(Tb3?h{33ij3|V-Sbb8@x9}FUlkdfADe$nWUInfh4VyaifmTgtaz5lKSg#Z z?NIuK$iQe|`P!H*zr79)4h|j{*&(w-x#ydOn}v6XY?s|GJ458_xv%GDi%hATf?uok zr-~Fsj&3-*;Q^6`#)ifnMaGLv7MUb+kjR!I?=`&FaIwg0BInkhTkaWtVKn3#ay?;B z_-N+Q46f(BqP?Oy#W}^B3O5x_$e)lO);p|saL?eLy6(E}rmm*0;hn=fr*ur|c((o7 z_K6~EwXfYCh-@fwnn-;|eaB3Ze{}w%v$eamds5G&p6=f6-s=k26(*J@mhd}kP&g=j zKl^_6*}7-ze%bKLhH*{fnsNhj1I`|J_Q0oFo@!}tZEt;c(6fUMAAI=W2Sx4|Ia=iJ zgZ@6~oz{0+A8vWLW&FVL10QOBsJXkbyKz9nfQHUoXKs2pJ;XJ>eQEnrZ@xGGSkGfU z)4Ha0-Q96_$L#sD=Z|k2-?qlQHRi20ceS~bKAiO7Mj~5?Tqd&L-2LW`n>TLWt!=lq zjc6ayzEbB(ovU}R-o1bC{=HWet|;`BdP|+nR;RSNdw70${>Q~17jZ4_8}1uk zo4YpmYW=JAZ#BNvcyIH)&Ep1+8+c30EiJdT-rhQK(8NK15_wYO43TGApJ_$^&m4H> zz_**(;K6tB)-o&QeH={@IkozwMb$DXps=uiIXStu|ri7=3xMvP8ZCl!)uwh}#-Yt74 zc2Denxbxx8F&$$%hPDrFA2olk`FFPcU)$j#Q`$~z`=`j+^Us-oZu`0I&vZQ9v0vBz zT`fH=J@b0!_P$eiw=kzPr}TdCpWvnNrSR_DUAam1lj?)UOyeO<2RBV_KB;-{0ecVl z>wu>Q;2~trfH?y$8t|h5Z%OYun%bN0YrMB{&xR2VH`m=<_eS=OY)_^;gM06)r6Hxw z3!4|d(ff_wKX*Ucy?57MU760XGwjHA?9skQ`;7TB=1&uOPGslyUD~@v=6AGp4DH&a z>*w89c5lZeb6+wagN*%W;eW8|5E+Aa^GypwdO7gFAC=c9|rqJqoY3+ z|5V(uutVXw-sgIM-g9NodEMuAU*B~@SJ;*5y1eu9&aZb)=sdP_Qs*NgBf3U*HOWPo z>&f+euJ?1j$L5dCzaaOzy-RzS@Vgto_pS}E4ZE}5*-h&gPv@7qG4p? zNV$qGY`je5n7o4W_~tkiRD&u@CZ)_Z90F8N*a zI~2ZH*t582@$02;l)e|89bFk*8C;jSK66VrExaasP4-*4Z{-Hnwbor+cS+rBkx$jH zT;EzhsD4)6th&oYJ}q)~?z_2}*%!0xWIvPLU#_iFGN)$ne1z{K^God|oOeGc{-B8S z=BUDvg{;V3`MdHLEVxO(`w#7xPYlG!A)Y3B9d_24JLW%9H+CRj_Jcixp}?+4}k$W(d0{;tT;(J|4X z(fIQ3>k-kOa_1iv?Jo0hk*(y}W@C{-BE?cko;W^`r=h1xw~Jg=y1MlJ(z&IRN+*|2 zD@~E7kPA!Kmu@IMTY9FHi2^xF+eY7sPM0UlzeO7a8_HA0IdW!w7#x&2IP?3=Lzy+h zPlv~gJQzL@%1ITjFMHWJ`=#t&B3}|&N#yD9nefc;jBq89i!+yGaw2%nz;pRV@(eVk zbb9H9;!OEXzGLx@!X47l?FujFU(WwD|FitbB4^~klmB)8H~IHP4lW#0_*dbr!jFp= z6~~swmOdM;C*Q&H(VM}W!Tp*0Gv|b7g(I^gv-7fT+2eD^=Ux<9t!}lt4eK_j`;^G5 zxmR;1i2Yx3@82Q2WA?c4*zgjm3D3fK#+@O3d9V0haY%91;<&DRYd-j9_~CJKy)C^P+#3 zW|s~U!SAQZBAdvwR!*uY6nYCoimMgJ6vq~CDNZY{EfwBS`fd676VHU_$ho;zX06P$ z%q^Ks!%f4Vh`b)Y77oe|&aN)fCAa1KL=Fwdhi}P!2Y0R@_DIDC-p06WL4T2gUQ`411$|j9)LkQ94?_3)ag+->>AJwW-`6ZWCEI zTsJ&bx_ZA{i*JUr!gs@WKSx95`@x054}&>!9~hY#QRe)MeAk$h z`9O|llSU`u9TX5-98nJqKJt}Y%kTHQf;;7#_!M~qvtxjJ!vi9xi|j6f?|QiZ%`CkrSL<`7mqh+8GB_Gs{_c8Y zbfmnYxJkaH&5qWRJ1ySUTq<&3aDVWMNSjE92=0OZ3|^IQBfl$ucg94BgWrnWDDMV- zBXU)6we0bH@g7}%$F`}wzi5Cxk zBJ#2bo@ep?67P9762ZF^9IHLb-(+`}cRoAFJCe=I@B8q+3GapEkyPFiy&XL-oqAm4 zk0SR+_sOpBD!-eMtUXOIG}T{JRL=<@`(J zeG$CB#M@}R%fq{rRb($~%k_@)1n+>h5ZP8_C&|3CyaU`-1n-o-Bo=(P+FAtfayAy( zK;CVAMq~}C3;S6`1e|s9E(LFtJLO$ryX3<=SLBA^{TJT9{zrc1$h*q9;zLb6BDgLP zhd0Hj4}v$l*fRw0;c!0Ueb>t6x0{~|RuX{?GmeW2cBO*4a4w;DcqfB;@vdyG@~+n@ z+lG|i`$cb8z7k2cqQ*xts zcz=g;6W;?G%Dron9krBuhyJxlO*lq)XO17BaL-1))Un3?G4S4<1KfCzj^l*))$Qf8 zxudLOjbn&+oOnkJA8JQmP(K9M*oWm~t~$T4_iv`K|}E_RgPOk-c2L#kr4Tg7d#=fk0QmvBFV;<#BP@_-$}U2)cY`qw0MLu`wD)*RWD< zutLLMm%z)jp0#7vYfG;$+O-CJYA^K|=wG_nSI(@5=Z$7ptM1Xoai^HU&3rtcIHTv4 zx~mg$I`9`+FkyfAWF`Cyn)Vr1*AcB+JFTCr0-UZNt}@M~okIk2aaJ9lDrLul4~=s@ z=bFr1V@3$qmV@U6Y%WJ-F03#R4~=Wss5`sH((W+)TQ4m5i!XX%hpuextQdImVdhzl zPNVnQalJmE1EZgAcjy4QG2_@nXrqpbV8cLO4xVAk&2vvPGpAzMD~&7@E%;zw-8;`W zw{JfucFmzz7_wVYFD#XVS=DNJsoMzEtp%NTj80cxc$mS?F2dKeW>{IhuQS5sf`uzr zo82q9;H8czhhe;5ulBre?G6tf4D!b1a6Z*EqWULtR!3BN7Y5HR`E~j0$_&~YzeBb+ z{ng;}V;whq&bW14TpYi(;V4xfahYm64wl*K)$^s^v;(#SJlEpRAZxR_jbG99h3SLE zTD{huAtvegz)nu9liS8or;l-5FN-;@X1|VVb^3eqV=aGwSR2cnwZ>SS)xim_I2(Mh zGZ)sxstr%1u(@dZ73+TQSv!15!{U;3#3t1RAL4XqU97GzpF;xA74Zv5{<~+3acH7A zlZESKq(fBh$L@_fYqEPlJpJUNA2WXR`c|5f^>EnQtQ~$}YaNWW{C>R6 zmBj1EC@$WL3N^3&LNXZS zhvo5ga$6p&gTt?p9ORGl!$v!149g2Wjt5rQdF@h%RdqeKwClh4*K-)(Ns)(np<@sW z-QEwewpi-Gvu0p0l(`ab?PZXB_;Iu^>dd@;JneqIBs=0Q7CNy>+|I6%)#AZLztzFv z=dymQS7PH_T@R8rz z7(*K|w8zcF(#QO;+iQw;;A+*$88Fe$i*dwQJ8i_!M|;w~VCQ*&SbI#U zg9|*iCae4YIBYd8)&Ndh19{;GCw{2IhrwLBay636`fJt6#o6vPNe4EGAHJkGYmejb zV=czUQpapD)pSK_-PAFY%eP^TJ^I7$8$KJqu)5{8d!gOtiqm1kk3COV17`g2T(mm) zVMiQ>X@m+&H-Dsk>s~rNji904|P9REq=tr)e&d&`LRY0 zj5s`Pwhm%#9FGI=7VBRJ^ecz`-T+JdU=8qA##iQIURxJ!h=tB;l64Ww^M^U$M=s{` zYXFYJ=CC&C8mC$K&CYTW&pb(7jA6ZwySC%UJc~QC4xfkh+q!&=zb2QzXP=9H%vNVE z+OS5C$!q=8G23CWuvc=q^MQc`;io>!V-2j;lZa!f=tBHE`|MO*?1S zz_p$Ix~*^N>D+;>EY4P21(wC{g}*=Rw>mOa!}|VOu(o)vCP35lKj=Us?|VVo5#<=dXup9$Hmd6n93EO7c{pbXmd|at}+`hSwm#$X1vKflFWeQCs5{zcQPRkdi0X;j*Qk5dPDeaD^Yw8dfKY#*n6eG+Sl z>$%$8-JcljUyon)-w^&WUi`k1aq*d!JVUkGZ0G#U{lz8uVegOE`k|96NoQ?-9POOx zCm-#YX(Pt^s@WJvJg~G`9e&u!Wp&0fj#%0;GtSqswp^AY2@5+$9F{hlk675O-D0f{ zJaMp7r`=+y!`B~{@jjMu9FAkZ!9rmSl%REk?zyR!pb!f zJ`e2{YcaIL7B`aYKGxzaf1FM%YLC;w?Z+kM^Y;&2l8w2@MVy~2sjg~va@siw4~(tF z=7+CZob@w~T#UnvVg1ngcD(E~eyqtsAGx?D7qQHNwbhB|YfqBXO3Swq-dd^#C<-ufC3TwK(|WhK=#{ zMa^aVj-1ta<7!H6X$R5{q#Z~*kai&LK-z(it^@W-#m{P=hJ4?OvSxp5FXC(~N@cpq54cac_~c3?&C zfc;ILUezo5*{~@4w`b6z#HTT72bNX`(sOfZbvBuoJ-5G2XiJV-F+3}3A3n-`+w*S4 zIIGfKrX5H-@X7B0@1nfJagCk(Hm(<~E0%fD7#1~(b+ZDl!ROn!wz+7tan_&eX$R5{ zq#a1=0Pi2xPg{CVv0X{^v;)gm2dZ7iOXAwL9My6yUtLS9{UmgN=O)fe|J+QnE$e;T zI&J-^%U>_+TGRY#2ht9t9Y{Nnb|CFQ+JUqKX$R5{q#Z~*kal22>A;Hko!q{o@Q<_K z53YS&x=uTgcHooW0bc*r?iuU?FeXrnH~ES4*OqH>^=jPJ^80aIqaMb^)n;*V{@QHGEX*CrP%c{7SJ<7cZ@#{9z%W9+ z`e|*9vV7KNu@a zx<{AKW=PTn^s#^Ctr zu?ME~-@T|^S%G(FmG)6NG?$(OPFFr!wPJFx`brF|SF5gEM(waNFuU56TWyGPS(t}h zI&0Oc<5O#P>m)yO6Un?bAAQy4%6#s8MvTp&-6z`ZA2?c}W7wL>L1y*w2!j=txc`ea zn83{ci#7B(X5g3wdgWk5<@x3?%Bnj62KY)gw^A?90@|IG@mja~l^L9jV{XK`ysigo zXT6RKaat`I{23WB^qh4o+c&LNnH23lS*y)ME@k5$h}1nQgVR~1v$z~;(|D&t!_W@G ztC<{wb_M4Nc0;?yIjqK&K@}gm3u_{S)~bH!JllW;hG(YL;nO&1mAYEuY&_>}{ffgU zj|(HgufxUJ;|L#j#l0*DsF;%KRDMKa*!*hII-nDyc3tV2%k!5JI@`)CJ#OXiiDx@^ z0>2({{Y0eQiDhy+G}fe5xERgos%J*T*xkDbcy#x)Av*qih$7f=?qDdMm5_rhig3pp zYwp|EeXQf)PTX-)EIv7at{iG{EQq$9u$8bv$D$hTVAd+E=A--OcQG~_^}g}0H&&xg zHpKZlY-;C~!Yr6IlOLxY(W)(9X@kmYjvzG2X%`{(isasb=CAUDUNtz``Zt>Z5+96 ztmUKL-^~5`In++C%^YWQS%|bK=+@q!PPU{t_`y+Y4nEJ2&yOP?^H!Ua^3v}1#(Rif zfwVJMQVp=PPS!zg8%s06WL;hnKBAL|3J)v@kx_;p&m=2Z)MEuL7~i1F=M`#m7m*?Imc7Ir?jA>OZrIpO0_ z8<{I(fUz-FhtKj8>zFG2J{I`?hK)(m!GXG%*VY(k1D;&9V1e&%B;`k3wHn~JHTZbO z!j9o%t&Mvs0~cT!Z|j49QL&7xm6y3NV^oW0joc%#wZxUl`}rV0VASJsS${v2|8*zT zN;_r@=GB$!2iC;W2Q02-492nExN98oF)W{2;y-;H*F>{^o5Ny! zdlJ5yJ&6xBB=rFH{(8ziRGVw5i_a-Z^;F|$jK$Q_Gsdwutdl&nW1XZE+u!VS_lI9x zKkG$a>f~fCzMX!~HkL8)`F8SHJ8-buIN1Eb@2;>{i}$%KmO67;EOpEn#QHkc#5#;t z$5>)8V>r8Nb}#gU3-+XY79#y;HpF6ZKe~#ys8x}Cm*eW!NaP@wt2u7J#JP7uek^%d z4f$+NiviB(fGv42n#{?_CFNm8RW#(mVft;g0*-PU8Vi=(qAaU9G`AF;k2e%gp(Of55G zYr$5-FgN(B>C6XAoQ@nmho9HR`97|R;o6^*YP7gGjP+ZcSZkxsTI`2La~vOS zc!HtMF7l~H?fhLwwk0>aynQ*jPk8L!s@W}{)%&t9TZ`R~UkU53hVf&Tk2Q}RcWA4Q zvpGK_oyBR4w3vm}9b2Vlc`7|z@%^wO`@^GFVpunsI4?;IIo(`&Wvjh!MXZe;7w@!M zFhp15A;!&Qc9uA;8Yda5VR$6i5nVHa49HAdToo&pjh(RF@jF0_Z(mYt@+Z}hWM7>8 zi_XbNR*foXTbzoPRxInZHP&idS~aD-X$O{V2kh0rN}P??2R-S$k*SING#SImrxIUiYx9>Spik?}j+r zva0W+&WpXA=}IU$;Em zlaHYt*rYrbLr#AtW>M;l%WL_l`!!-6x1WWrfqP*b*Z%D1f}b|K2Wz)F`7PG&jabZa zgSp_Nju}6T^6#L?Vfm=rnKc4$2kq7dJ&*8_~bu}#cn2%W4slx{yHs2l>2O9_D zxVG`s`{QLDKF-F2-{ykOfBR&0;1I`uGwkb@gILUVAjS^H#MQGf=M#C!haAu`Xk!kw z>L+c)z?#J6+sRK3##%1gFx%mCSs&vqFZ{FpXWIR`XeZ9jKGypB)2s3J7aQldwfKEOF8Zww zo+P`UgY^>c`>`g*_t9Q0){n94YVqVGrq(!%TOReeefu`9u|M>uT94v-VB@Vn$!;;9 z6rDZ8p1JQh+b3neweEwxh{Ll#alYlz_Ho%yQXNV5T6>N7IF2}55@!-N$zJ{ZNs8j% zPm`)}*C-Ixa=_0lz*Xvu)W3eaRb`Zog9jNE>;7u4cKu`yYg-yR@>KrYKbJ*o)+!yw z)km9hxHzk6bY;)1pRt+?9!B)l{7xwnRvc>=XZic;+S$syY9p3R#L&)8(NDXcY5Y_x z>T#Kf?0;q@nu8oJ&gCZ3`JCoZ&PJ_T95I;tq@Hv zhmUc`A09i98Mex^MB^2!I%1U9zK_soau zIvkVDuex>+m6aA88DcnVFWp{g*WGAkuwk(8%8ETQPW|{KmVI#^)ilDPG)5W8%NVVN zIeafrYEzu6PvbQQ5YUL>QKFp;>eplGur`O*p?H@8Yvpn~vs}ome#H^13|KK9n!{qH z9?W3$2X~@&){GTcTu#;b-(4~z{lGh2y_H<7!qpJxrx)4iCogTNjPD(h7X!Nh&SBJ! zPuO&&?Bs>b>bhgK!KZnFU?*UW8_FB!q0Lr69X_iQt8+Dv9y7*kc7FQ1wXDf?!lNDU zn_VkmJ;@w4Q=G0j)Z?>|Juc4LxVy@Djjpu0DBoUNE$2i;4uA?tM zI~P|CZN&7AURVp6$jo?ar%oSc;GLbCWueVR_0<_s4NXknXlo&=8k5CW>Wdd`xqK$B zEoSNJ%;@sARBNY@D^D z_9Sljh$RL#j%qfW4|u;$a$sf-+LTwV+HIG~Vy*6Wp)8E3#4rP9B9Pze4&&@NCo7M; ziy#v-!9(3~)z$&#aB*OQHI9`vD8^;ASgV7TSYOB5V#y7A{D|9QC6WlOUVYA1xn>vL zE-JYeb>;T!c4TW%ou67M`@jeudz=O2>&xNxgE+>zy4~62Y`|G2cpQ!%;w`7siK0bo zWQ;qidJe}`=4|AujK<1&RCC!FO?%%RAs(G22V*(IP90bbVs+&{tSqUiP2drC%fL zu=#dW9A~R$htG|qXorZ?Sf}r!J&rZb=Ev8zCKI#O7L}sX4t%^i!1EYY@m!{j>xHeD zapYOp_!PgQbike|JX@@7N%n!fi_d8*CF{c47Qc#=A^y38M`BU?v#3WDadEMI>tKaM zTLf*ySYN8A9r(C)z@D!>XKDNR)QZZgRmX~n`KT+emY21$CSrX%{In6nn2+sm21i`2NgPQzeLLf6XWlq_oQ?G|-p)RrzG`-xpSm9xm(yZ>Kl0IUb?{nj zoL*}jYsAbPmXCh&alN>+?WNVpOPilJu11UPPba_SjoUAAn62N&!N+>4>F|-m;;p?_ i9k~AXSWAu7I1tZz$pyUq_n@@r!cSNNhCtYt0C^IYfJq1mAz%ngKt11k?yc_WS!7Ah_x%6=U^Ly; zx2oFefUOPP_w3=NNnIo_@2M<)NOaZwPPfP-+wMi)~9a1<>=ub z@9q7*#PpA1Kz}%O_|7xRPh5}S`#>q=g0EllLockaCzQiD~j- zcBAw;$?~|&9{b#5)y`InhgvO;vcv5ya33Fy$s;+WtTZT%N&D)1{0^%kODV?W5oXbP zn8|FKl`!yoC7H?hO3ca>jVUK>%p#dh7V`;7(~5H{Gnq=J`Jo}Fb7*X6Y@n~Zvs^0Z z&a5+|_Y~}waHp?WEDdAGp|GlIYOy#pI9v;bssqC{oFP1$Yi z{fa?1NtaK8ZbacG{S-mr7X5-P`faPvXDu@57rrF@Bu+l->f|Hhfm_OXy%Mll5}=wv zG?%QaOQ@9-B$O^mw9i~;Q@jp!Pn@X^%ghpbC5ePAcWJ8q(Rznp-<(nWzG9PFf_Q&; z)v7dWQ9_qeQdQa@ZIK?Y$4pok3X`P*Gs%5SG0ifYwazg6vvZHxx9_bFf~!oDd`2=U z`0pH64_Hh(DJgblwkqb64rY@y)ux@0tk&Y3g{f*uosZXt#BHYYS9RaMdTQgwbb8~K zja#NCC&owD)P~a4^gvHnr4-L+oW!AeP6JnhMS}t2Q8lRQr9m)i4LmwLbd@~&@A;rB z=o#G_%@Fn2!|ZV?a?AZ9FF3goms6VE9PVa=7eGP&b!b@#bj2_H=hNuX)^OiNtb`nzItwMPLk$! z%y6)T1046d}v znM=!;=elhyG!%1sZ8o>V=kuC1JH{OEhS)e-6@xwANRe|X)htEnZqA8bkPBdbd8uP9%Kw^1b%eB+uZW(_Z^ z%nRkGe4UGKF2uhdI4#>;+dxN4uhX1KT})Wp$k&)?*Nh~;4eGVY?=6 z#rWT>q+MtQ>6(Uva(hdPpIuHme;ef%jS9maP@aMmACP9GdFj3Nu#n=4)RU1-@@9ze z35alWON1*}`HFmAk|D`Y+s(4cDw(WYmMf6umlWacx0%je*?s%!i47al=?(K6<{=x_ zt{E8~Ob?{{Lp@x8M?0m<2=J?-`;Dv0@1I`P1bp(6^83*%n~~j@x&^{}3c_2#Ojr%!ttqN@-ffXJhoYTcMTmP=72ZPluYtgBzu$50iXTwlxSI4| z`mp6{VAZbd+gC5n&g!}(&2FFFzHw%HlH%9F*8hNvvfj| z<>H*gSZNM^k?9aQ3Z16;LP3%WorO-^u6OEs$O7-k#C7#j_XrAx46y(ddW|a^#qgKr zy7gG4-CcT|*~Bb`@H6O+o(+~?r60*woD_-l6RpY@0LFb*{MtG>+3R1HM3bsl{Aa09VdHVmMrpd z$!szFp!4Lr_*UYt?OQ${_i2nzfgq{s_R3Bx5$R8S$-iXu4`WM8sGk2 zrdfXa&Kbq+4<}er4S@Elp4)%Y}p9 zh%b^43|OJ!{4kxX1270QVHW8Af#IP+T@UiVFwAssm)(8z-J^xxjnCe7{@z@9cA%#+ z6fUKE*c=%WxMK?r~|4Q zgoUwl2z~3BL$8!WCZ;I8$~-Qlq-3#BG^0l$ZvByY2rlA=As7jq1jm!?mIpRgMz0wj z=yIlWg%Lf{l}QY^9UF#iy$`+OE$J{ zsDnAnsamZ^hA*^&cE1FPYTY*G2_(C9e}P#{O4^=Ic|wY}cU^udIkyqr;$_nS%Vdf@ z4rb1n6jv^1X4fmV2Vb<5!~`%9Ki&*}bb=p?bsgfuU_KMW&<~IdVe@WRIOvMFBgFx; zC1mg%=QpgC+5p_NLBVMb_mSz{o!xut&woLxD-r6-_Yjk zz4(ym$ynHO)DqlW}qZv1OocYD!T%)=jb&N+4n{_$^?f@HI98u$<$L$Gz4{Md08uutDK49>?s<2ZZiGBV+QpeDtW6SZ7U0K~Cg$vG{y05LMgHTVjwzp!{Bw z!w`Rrc6Mq4e2)}qB3NOYq0;yUl7o^uaFv^c{0+FL-n(p%na_-7;1 ziTcq+@2rnmEy}EI(KEBdsjvWB!`M}f-2t!KazL_Jpd$c8900;r(&n>Sa?!FQ+1lVh zZ+Azf42eb_M$<`iUV)PqHnfL#8Tr`DF5{y4xk_mx?$bGDFC;zF_{AdOiGMp6wk=YO z`(#B<{U+rM)Y70_x8akG5F)wgk(D7L6`+w#Z;V`86@;@$R+Ghg9E4I2fMlSX$z(nN z*;z8rJDnpCW85bz%^3Y@ z!vmX@K2!I{fh5MD*UA5qCYhbXH3XlnlVEK@RYL{9M?39=?`2~q+c^gV7K62PvT1v` z7=VZalFbIXSS;29fYUf=GqL0WrgK;OgnjiwwVF;N5HMTaykUC%#M-gZksXZmU@8mt@qbWq=y@(muPwG+)WDPpyih705$dSZ0&2Z6 zrVT%AD~r_a!)003HZYe{HWYYW(um^fc_5WeNj>cbbOugUNR_~s(oBFht&+`dwH@~` zm&yN<%T}9q zDX}!L0*A9Mchv3yfRtV`|9vZD)qk~PaBYs+$1|z+sefWMxh1p(`C&rR-`dm#Ezdx- zIM-@%TeC&WD(oiN2R+B1!96v|zLuULPfa}gtklu2MOrP$Qxh$Yv*ntIuJ+gbe!x;(yw4evsqXnV(f!kWj;+!Tg1p|~b7 zgEvc-SRP&~c!MYj;tf~5WclI`JEfI!k7(r_{(A%;;pnhkjgMJXCchW|G@fKm{JFT> zc%O70@3TsN?yF$7xUsMMWntvwdGvxVOS0Qi&dIM0AQZYAw_}uD3%_BH^0hTeV?gZb zQNFfRe0!W*dALr#n)Jh^qhI(IT6}}saH7Q#>7SOhKnz*>h(c>$w77NQ%c4bV?RTKX z3lX|%wz#d?qP6zB7Pj%R@fNi9@fKS9qJOmZ#k0>Yd~@mBB^RFkCWY3%XmMOJ-rjun z!dKAZANkrBE$&$Qc8M+g_rkdJVo)b0!J`V8Nf*F;f}-d4^@4lUsc^* zk!0MeC41IxvF4&KztiQ94Ro=84my>KKiRb(@9IF*{#N;8FiAj%xW~kRRj8Y3trvnb~OH~#q(ch6_w_`1M7}@lan^$rL^v{_$$_31r)JM(K?(n zW10-uMfds@0khB|BLD;IA<_L_i{(G%cQ`Hb#S3e#8a=&?M^!lIZx)=7!7lY)x^R7r zuNl!IFTHQ!<&qWt&4(9Wj?@8qN*DS_eaQiJ=6#fY&-s?_ZCz)oEZ;REJfji15t0JG z597Y5)Kl+__eM?bLLKlqMy$7{0bB!pG3@}e!eK+WRjYn{!_R&QIQB72xFWk0 zZ^<^KSoA?>l_@SJTZw|r`+Sv z*8#*5Az_aEJ-8)b**!Hmua|aCl{@^Naz5V~@Rswoi9fmU;x|pNf8G5rdt}3|k-KiZ z@wUM=FF19>a|VePyf>T{*BG=A{awtn5iKa*C|VqWLDi1UnD{fkV4wkgQeB#_Z?-a7 z3c4M%9NO}0fCrn{z3^d8hv38ZaOlYlQ;ZuA{r%Z&f4zTVO)cA(?Jb4$&Vr3>ZV{Ai zrq)n2c8P^8w{Xx^slqn3r`Jr0m~5L#{gO*iO_^NGt=YsQvMpo!qUkae-Nqi|niurq zSO8FFa9NXXi}6`OSrMN#=ms=^2!~{(XHK_n#Px}8ZOJt}h<#OL%d`UlT~|)F#jxz@ zE2kRdD$(MN1~M=y?UdeHce|i9oe=M(EOL%05=gkf5ZWTKhGMdavYy78QIUGVL$bgL zkjY_D4}rmYc=m>N$ObdNR|BRzyyQOR+!fxquO6A2s#d3VPVJc6T%D}02VWNB`3?tM z1&M??U}Xvftdd-#UOmw#L>|qu;B58EslTn2L&JUlHdJ8uRnNwQ1|G0M+9Ngova$NpefYGH7 zu%5e$C)77#`pF474~1ez7!KaQSv4EIF{_BrFZPC+HRM`dqBG?8Z`??p|HeHVui3Vx zwxKpNF+My50J02mmqkWSE>Af*SW80CQqGOBtPF?W$j*5NlP$Hfg?8hzzU337;O&$4;w{MHhc;N$BV_T5JI@*#bGaTN zi(j-j&WvXZi{H?U4=E-@m%60kdNl+q-jDDX(obQ}0thAb2rH{+j+|buG<&7_WHQ;6 z?5q@vWpa8YBS1$nAM)e@j>4uf65nJaV1Xnmt})p|iF7IsbvezIKrtB&xb5!fYuc2j z{GFPo@aj9EIfcx(nbHXpc+STqpb)*p z^_yDle~tD;C0vKrSVpDRn=h{2!x0qH*@yYeVv`TT<2hCHP?}=bOZn#z(3K1E=SIrs!`(GaLt%Z zSg19z@B%a8J5pj&}ngHWfrx^%DX1Zqd}j^6b{Kh>Ihg~6DUQy zB9_tX{kr_;$F{u&vl@)#-7dRQkL`F5Y@|@6Pcz%ClWSgh>ZU>VuH?mUcHMQ`%|q|{ zeY8bYqPw8kGP;9*;|sr$*UF!f@}SsH=N^lLF7|+5HX|n%9>OdTP$Ct-WHK)CZx-X* zzJ21R93idXNxyHL}~Ap@kKz@0ITb6!p)Q z?NeLxn5ns=x!}$m*4HwUP@hhDSGq+>Wtj@jY1SjE!@H00BKDU z75*afwy8V#Nr6a!vm_QQY;i7F;dT`B<)SZ7(3gqR1BRS(!}neL%byRxUMj%l?kzZ3fTbatQ-x?1`gI0Gw8|zHn z-96uT%}I=n_mGeNR%7&aKDNauvS>l07cI_!2iuSuKFR?;%1Mgo59I)#W0d4fOUg-# zb_zqD#1grSOOiw|U`qF>T98bX2c99uN%Ch|rUxg&Wl6%eP0p>F_c6Bql7u>O)Lv!F zl0WvdeCTOuN0h^y)7)~p@HvMx0yVIwh!HOBmViqW60IDdydREc0vSOY00BUz3BY4* zvWk#&cFJPC8-U3DUiqVAHtpggB%02w^^j%8pUbg~JNZnVK}Pk`d9W-D@HbbaiTYX~ z*#x5^cf=%{Pip9gD(YQcIqE}ABxHugVQ2`yhuy$UK>k+B5UUp+NK|o~kEK!ux zvVG}9q;NrRrBfNOE6Fwkql5T;cw1Df=*6+i3_u9<0@ChxIUjS{z}A+h+sg5-rFE7cH8(k*sCC0d?minEnJ-cH<#YiwoL?lWBPOhF`5#B!7hmQIEvK#xVqe(Y z25r8?>3c7q^Jla73)Br1`4YFX#r1ZIe2H7x;`&Xk_P<7Zq64mTD_i7x@wyz;s%OdiWbd0({^f)^O>xW1Pmd1nJ_`t=b`A7*=2<0 zSsy&m*2x2HSb0V8Zh;5dNbIjld7!9EGE9FH@h6IH)CWtayWBpv6N#lyToW0MsLSck zxjQnOKwc>YE*H6+@=3+Gn)#&d97-c6TUoSNMm_MEdEs~L5vO4q*RnkT$>RB3>Sbf>Z+pZkA=0!QIBk~PwsXGG@oxyvDh}eAz9K=i4*K^ z=4^^;Zk(HZQQsdOW;Z+S7uS;kp)UMZCi&1y7Ew82CFmSB5$KL=69_#r6R9g;ZSWXc zRmx?7pew}PVoxL94fCR{Q&po=)Ia01{PGuDbCHaF5Ej3!maW8H!QC!qu}yAvyUpg{ zIz_Xu*$9kOwY%2KnjKL3dS+Vl z>c#unDW@H4fscc)g$E5;^Y_aniD*H{t!QzCeQDJeBx^*ATcy8Q#>3(nBvV9-v(jhV zp8_9ed@AS5IYRaGK|uP5J3wKBl)7IjVjh9$57%nz z(49J{&FSjjfG3HwW7c1f>qY;+qmVLiRY^(_AEAIF|+3$ zs_mXUu9;cmgN;8yM|gyW@_xfovK|X#zYzRP$bKXAhNuj3cPP?S<95E$0Ur0@UHAb4 zx-XY4J*BccE6X{zPA|UC19i%h?2quCm-W6f9C}snUC>O86PN|cu)LAa!fT9Km};j_ zs|C%1XmNzCU9|C*Dr8BknwlSa+LlZ@rx)ooI2K z8P9IUS&b3US`{shE$ts@>c_~Qg||nfj(W)g^B|x>{1ZSek{7u;;1)TO5cEPmPjd|; zyXH4=(JYKkO@ZTp`Oo?-KmY5r!)jq27R#?bRq=TmpTz?4%Kgfy#cFr^{1?AqL7*Ic z=kMjTrKzPj&DLe36D`Qb6fMpmn!I%UqQ$vZi`$mAfSr?s&K_qCcx;{0ruqz_&Kd-; zj=g@sJox_L<|aQxm7)0h=aByozZ|>hC@Y(C#L}JVj$)o7tcbc;z+ODk4D5+K4I~^x zc0mV{Ee=9}^(h;9h<<@hUOlmS^LTG8mC4VB?RNK`!S$nRWVSbz(iDFpU(V)i{*>mvcJTZ&^RTX+y4_n;04H z=_(hEE!TWQYYU0J)Rt>m_&--P2k&l=60Nccd*(88B!74@T(n{<_E#=Dfnuh%v2nRM zQ#!0V0Ml6OOJ{6LYsNl+8RNULX*c`-_cNBe^o%89;b6dt2+xl$?DMT1gs)lLwJJ8xU%`yE*3f<|`zj(a|F1-NvkTixI|Ji-iO|c?QxI+L9nDY$32vs6s^&rD~%DeXJ=>vm63I*FQ&DuGT|N ztgK$_NEWMcTs#9=kk9BL^@-N~re#~ym-l7$ZU79-?b!enl^1wJnPo+eC2%e2N3rP?#%gH?lO_GiElAHHPt?7}l(kfw~CgzT*$ zhIW)47Adf?3KYyB7-Iu=I8Go_Y(MgBcQJ=cosHM&NAv1G0v)D}?De)-8Ios3v`zIe zi(Q2%wn|Qy)k*LP*vDqGA42S_f6j-LT*o0VB5}Pu6PJYf))is2R@e;rwLENgRZp$& zSn)t3E(bm{qJx)w@ajDUhjm?h?Z}9(OVYJRuRU_``jI^&*KD1io?N$9uj#|Iog35@ zfjU3uwaW+U{+I0bHeV#_BmS23i7GItNa|P@GijoJlS?Pr=9Y*B$ z2s>X7^JEw}N49m)-q%5U?}YZIsu5JHU;;@onw_aDn$OUo}A@IEkJdCwlo!`X9W&*206 zYuD6vZ<(7~KR&iB7sq#nD*k^Ze*WR|3Vvl?&Skmslb6u%%ky)tfG1n}{c%IT%kr(| zmInzWqlp1<53<$zi>=mYdl!*`Z?sw;XUMH?wI)o3kOW!21D6RU8RsZTkEo*-fHmNR zTCXAtEDP*ZD+4kyQ=}VNV%S?xyVemT>KD6gvd3s;v1O4kdW81+Fa8{QFdal>kyT4;i{@#IDJ~LOfsV2|%u}YsUIM(q3dtq?hm|xH2y3}>WfXB=t*+2Iu z^ol1Q!fvOTbg-&#}?X_$T#ufcJM;+EAbBmciFqCTYNk0m&=KeL+qx zulLZ8{3PNz+zN?cXXXp+d3b&{Y(1ST@urF{bg}RYUoO-bnlC*YSZSSwCAA z!#}9@pWNF{5%36&c?WpJBgKhFP&h&I`@kO95QQR8?k9Z_^ z5aBx7hSU;pSR&X2hj2621J6l(V5Z}m>7JM~RjhBXguKb?e3_UnchiYiy)5umaLUD@ z)FwAO==|*FtqJstvZl|;|AtJNeu^L#(y4IJ?b4X+02fo*q}&~%iR~AcW-j4RtTgun1(CC}9qVo?`5M#Is!P1tsA*&J#8+JSFeq>vi%`HKL3L$)zNb|86_OR)(Trz>%BKcy0A`C(V8@)CJt*WPF z60?SoW%glh$C~O)xqp7}1@^A9{c^CB>FzQeEt344&V;hzO!36Qv*$Y>**;*^hDRgp z*0~!T;lc>jSLHqB>;IF+`iC%VU8nU=*RlSG7q606D_S36Q}|Wn^*?SP4x`ev^hn(U zQD#)~>!f;$&Deq{89~(|0FTMqc|chvvlWtq$L=f^?GPptqR+q&dZ}6_RyqU>A`++o zNOz)mUF){h?$}pPQ=N&a$@;oAwf^3YGODiE5v_Ud$J!P0YeJwpDJ<0$~f-p9tCA zJ{wyNY=LIuZFSFL{fQi}KOwMXh!`&yHr-3=j699GX$df&x8K6a2x>pH+$}_?FKD z53ns=2WmT_u(HhH18uX=oSD`#kr&~F<%I?t(e`OrzJ!|G{~`lRn3wi2d0E8^1lLq5 zP)a*n#xPOX!g7WRRah028C)!NVTYk-hgHq9!E83Zu>vc>aN~O|&4>U(eyEEena)3> zX8=Ed=!9w$H8(`b3@cl;C#!V=Zd{gvq1Wu*xqWW))cUofs6vYphKuDgTu^>jUoPWH zR@|N|tDJF}h1b!xVP>%$?W$!oo^Bxusdue`8EluXV>i|9ysqJTRG4g5)L4h5r>Q7r zc!pBbXxbp^s2TL5vy|C?7J%&(% zEl^ERo9sMXc2VMX@wp_&mlV0ZeBbKZRy?m+fsvkzK|7Ebbcx5VHd?|6@)QQxw|CF( zZCf_Z)Ypxz`M*~?@d{Y%=H<0HnwxYM%jm8wqWJXuCjZ@v?K%P_SYAi*>6ophkqHeT z-3v6JO(TD>b@evmDl`P_kEWjH8lv?K!U)7O&W= zifzz9GZ~$`l}#-Sjobzb$il;fCjQHe!(E*!aqDOMJuFnpK;L>IxvU4m~-&LBsu|InuHK5Me0cj!7~@& z!Wer2W}_kvNmJ4{>h2`6Hu7%SWQNk_W>*pmzYqC8Ce3U*iG6&S7uaSDVut)(a^H!3~gu__4&(-esO>BNG38l>U$Oc##*$ z2B#2KobJ#k*u=VhTf^}?ED2}0xOI2TA0L>R>r8i-3i(1|DA3m(2&eOXo2s=92gdty z6A^ErJWxJ;Xs^YEiY3L3yRJ9Iy$-vTJ!foUv^F_8+<);?eW`HNsmQ**NIVYC;WNTB zJiftK(^2Fzk(D5>{}Ld=8q_7;#ir{4(EXI2jjcrh8}NSsQ^qbQ?yvCA-GHV- zlim|Oxb>^NU#Lm5*smP#7jopqJ;pmo&xw1^ew*$=u?6YP zGU++-hT{?jLt|W6%WADLif8HQ)%$t>Zj)ZZ`|&$``;bi9P~3e=`Vg+j3%^5sn)`6K zRmw}F^;*h}Sz|`1A0eE`@VMeGNY_s8@nY>L;#shxbX2G5?&dCOt$kU^Y ztqJ7j2(8B%ySpdki-dZ+6H!a5+Y!iQ-A#R_7=j?krOaHe*Mn4ADctYzr?jxLq%YP`Z`&uPw4W03IrI0y1fEAvuHv#s~Q{ z{G#d*6!;eG0Yk>7GuI5IOEp;F%-UH5{7{K&CVR@Hmh~?bdP-tN{300LQ`-{u?wPcO zBXO{9GMi2f4l|xHW7Rc6 zU9uSK@M3@48d0da&X4gZncKCqSaPSLg_0)~wH2RpikZ5fbL{@})4NY^-I>~bdi%}< z`pe(X$NVc}%;3A$b;7p9^&@N=znggb4;TnzH=>jG)*XvEP2_Bof7?MLqf8_m^T4QX zBxNicb!bG8vQ>vBUN7;+@P>KrQd`BEWi9vBLp?p&Y|mKF=ukD=o$cZoOIKR7<`Sf0 zy-%N@boWY9%1@V*v?`eeJ-4v~T&og22`ilB^lqo?0Rt;E=(?DP^#3|tuehkqrO2wa zV}L8OidG}*BJ#H)k!W?Q8r*n~f%r`zul~E2sAE%I%oajDg|-4VJnz@2VuNt*lB_zx z%Q#u8l_hlL_tvkp0?x9R!U02OUbR}^QlH;AQ=O=;1DF5rO5j{-ii%g50<_v(T}9T< z)6U%i1GSrycCgJ$tKQToa|Uj5dty(k+>J*0wnojH{#9$FjMD#fd= zrhv{RSmnphBu8g8wz=Z8oK=~orIpABAt?&%t=5vQT;~d1#bs-&HF+PR_1SfcnvJ{< z(fT;w`5`p%X?ZPdu_9T)WNqM}G!fWstA|6Hd9fZ&G#V{N3*}-SHRD7*913t!mhFB~Hnpgwg&68nZ#6Q{;&m*Eua(*O6;uTt7zIzeUln zwJ3V~?BZ4O$ON75z{3@sVe+r+)v`@Wf}Z^n_If45h;Q|D>N$_BqS_&f+9=9wl(9{A zCT%2-!T>7C@)1a-G+!#EQlM8DPD3W(b~eVWf1P7f2SE3tGg@|G>bR&8v|X9KtINbEcX6O}!G_OOGph{#U` z#(ETV^#Y5TsZXL9rxc4qJG-!P-pycX!d(@dBT|P%1_IVAFHP(7;TYD0FOC|IUdfZ^ zWoWQ*(969BzGzE0r4jxqEmX}Ls!n((c5UBv4K|55{NWFIvx!_hko$}~Am3TO{v4Pyp6idt>JfkABUv(Hdlp8x2O5;J(p-I$AITBv6l&6-tb^GC7y|v{DI!$U0k;Bn zqZ9g1H-I2L}8MmCg5#!<^Q5YqYfMjpfi#)|F%e&rcY!C@Q-ve;GT-Ff}mftWuT zbij*E<^#jN47%&l*~RP6KK_!}*HvdwxdDFQPqfCwk^9CcLczvgCaKSkj;s{O*SZHj2x%93abz9lqG`Vt0Bb;`Ffm4|1f?Pb-e4i zULrp(LX`yo)wF~fJ-DrkOi3yhJB%E%CSb#>$TUL|*u^Rm%9=%F4o|r&qa_qhIy|~- z$MhPT)>X@QdLjq1@qJrtu}CBwNvA?Z|E}J#+C)BJ4O`=}usa@@%ZwBzH`8b+!=%nf ziG{#*24LORbs8mI$0&SBoK$qCI`V7y(yZ zYV=Hx&y25{Vm3IwIz_%WQW)K6sj_96X8Yx6_>xp2I>2+M5eqty=WgfoT0(8<&&i*Z z>Jn;npmFISsLG|lr&2q z5D9>5XasZee}ZeG=&UB^rH`Zfx~PBsO`bzXqa5I)Tr0h@jw;MHGt4R*`Sdi@UXVfL zY?2#c#f+;++g8;I^fv(N6{(v@!$JbHhAb>`+vV@rR}X+3Yo)P~VUQz?r8y9CAQunY z;yHMvKkf3o1l7L7X``;TF#QSNGD40Ca;-@IJnotrT|rusNq($F&KE>gj-oE$FEBw+ zdoR%NFvVh^_9Z%{PE;G>p^tVE8_f2gt+wvR7 z*d{22#-CP;e)byrRP@j+^Y?Pu38l$p=XNeT#dV-$Ok6+0P~p7Q9)1eH4nJkBxVnw^ zzS;WZlGbFM(^F*m?9}2j$Tk=Nzuv=Z1_de7L3x-+j%^kV0y(a< zXpkUC%U5CVDRqGuV=dyCqoJsuoD|u;&e_=G2`nR%1-P+rQ;d;6$|;p!MyYK$TY)?i zalL))k8;mMT)%-v*?JC*UR>v+Z(V-w=a8eT8MGcjm*`?ls&_EN0KxOxX3PFyt3 z=b*E0?vl!K*$ud!f!o=b5Hu~|c6o?s_&7u|%bT?t*Fd!GVP#9(zmnSU-69Jv5=xV(EWk_t21ek)#8qCg%k==JJ}uXEy~~9QA|NNSQSYa+RFZcZXCagnO2MVtFdVmV}&f86f(t?hZ8?VUO8llxO+V^>2$t-!}OGwmdXY*@wdCn&%WXC;KA|2Wyd2uM<${Tcf@ZuDJt`q0R<7f!4~=mVdsh~JsRse{ku`c= z{0P-VCENGy`>T#3>^fcx3!PVyuc(smQiA)UY4n+w3~G(52IX2^93%T1YccKFrznY_ zBWiYrT|R$UD+MDq-?Uw}b?IqGKvDhHjBIremFzy4@jhFW{Zy5=HTIHuI(^fFZ@&IE zCiib)BUO}bdfSHAh3@bFgkAl5-&tSpE7v?k{O2Zm@YT>~tcEvn?iSZcZiwqg*lXIZ zliU#3Zj0;4Ve&Di#v4Y$&bRD*6jw0!5=tRt|0->9=Tb zxSquP&kU~H+%b&8KtK5{I#(rkO zdGkN-zs2jhrTPzagvBrFo3O7!^oh>^lBT%io*;@E*J%dC^&@Pg?K;f>U5DhR6D(RI zYqmbg_&gdTjajPXVWq@@hY1Eb@9kv~a6gzF&YU{s?`ZMX>dWlWTOv;gS}xwfy7zCd;zZ z|7<IeZRwli3^ed70Dh4>VqDv&7?Ja4PQur_(xvPD7mY#PzSB&vYH$L6-PhTtzm5 zarHLt{}$l?UWZj32j9W}4Wo=G_kZEfp)f0o!$Lh_uLhoy z%io-hBd3g?3{_gVi+usn;W25dUhhWo@)$bdz}kbJ#|{QmWv6^FoS=?mWipkeqhJ$$ z#v{6CG9^s&eiT#l21^BthQgi193&xID~`68lxkFjm#((VdG4tQdp?*A;G3qg`=-11 zt{WM&TfD{i!1_sj=vBc+8s&2;)0IXmv#N)X^g%n*6T4tyXZKtqECs%J*FCdE_hf!WDJ#9M# zj6wkQ2Ksu?wF(G={~^!OsbQ}TO3NI6&tyVpyIVIrENq<^#37YwuRzph&Ng z>!4W|av~>C^U6~J)q06)QC}O?@`7rvcB&n6*m14_$cB)OqAb!aN3E97ZDq@P$+arw zR0xj2|BWQ%o3<228K2udvr*()$hjt zxeWM|HJy=((g)o!eaqdS7O7eClhH^tWOtP7>v&S>B2^(BX5NwTy98N%MgkZ63UMV- zcnv7ri!+(uQTKM0Wo8`!+cB^uWI>ZHA%K|`r*l}X@i~nMDj&cmU0Dthk4li{Ew)4( zLf@?HGpYe7@GzDX7IQy;1nerOs zx%gv+?hTNeOQ|{3Q<&O}&0UQjxWJ!xV{e-LYArvy$&jQ?_T+?&XR_?#HaR<7ARgru zWVeHYI#9q`eb9qU&Gf37#2SG-73`-}c`h+ZD+Wr)CZ~|(TFW>vpZZpUF(`7Y31)hW@7HyX&^Q_ zc`@jlW??c5!m7r+!*I}mB4`@rLDRNRkOawZ1el1UvbgMopvVKrU*ytm zFNz7~nT|mi1S5Ly4)Alm#mn*!eV&WkO%D0>T50X(7W0DII zcS0FZCB#$`t_I3;pcJA|Dk%gB5G^n(M=`71dYUBd&XJ)RA^}V$vA1JoL%2!xKpc5+ zz`n_*!r6SqeBNTk5#!u)91vA}M8!m&Jp~4Z^*toiKhUvbV`~O8nQXGR&!%Sf_pb?W z(4z@deYfSZ=_Jea&rXflMzfKSGvv|qfx*Ui?Y>dXeA;A+cI4w2rOvXf7o&8-7ll`V z=|NaQVWi6W2qxuu7tnQA)D=N;lT&gOR4bLP6WwdeZX(V^f1Wpz+C14)OKh0d^+YD0 zPi0xQaQ%*(PZsv?c=ofVrsj8yO>Nyi3cfR=vi&b(75v#e*XQ68?B0pG7o56GsMQX&K|71!SAisu7qi zSgYEl*&u0E?E@qGwjA2|g7=iN-2=`Po%5M0SiiRC;4SAiZr)YzYy29El=p|KjMDiD zd<|nWn5v-U6ZXVQs#$?ihgm*=z6baz6EYp%7ercl%;(KzVtQPUguGE-G#|hw#jrTb z00jUj`;vFd&v9k+Q+z05d3QP7N8deG=-v42UFTn%tyFUTJ(ZzwDcws4+P`6bhgq4} ze&_A%&7-3uo!@Rex@|}QfV=TC$Qq(u27Pr&dObsQ0@lp!vnItv*K|FnG`qrS#H9+T zf}A_Y!Bz4&^Q12e>*N)<=hPCOskl}js*Hs7oCNCEg0Hp;s2V3!NY2-?CI zLIa3E;v_*OF=6p~5I?YcmtWuamwM5cGr?Nq$3D=>CgP|&VGyC0k61i0Z(C1mV;1** zqr1dGo`oaqBfK(eN*bvTS)fTJWf$$RAx|wZXVq{4r^I63AabIBE~BYvDjq{1DdO{c zhjbel2qDKIV9q|S5RB6oi>0ip)x0`3ALxE>G81>1*qbfx zZ_Hy{0ico>FMPvoxn}eD;eVI&jo<%QA81M0h;%ZqjF>J-UH)BpSZbc-d#Uq)sSYmg z0QHxhMhqJ23k`Wa&X$~^d}{a|QkN=2kq|xxHE2fV5uPg=z-cEaU}p~UO4&2gG;sGG zte1R`9g;RwB;W-xc>puytPX?$GvP2=lCWM70>AQwM34<74u|ObalUs5GOu1(= zFuw2~O6*(u6JfuL4OugRY^Np7oFQ3x;-1Fm!5L!I-!2!vt*Ta4`FaklbIsaMI4rd4 zsIR;}H9N@1dzkH8HW~?Ww%af(VQF98M%7QiPAKjywt0oYN`@>Ul|_L?A@b|-wqJ0G zI8D@`fs?h0{nc~o*n76^qE}j zj;EO9u!=K~^*!Gpb`?EY-6zWsU6o3Xz70cME~Vq?m+jteho{46r)u_=#!^~5Q)G0Q&a{Q8$|MAv4O zd0Bdx(=~;c&w;MohI50a=nK!q2OG-LjWo}oE?0YcJ_k^qEG3oDc+ov7B4tG2U^@MN zu%o_?X{GFp4u2<$|5(zs=Y}6+b^Y`XH=D*^&IdH&F6i9X0V6fNYMOA-ld|Yta1^EVg5vfvo57wIl?}?DK zG}Ics$$SuzXK1!Oy#ms@xz(kqz!pc9?ZOVLJK&_=iT_)(eT}=8zDK<7*+DngD;SqN zf%gF`t>;m?N862UHbg~^1}z<#?j`(g#n{@1_&-WxsO|L_=7tTcy}mhGQ1t}f9+ozU za7=^>)0=NGCXz@?z9Inw^)P-izj);@`|4IdWUC;22q%=a6Q1m1qWyc6a|Y#Y!E0C0 zez)CxAE+;E^Zn?L6Fus!cLf1)QvLyzXh7j}vVbY+vS|SWSPZ*DFv&3=+?wN-#0p~^ zFXndm`9CXVyQ;3F{AU!WdUA;wj&~#Lh5ZHI?FM%PeGC&;z33C*M`7Hx`ve}3C+dli zPvGG`0gl)q!M4&Nc=24SBIcFP3_0veJ7LJV|3n{h>^UT(*z?#e_zP%e;rH@h zT#uvX(C39`jCw;Rro(-vJ*AXJXk4I*JaoaxBFy4$Y>4Jg#G-jh@{i2cHbkw98fr@$ z0yt>46Ed@PPaP*HuiBh@OTqx6bM&xc2$|$?ej$<1aX8E&E5XrVpX2Cfp882UVhzMz*u=*#X%puqy{HF#i~SU87pkH-RPB+u zK}@SjY;02Xn})KkfsVdmR@0`V&ElX;k{7lE z%hA>~q(f^wdW2)TvfOb;ZYOw6m`TD#;GbXh5-;1XSB`6k&{UFGwMZXj6?$`5P}qxnp9{tq$bS`T=C_N zArqPpT-uJP%^Qo|USL#`2}z{0&>^w~9Y9PR3Pk5J!2}P{aQTEHfplmx!Lqa0+3@Cq zyhSZ$wPI$gT-iE4xkWGSm@MLSlTtog@q0=++nQIssPPRfHL(W2c=i?R*1!I~){*Q( zYhH9S9my`E8bE_>!K@|VUm)wB$14%*!^B~2!MmgLBU>;GDM8q?I0UzpEJ9T1BP9NX zd&^Y-%^PvDm-v`+5K6wq)YoZE&-9L7cik}*yDVwZM2A+C9pRy`1-)6E`&jyJrrQ%Z zK6B!r!*p>so%9?i7d``+o{?6T$7?fNIG4eH_-pjHQ@XWo&jD=m;=DrmVAZz~pXk5aoxw6Sk2-cO=0Xqx(ndHcE7;dKaWl8Bw;D92DKyRs? z14`(kst+v@hr*E}h(=&VExe4q+8K%hz8Eou{2c$Nyh_`7xahmT}#>hM} z>?Q7s83s|irPTDufZFp@xJs1k8S`2om1*^(I00;5@;MDbg&D^a%w+>?4-x*^M(HkOaTg! zS9}%}DiF8gOx%PWfRGtR8yRd(;E5M=}03u#0I;uxn<8)0bCUq)O8 zzXp-q!U|CG_^%^@NuAro-DZ4Bm*fu_ZZb<+m78cJ_x!8+>z%Xn{Zd)c$bb!)uU=62JxGkoOG#sCiNI@ASgo}{1 zrlArLJ|YW8)p&g7ce|kC#^yFT2VXTRC;H2iV>Z^kp-`!rp4YGCO7hb(hy8Ic{ONV}nn;Ua5h z1wh$BVa)+$$HAgfSP%Mqehc(*fu@;5>gXv~%YH1Gus>T>ipUmWzwxI6O5<%xAm#T) zEsrRPi1Y1@FMfYZ%xaCzV^QzjFn-wL{y3s`$6*g%U=z3O+zEG#V+0&g4HGuw^_XE7 zfRus}Nm61l!=lR))WyTx3SY*;FZS~Z^|HHRwtNWxH~x^<_M^t$u9lPuu}7))#Kql) zS18camqV{9@;UZOj(P#BV0UxO6xU&!-heskYJ<3nuz{f_NANa^#%ny8QJnXc~pTKJs zsRE1B-$JoY)*W^@oB-7S4{`4SCP#Ip4cD#eoV%)X&S83TPtXKudS)bzG^3nHIR})G zM3MlZKom#_V=|a%V~h;~jKhMx*d&Kto3&Ytz4m$y_JY%{v5hTk)bqdRR`+N|5*UA< zzvtJZnyRj@u6ysf=bn4=abU?zSG`|?(A=`aWDArIL-xeacnVoj3{kQ4=$LOoGj*E7 zpgIs`5pv6)7%n+Io>(*-@&r9WR{&m*0Qd(e!;qgM3uTzo<^A)vwN+(UsP3iq((HZv z(%Mfx#EObTHcJhL2kt6=-Qj{V>~hBTA7ZCYB3)qlR9V72RBP6W!ujjTN?E2(7spn z2i%@WrU4!-dbls-X=^$mOHy=iuHa;@_NJ-*l-j`-^=C8oNWj#5$@y#7Uf8enH`pEK zf~{dzUsv<_S06t#dC`t(^Ad|T&z>Knc_E9?BKTOjU=hgCUPbD2GfeKp>Q+slpjKo{ z^QiuLr1=2Jip9L{ST2^$q#_}A)Elj9HmLGbQSC9z7O?4X;wnRj3eFHI$K4(-%In?5 zI*Wb9)J2i3U9p7fhZpZ%9*WkuV*c!++GK69j{V$VXq=pD^@~WvnQI&RH_!0B6(7eH8Juo z?UStfh&-lWA(SChR*m)!*cAr#dk|wqO-*4^sY{Q%|7?&HFk@_uo-=HXKA#}?!oG08 zPn1wroT{FM+ZxdgRnel7#U!^h!q(QPMExZ2INRPK{*FS;cKJ%_*vw=PoFUxWAhlohqiJT84>~ADEMO+dlz|d zQTN(o20hPfMID;}?*?9ecdSX#GtQ(qS?C9gT$iLjqb9|(EQ;!m2}QHYAdT`z6?-BW zLr#ucD_nKK!hE()N7$H$LDA<;>w|I~>~Ftzym?u?Ld|zi4rJ0|7%2r3x~! zd^BY62EC%*bj>E0E*-v3(&{zZ>x1DhL%sBJ*R_cCG+Y(VAyZ(}wI;oEw3zuJzIZEB zJWAXxRWPUn^lHeK=mVRO`aoME7uv?^ci`NIsODmp1WsP=vg+*!>{pG6v>9_4a79(c z3t;tRz24mxh}F%?xfUfS*5+k@F;gmq1DW)K>87~f7_>UwnTC1p+GJB-5-IgUuCCS; zLR!0q?~S-YeMWW{U!#{YSek%=YQzmN zu5y1hgFiQ|UC8nCfn8~my^xPxjDTN&pE@+6pnap3LU_ELwiH5V2AoQ!2&QBytfC0t zvEklv8k4GqX%-9y4Do~?G8g`bYi)U-U$%)2&SW^F4=}4sl#Uc@euOz^|BXK{7LO4| z9BqQ!Qsjyz#8jo)F6ltXW09i ztIJ$9n!{oxrqeP)z=Mg;>2j$B#%OD;rcP^{^}rKmtZd2w$4=b)%u)_J{P`@}E(oa6 zobV$2ToSSlaE9E<3SSj*Kk*G72!fp87W~P4f}40q?G4gjHI#8~mJG+F{753$Ad^Kp zK)0UyRMZ)#%`(~~liY`l1~c@jsMZ=c)kyk8jXvstPTP@V0N4BvmamjuTko@3f{NcdiSD3GAekPH}_^T~1M$6+YogP@!`A&&eKfuyi z)JF^7$6j=Z_M@L6;iNhRpXQnmv{Q|37nzykd9@;i$m>2ZZjoz2yQqm!^3h1EXu)?R zn7bX^!pa@jRR1JC){A$DNTLFBp>Y{h)a8O3a!J@10 zW$ze7gJxWK#_%j2d(C@5SvuLL`FgmN!NQCcn?PLp8}NMx2MaC>Yg!MnC7+1Lz;h$j zEta)H{3O|T$w{!-w}8?r~Y+r?qrd->e!< z`2f4ZIJ~+vt451iv;(LVk0Y{Hi~=4s_|t>W0Rg^m4)hiG&aj(eWmoK`5FKbysU>;T z-HgIh)&BF@{GWWLuM_haOe8|UBm95HIC18uF`17QlBPGRxJxY;!9^TF%j4~)>JqN1 z$^MqzbU<5vr-HIYB|LpPUm}QpqReTWH=uSvmMG%uwB1x)3{|^nk@Nwl*Wsu_K$VJ! zFvPJC6Bl41(xJ;H$`_1pM{SM>R%Kjb3GJO>H|3tpXIg|mg5C6#w%kR{1E?23$Zk1% znBzw~vVqa+_npITii!LHyXp9EU^h*W-PA!k0Dy<&=PFo8KLN@Kx%IBi708?YbM!23 zw2lKx)S|z}1&1DyQ^NV^5m`=wW0;Yu&6G&tnKn~+#&8c2Zu=PTz(_2+w`h!HTjtE# zv}DaaHA+03%d=Nxo92a%nHwjU>N*oK6MF))z@s79ooJP8rm)xIj_N^)86uehvoXel zQni+nQ%=QNN+U)Dw#uid?vuRrecPGN@Mz1N*=y%*yC+ZW*KmsU!h~7trih~*pj{LV zy@B=<>rqW9z0~$?$&zKlnI2=UtZuKBUSpb^N$j!dinNo^yH9Vo0ATC92^;v9%a&wmAYt?Ay%(by z7(xUkHs8q=n4)L2j*93xX=%U#U_TjSsRX-!wxtq!!&KZg#!^|?<3^{oRo&;frBa<; zY;{Ks(OfId@VcY;#4bngLirkwTrb>Lo$LSkPpr1F@Fu>WawCX5M+C#J_y-olXKwxb zU@Il4@^~vHtbYk5nK^C!s|dY%@Luqk*8?X!?&N7JW%BB&>82^Q^{pmb-W^B>#0#-= zUL)1ixN9ATNl9znB|Elmk3~GTfYIWb+;0dbmQ1#r!Y*eN2m%}BA6Nu5H$gT^H~4J| zLgThnP+_(Kn+5mVJB!y&2yxiusy0e8cz_JIwX06y)KkuA^S%-Rn>Wc|YjG9w()HM8 z_eo8ex|FfK&@@n=oYH2Ex?BOHWAYNXf3KP7_PPAt)CD^??x`nU7J3}vkobA@?{&gn z%AE_#KL!3Vd+UJv82lYHR2`HZ9MyCF6W2_QW-}W z&hl$legjL2FSFO*;AuGf7VVflKeBM=-1*S8ib4SV|C9>lx>VJYnUJ^$icfHs1HqE| z0ctamJUl3bEC}j`iAEtKSd}VT8|2mEd?=J?=lGV7oDvVgn1i?gB6o=>$X$lWT{79h zV=c2#?UFJL7P6`}vm!Dh*b;#Os$Qzt8Vnht;Z*YzYmB;h)=&t#08xKf}b-dG*-nAOo8 z$=554MF&bxMO{wW)NtOque8@xvU-bWt(8!z&IC@u^7i&Kx@un0Uf8SQ7xcZQg0OFP&Rs{But=stKtp#jfonMJ{|Mcr1a3tC>G{b zc3rA5nb{|=*x~XY|F@+fR98RR6#pLN@&Af99hIQFIbeHMuhD3}Ydvr+d*~>33d)zT z600vF!2XFGSYz#<#4{sHfHVV>5)s03AzSen<$}izPaA! za%q>3O`q_E-kUt0oBGz*WUXxuPkA@#h=_0B2R%lPA`GmsfW}|}h5sjXWaqGgdPc3F zezJmA8Qv^RGwSAFRb^mJ6Xha3GbMQ-F^IKmn#!55pO(V4S76P$>~l7@=b;m zc;NwQ{f5Y>I^&;1^JeG_)}H<@i*nv9)o-#6`ix!ZZzEag{jh$fW3YZU!un~oU>71L zm7!8;#RLjPK3VTJfjDVMPN>*S$b6XNLCT0k^Kuc5bO#k27)yTDl~^%?Ldl?K*^D7z zfi2u`2>3LLGp(v-(zr~Rp`GzSw{K4~O;02AFVc~^f@XzQVw*x(4BP3qfJVWxiY@U28^KqMJA+6dxz1YD?6VobXX@!$QW;BflZRmWZ(|W&lk6l;CX_4*>j0fm9uoT;zZZS=`0N)wXi)dD<(~b253t7sUO*@lv#oP@m zHy6rrR*iLFL0q0u>!%7uwidEb+>a?8>?7$nPLu1yJy_44(Xr*2&~+6tIGdDcem9DG zRT@SwNP{!Pc@16zkZS3k!~UseB&gay$JYQ%rg$2HQTr$M3V<1FtilMw`iZW<2fO&6 z=E;yL_7-s~*k>>3lY?5>HGlV8}ZI z-k-2n?I$T@h}Y&U)~2b&DYc27=p?VfxTK-yDc|0lWB`|c^oc(B#n6|JIagfB;?|AS&<>4p3{n)NdFBhaf;O-XldN75U4T)1b^72jla^buuw$Vn5p853 z9Mv2$r-Q4w@ljo$DsDlEvTjbHTd!9dz4_);s=+ngok%5eHL|ZcJ#n!A!8>-WSM4FL z_PGP??xxWEhWcc}FT*6#Gq7VC`uqRCEd(4pc)?34UJ~--Xc*gY(Kg=1kUYem_vw#@O+p##B$miB0feKvF8kP2(1VB7_tHO z7f?LtwVjw_PC&vuFBDAAg{*4ZCEm*8Ra7H0@din5V*m@gU$WVp3GFUsQ`#a{%2egE zhD58cp8eDYHElTw1B~wezI%PX`}&Sqcm_|hgj0~Di)(E|q_V~TJ57^jP%POi(AuKnW5wjaF>GxmpVQKk$pxn|ut>1Ns4*IT zY^pk~ZXH=+zy*+F5#U98YOoX@{~hkq18RaD3IaDN38XAbILXymlTBo4)ttjb=Yn32 z=5?CZqAPZvP63BLI}=KHU{I%=&Qvy|%E;TmU4cWLW0@fN6fuY7y_$()s$iSf96^+I^i5SDy58`$h9&}PV~Gde ziz`5qRIigN4_2+^joiY-(8wuLPgGJNS95uekzZX!HiSN0uIiAZYFAhjb>bS<1f$pU zr^fb$Xy>0mB}oId`@`JbKU}c{uf9#DO-GS;OQ)Ii)^y+ z*rEzjANF!e`}a{_{*m8{S_z0W$mfwvur1$;+(`2gMgxoaF42wwZ+GM2a zS4095;(EL-b6s8t#DvtJ;T z<`MnCioI#MpM|No3Tv@i0Waog-qDtyO!zF(^M$p=HdznUs5 zs`_k3St3N@PcZXvN@BN*&%x?q77S0DkSA1ZEO1A0IAgXKrR1lyF(qg}UOuqwU)O8I zqhXKr)XW)hbgI0IB8o+ZHUXs+{v3xFYevvLO$(}uW^Y1LFYj_#wd~=_NwyaN^)O_ztHdRMxlbSs24(`x z^d@qeAFU^4u?T|2XYtAoJZ4H&a#dHQuu4Xg3JKaeYw@a8^XF}7tIIXF*E(}a)I` zUPXKAJ&`qVc!D?P?Zd056pzCTfmlhj2*#HjM|nOM^v6K3Y-`Atpp>gV_N_DxG(6CX6|%;nFSk!vE9o>Dh;X~Ptk-J7!b z9sN@#Zkx3THSL-bXuL3TH`@o8Dmr%u6eOA#Se83zy%7Gs`xM8BY!jZ4t0 zOvaU=q9PSguISu4^~3WKZw(#nZ&nlt|5-PE%oaaj$< zed|MRUtEf!$-lYg10e z=aE7=?EF?+5kcve>`KSsK%M{7pNiVdxM00aG2{ZV3m47pwz5ntY?jz<+UJhk zO;j$5h^%YGuL>R^K{`-7#8#^O5J4QV1kc(kj{{heRwQ%U&%QyJ;YIFsZ^9c#xd)Hn z21{%(s5}neov0j-n!-=Q%1~7{3B6l~7^RL`Ul|j$>y5-aQrw-}%Y$15ojeMHj0(jbpIuKjSUDyTjN_;24 z%MLsI3VIIVW_ZTtY^$VupCpoJN^4vv>h~nA1H<{jJ3MUj#(gqs@^1LWw@aGoFP5La zk9>DxfXKDt*Fo7bLJP%4AZXJ}B_$|$O9ewc_mJj12EdTb27}p_Y%!P#rfWfsDs}4t z1X`pSECnL=YH}m52*U1#%NflghY9Ip_9)~LyJ)upM_mep5WR=#>jGjCP%!UcT;=mA(Ec0_$D^j2GgO&fKgjNEjeXEqCS_`KcNkj-?7-j)=*bNd&C!V z$qu(gj=S26iQblM-r%+5Y5d^#=b%4Dk~}idH5DTuYgSd+greNYw}v=E^pBKIOjR`@ z5C%T)o?MEnnm9!Rx!^cSvxOPTLdL^q0B8(Z<`AQ&^{h6vW>&V{YDFc^?%HBBptOnz z{0tydNTRFGVU&l86T1R|*P0^()9q%X+u}0>;t@|6(Jeu}U$Tc~IS_aHWK^SR%7@xK zz{4~wRogI*0KE9ul*}RQbEIPDDP*W_nHN&)IC4#b9g@UQnm7^2xezEy)LdJk=9RC9 zOA1HPXpo0YB4Sgfs0vTEl?XdV#0OPH1L%#DsN1U3|BvHQn_ga8m2 zK48^pra^v`yFON#Ew%pk@prRz%=`03wF{XCNZ`^WTGsn5S(R$49|L!ZH=q=fuRZUw;55 z%KwL$$buh?ir5Q*8}mK{6ZYB3wKowY5|piBfY7;wwcL}$IjBo7uRfgpY$ z9y-EKqKIDEaGE0Kfrsb+y?BU`oP#2c;vv317ar2I{0%((z2mc1oxF@FqRZM1ida(< z)x-vDgoh5FP3gKhe-=q(BM)GAnu0Nyi6SC1Z$%AW&(+{4b^uC6a+-v?zq(A8(bni? z@Trel*c^k)8nKi=r;|+%t9YMcvz=OICkYxmo^%ZFOhCpIgd}^PU5vBD-VxQhPxSq# z&hh;p#(e*2{{5dSzu(J${|8j@0Fw>h&v)5N;t6!jBgA0CX%j9f1svFY1TS{gbl3ys zVrwIu?lgl1CJhXo$YFbmVhbbZyZxx=0R4~zAxJs|lFvE846K=@)H$CZ#({WyA|e8t zJzO%kG}qS#{H}x++@b;}9b^k8?kVd51?S?2UZ3W-kx($}rA>^-IO;Rtu;AlF&%X>; zwxGu)8jJ>0qxBY()qXD)Z`dK}4l%1`Q1b85N!S&k4Z3cY-uBIMHO#m2crH7k-)3rkT2fhkKrwO;T7R4Yzt=a z1Kv`_xyoBO2Q-w(#j~k=;+1SVR+mr33&b5~M*bq)!k$61ZdK>NYsVpAAH2va(mXUs zGt3yY*=>fJh4+qh4wWRdBz%ddJKBS+ndm4|XVQsHuXMQl#Oa=AM(#jnvh#q0=~4nh zg}PqO27_I&JAm3a< zG?lS#P{C4-Ofa#z0IVp~jJzk@1?k2J-+Ht@ioE2NHd=qkWHPx-N}AA`^wrIkLfli3}#YfF1vD_iswLiu%6P>;|wN*FLCENr1x(RK;GYL>tR|>Cq zCs8gLUQfd%+ie8Yq?UlnXPnQK9{NEP64NE?RdD91K^t0TM}PqY&Lgs2Q?5hP)LKZ` z%C2UA##(NGPo5q;?4|^ST}ue@S!VII>M%sq^O?vzu+Ew>3gix`gLFirAU9NLKlveY zx(#f^Fjmv!PdZlx$&B%;iQ-<;?b}$F4+0_Q%8cp zS-^GHP&O4ZU=&O=B`pqk1k3hFI54+9gCVkOqd{LRgavcz>4C{za~iWYchD4}Ff&oa zKr_iuO>IkJrXQ%~2lS)jfbdI6hF&8q$R)eiAPNH*gm6J!n#eBEBibR?bOl z&!C1ARm^D7BKo~T6i-v#Io?3RUnP$;BGbrkkfDtBG^Iq=`|3WHRCg|r9LksZYsnn1 z`I%&n6~woYR`---0<7_{ZRBRQZRAISUWh%RTR*wv#!aSX5k=&Pz-A`mG!swggvlN_ zdt!0NZCW#%rL~lw>I)S}MG4O4JXn?AMlMotOL_d9vP0nSm4IzdAZDpUm=N$w1`4yM zDO5#uT=7Iw6$zdMbV4|lEg*#@&tT!!zmlhNoDV_T}bgLy(`yC`L|;kv$>`Z^1^zOo=sxwHmI-J&H&xLmct6l*RXM1dIjHkC ztRc1UvVFQn7eJ`0P9rD68i#dyWiYbSVK(R%3>*mgCEcKFLa9*g+XQbq>(n^xitqH8 zoQ|;B>`X?pQ%iyFPV{cyNC(?1wIcR0TteXt(qkiv0_25~|6wCSObjnIrKYx~eJANu z^Um$l`J-Qx%+{Mfr!iUIltLDxCKWQhe`hAD$9s+N12RZ$mG|PMpfGTj5~}Y-?#%?L z>^-3R#Y%2|ZuUwVN8d>eJQOlXoAJu`gLpsQ(mT@4>{1eYC-B4xiv$4~_o4FQ#dgtz zOHeYLK^RpzK_f?b7f3Pp>YV=mxmK5=YaPgRgmsGY!liHDf9vZPdcxCwaP!tL9g0UN z_S8MnExd_V6l!IZcOTb^BFHsrE2{b)e=&PR=5)yhm#%qmpjEFZ*12fT_Ch4m_ltXv zz1bV~?0)@@+usIK!(~?Zv-kxz5v#`cK`TbCtQMWtEZ(OzpIXfl!I}_$n->1e4u7=Y zrlHTA2_wssV}2{V^EZFXH){O$8LjzQ{!4ICXqEp`6bVz*ESpzA5tYYUH zVYS8qr~s9HqZ$=Jr7Q)OXNfabXvf4}Lpeb46~8O%l21P0 zIM2F!_q4v=sb(8e`m}Tyjh(H`;&v7^Q9)tIN2`UcF8yOox9qZFuVa=9h-7Bji*j^&Hc zpJh&qVq}i3+wG3?w>!Laf9{|;(KSn^`}VaP?GAJl^GX^3ev^#cgb@2V}7)uJo-$yB%qRWZ0mb7|l5Ri3n0!s$h5oj{mYzKBB zN7NAs`0%_f$Bmh1>~PIze9r4pN5~uUw1?BiOSPx3cYFOcVO!D@=}HW>jJ>8li9IYK z1*?4ucuo4h-6tRk`os;a#FvxU2~6M&PV*U`6QQ&*sI{7?U#t1G+Apz3?M!XZo;ckx zy5^h#D$OS)8u|Yjq~tRo^HCusc6$Q=Rf5DOfNIP&(JR18xPik85)!-#DwOvuF_mCL zgz-$+jD^Mc@vCp|7LM{Ue>Cau%rTCg{qf`AZyz}(9Obz8(cXThY&rJr)h@~QR5m!1@vYA{_TUc75SoZ4* z>lXhZzC^KKq*aU=mmFHUXlTF}(-G(8rAI!7vG-A;{GgMa`S5eDN- zoMtAD79&8I7OFQR+K@bUxnK&RK!Ef!qqerTy|%5nG1&ljd2Hfo?0JbSxx!`jT*M){ zyq)ieUN5bWit>i@W5n&K{x?Oj(eFlPs=4(G7d9;SDw;)J*DBnBcB!~xxM99e*36TA z=XbSt^!9X3YVymPx!KHeFU%pDMJ=-ii>q*Fu&yxQ=Qe0G^Xdl{v<2raoH;me(G23d zT1T#CTg9J2%2`*kQ{KT0eA#)N71hw9Vk1~=pgcQaY(}XV?Pg3@j`l0A)aFVYaz7BR z{Gjg<^qqA^vfx@!j5>9C>M)fROOndtjm{()!IBAbVew*O+1CA-$Y#IQke=F5?~9(_ z);B4UZEiK0%kz4kIDs6Bd!dRi&5jW|7o%a5iRsOZaxrc|msKf{bK;~Dg05{s zTT8K_4p}i1u1qT7plaVr1>TfWqC!B(yk60#s53;KFnm#B5VZdIPrh@j+4Wg>eIYu* zZCltmeNm{xqAcin(xSZVoI9n#U|i8QZMwVD;+nw%*-$!@NyE_YkLTF5{+dE2JTVgr z$0s)+Mk85U>OuWdF2UI`#ChU;@DA|&M`Si-T!*6sl*RBs73M|5ev1~(2w`&Tb?zFJz8^vX6{f;r%oHs)HjQVwC3HS zcF^Ta@4dSaylPJ{VDVYq1FLI7hxWNUYRSzs| zZ?B$4yY=hqwTAt4z=!%8jp5R3wE9cczKO0w`GDOlW=b_d)VR<57*4~l<^u5HN|*9} zDEiWO@*LCDUz)xH@XKr9v0upD)qqNa$d-)gR1>xUopvLbB1C_XVll$ z-<9|d>^`hA{)wgWJ3(}pIz6v%jLSLbsxMQ%RkP9i)0(AXuh%e zlIP;6{Y8YXl}4F>CiDRNCS*GJvZ7K%d(^#m=afvf!u>s)* zv$AJ5D-!o^20aLX5rc^!)g5?!B$rhbjK(@pY{a2%|Y*DRgm4RerA^h{O(B66J7*K z_*0c@bTT2_iQeA{nA-*T1kjADnhenWg@7UH9YkqnB9Vxbm|2|>SEb?6nW;9%_Cqms zOqI5MBk!?`*k3`};MJ+ee5!cPRkdSjE!X_1r0PHJ(wZMi>s*0wVv*LeB6q9S@`)Ux zoTHhgTJySRYC>C`!8L{8oVOChpHnYd@M(9O>S`xBZ zLR0BM}*ziSOJgVk<(`E};8uGVk!`l8kYmas+EtzGTUkZe+m z7jI{;;GKTR#$Lr~;Ic8^G_HHq37urOe&coKwHTClt-90 z=D^F*?u$z=wD-W}>H~av@@=g8NP8RCLH#bG*!>PyTv5yp);84}cG!KgD{VFCttPYN zC}kp1hs|YoC$Jyb+$j2#@kV8bUq&q=yV2qlo&5#ou$YY|_#iQ#r^jM8nH0Ou3dS;Z zgVka(LJt##pR^hG%_gJBye@wZ_+S=ZW!E6TR!r#NdfNK1mAqETgrN}^gTRyW89qd! z$n6&*_gW=)%TylHu8%8lfr;wyb$tAz0N~_@u;{ljm&0Rs2AnpF&Bg2k1z%Wk_~dL% zXR^AO+*kW5_0VdDyJf)Z&6zDGQ$ib}4ssg3g>7Ul$b2;AX?(b>fryGU*Ft9E?fJn7rA+ zT)>-sly^PNwUYG68Cx6YSu6Z%EFT0L`+~};igPP$DtOpakAZ>3N~wD1i|kEM4KM@% z^%Kb8Y{vdzc-n4()vK}4oK^EMBOzxzjZDKjy_5()B?Z0qr$n2#{3!Fx4(rVRnUeSz z@-8nl8irVD-@x$Z@^k2YWTXeN1XK&)BYVrcoZEx4?Bw3^;-m1EfB!cQt4=Ds{~Nmv zC-RnOLIWc1r{ld2yw^tiZ@UzynM49)Np(AX@fPNk%;w|!E`L<=mq-4cy=8JK!Sbr| zS6z03YXfX#|BN@d@dh)8YbHznx|n;fqPk5cC0+8VfV9crx7rkO((nU1t8MC9ZSi?* zh_@L`7W4b!8y3V{z5i~G=uS26Kx9AX&_oRnNNR7Pg#@4(^2i!Mv+4%M(aZ~^qb9xN z5UVaaSkhR>ylLxJEM7d=9+#(0GRB-PQ&Upo%mtd7SBba0_K6$rz4Z9r!;z_5n;mZJ zsnr*p-<=Qmwl4Z7^6sb``LlS9_#$S|2h{^|+Y1Xz^H5hv1a z7$Uv{U9BHN!b#*B0w<_#(9URS$!7h2i>0NvrPS4tEoR}e;m`Qfu?WQ;C{7DE&}3SX zq{;0<4J@uVB+dk^J-6A=k|AY$QTX7m9`JeC$DxcZKRzkZ5t%-@p(A{KEN=C?V=-&M z%{-lv=~L)lG;Z;G@I}C*H`ol~W6WeX>QBA2g)Ixuov~tReD>65dM5NYwYb`*G`A?_ z4WoA_p1uo?0dSEX0bDE`F3rLu*qerh^Gcf_#Q-+Q9Rgzx@-}ROH5AENj2goj=s3*| z$!OHBvg>WAmk9{XoY~V;EE1FiVdn76CG+R@%;*`KI=MKhII*KW+njBxE2t1dgXXl% zIiU(=At({ZD$wJu(BlDC0cA4*uX0^U237%UjEqTD7++b1Uf5fOXivv!K-xMZ$Lc%7 z*Z-v>a+Kg%ewP3mC4jOmqu^dJ3byh?24qk_p@R9vE$r^oU@Wf>&zbSX`0Odq@bj#x z&rIq7;-PH9F#>3JwwGk$2|g7fE%pS=sn&7 ze*;!0GUn^EYCX`(Yw0GqbD}<@tu(7Wsl2$gmG7NoBS-J(^{(op{ByO>^upFwVkKDW z!6i!`+_wFJ;o%3j4JRDQXfo(dnte6FL^M%Q-h^&NF=Fr6+jKgc&g?cSdV^vxTg-Z! zR%1CbHt5;lR z4eJ0St(W-kWTVMx@;I~xQP%;kK_^)>dZQLazjTsLV=%e(3bsH!_z(lW(@oad%qDbv z+k?Zy4{YD|;1ae!YK`Q=k+|1g8;^wZ;iTW9MdL_sYB}G+@LLHsW@ts|lTmN5oUFab z;!q^Xf>I}zwO8mYA`+FDB}s8IqY|3nFqk#SBf{9q1Zr!Wje4UbITgu}S|-7Zg;{r5 zM3ccON%+DfTGw1^H3J{9TZm7Kj|zjrB9!XmMUo(6X|xGu(hMPUk_nZtAiD!9D9m=& zH&CI`HW>#XEM1=Dw#@i^`Ayn zEfE4&$P~wBl_TP0$lKD^+D1!4kB?Y;SZI21G$y+m+t9m-L#<1 zZA)bWAy0^%k2LlHdqkP^($|0RFSkDS+Kpb5&D%HeVY4pbj{D74XV`2s+gnQCoF34% zUc7SCMJ@gJTz&JsU2M11i~=7%k~%1x%-it(Y6ayVEDiXeD^5e$?Pza}TeXPJ$1b2l z$(M=-5e_~Oaj7_P9&tZ9of@%^h?lmuwn=RhGd0;<0x>^O39E8C;0Eec@l+!MrLWRw zigzIq!t0{j$t)Mebcl`NAY$K&NJ+cBbHd6mml|g+p3}R)Yz%fLYa1?_ZRpNVuStoH zK$BDUUzzToT&gclwfpj=(&xL@MXnv3JT;`)6DGwGt#AJB`dsss(+!d+8x@&FCrw)1 z+tW06bN!-PxQs&TA34ST7d}l6Xn}IVp_1EYg-$FM#kzuKL?;7V1*%%#3=EA^x-zwB zgCudx<~UwIWY8eko-{(ivCmLK8?f!%Aqusss?Q9Ug5fX)f`@bAY%=Z)IfGs|+P9}t zCRi^u*;bJ73agE%ObRL_t{a!|C`9p;3JQ5yT(;GErY_#RqQ5P7kwf;mWk=x6gjtRk zTia?R-M93HEtlVNG<53xuvR=S+jOUPAa}N?*Rw6=t>>*7f(lMZAzrf`JZ(vsCm?!$ zMt`X;YDMG^OdzC~t;{%vT2XpHUDsHjO=r^-KgC67>M9qc38zUUXe2R!)(PZ+%5otO zjxie%v^0F9(q~AL;9>-c7i1TJVD4PlS35y3IT8(tjLng0@F-5C<-_g%+IHNIH7C+m zhs~|jSX_=!Xmd_0du(>IdirKC<7=A~bZE^Xk1yc1`IJmu$d?ZW+gv7p7GDJ%(6f5H z_{!t5yW|>&FBb~5xt7E<`nZk6%a}$Nvnvr9n2};7_IdFnxJ3_m#pPULoLiRwVnAX9 z8X!J}D2*1D1;m*{c`c!A7x+jdW?hUE0#m_JN^G{*OWtE%?6$Qv>0~5i@mMfZcr6^* z!26I_P{n7IuY$_XO+`E-6u66zcViCQP9w@oru?uFQBWBEA_j0jj3-Dt%K!mA@=EB9n=H(LY=s6b{3W@e z52vc3uh>KY=xA^1EOyovh;;}D#{j`v0m4}3pEG{kR8)k@fOrRBRaFm()u7rVRE&dm zk}U=#HUJ`RDl{heB%Mjt>%tm?)e?|2wR02gW(8iDvUrlfL0~B#s=(y>Vh%~!2ZL<6 zPCUsp(;D4C5LsEsc{R45y$CtT2@EhiO(oe$1A_KJuh1PXRig4*nqRaN_k+9HtcUm= z9i>4o7NMC0e-kmVuR_DxFS+D->|u>dMrueyh-uv60K(Ye3!n?tDvmrh+Am9CR52?5 z9uZB<8!?u@jf&0-f7KH_3p1H(dL8<5xCh$2!CKy;R z)#zx##nB*X;37<2g4tzO9I9(AxfN9LkK-Bq1F;_Y9#uS8x4x-RY^+yYUTwPY_zZP5VzL5#Sx21;hK63?B#!hf=Z(>L}SoRqr1*qpGKkELyA2!1*EDF;{ zI)ytR{h8rAgPedsBqk_UD5FKHhNUW4xh+!lw1yuR_rUa8JY%A}<*|fu%=J>I?1T4k zzzdp4XEs&CE(iT9A9R{e{ZY#f%647(GT98QCtmzU@p(WGmJ#UxVM&9nMyLgr`he!* zAXM>C7>Ob*zm;x{_is%h=~Ak`CYJ-u$SazdY%h=?p}OaD&X%@34KW6s4(g#m8`T+n zP7`(qZ61x&Z0dFBb{Iq(3?=0+c$B@e{`{+aI*%k7N*Y9d zETtkdDG_39BOK) zE95eOh4CZ80*n*jMGQYyH{bIrK;i~;s0%^*bZTS+LLQPI3a(3R7NZ=nSr3Xv8az?E@_sG0?*Uz1M{XD(qA)~3Lp|!rP zhqY-xX*TBS8uCW-1C*a18fo#@6w@LgAq~t_v)HpZGi0y)4!evUgDx@2>4MJ$xkZ?U znog>FFdniB7V^j>5&*p>2fYsSsY_0AvCn?Y=5Zd}=rF$GcieKoY`1yDB{NKTZ+7I{ zsKfPVL_uF(^1wuD z^)|$F_jWZbUobV1%XLMa=BD|rlNQE9rpd4{Hw?M0?(5+DI!CeYFyGuY!{ON2zt}KO zvFz4{<0fm?Hn}N3Rn*RqN)5T%`lu~yL#GqaD{T`WgFb17a7#(9FJ#~{s%e2_Z-Dv@ zDawXUP)3*r0cpGR8Ur>@vd9`JT2+8Y25q9KO$}}fnRg(vtOlE@3+cd2)>VH&$^v9u zfr2gU!Kx`$?IaT%28z;}`;k?Jehcm#( zVN1x{s!K1wo{^S}k!k!kXwjd8L9acqXcYp2*ho^$k9-I9nV_xWcnyt=sG5pgWGW(L7FErm z#|ziVZ5z!RmsP(y%1A{vVYdiY8%Ms2x;3M3vKT9G;?C^qo2st@L|(KR zSZtNv>e5&?2E;~}M@r4jdaQ%+Of3IZY#KQ!zKmTs!FvTaeCW==DPlRmHy36nZ!%3P z`AYxLvxG|6IKCzan+%#r90_W78;mxyz5z9B#LiZ`E|u_J3UR-=2-O5eUp^_;p?>-| z(M}t02i4Q487N&Tn;+_iklvC4r?`wPh~#Dkhu~z6IQGhjh&fj&6R0n@$UNGabotEr zXe4HbV!%t1m(020z1KHsKEgu zu$p*Z5}&|u1j*D45OINC&jv6`fgV$=n3Ck8M+{{gHocu37LF(xm< z@YBIm;q+8KJ zsxdWZeL<&2yPdemL?i=q~H{+dfKc8%I=V|HsC+9Ul|lR(@}6fEzfT@*i3M$OyX; z7R`&xe<+_6jId~aseF=KGFkaG@tu)_s4i&{9Hp`J0tscu(uyySr4^DehF0JWC-H_m z)i;c%6Hw%HLj|oQefhWJh{VY;L;^k;Ral7PW}rG7nJmJiP`nL%@Hu?oQ%Pc^;R^{V zf{TX9XJz}%C{b{`xI&TL4q5gQugAn8X2Cl|@nW8_s#$Clegdi{iE9`wDEQ-ub;A4N zcj5U_nNK5}{Km!&T!6>m&+n?vCs!4c|wto=$hiZho|yz+=h^x>S( z43|Iv@m`;j$c~z0)!hl4BXFh7Q&Cpy+l$D5^F+8Vseq7cq^LO>ad;%9&cYm>u~??w z!n84sWJ@IA+c}W|hRtFVYXJ3@#I>v)t&nGQH)2_yz|6RXW{$U6g4tP)+FUMiTPOmQ zB>J%uRb{2~kSkgplr_lX@u1M>dRMK-Db|P+gRvk&LL)Kek04-a65zKSk;+e^eul9+ zR{+#mF2-<}ON`Fd=+awW?~#2Tv9q%jh(!{3SCg0*e*ED(Wp$=$r+i>6_K)2uiTY)k z6*SVqy&kZgs-6IZCICC(y@xM?%7>(46O}%_C1TW1b6*6(PVUoL@nO14%-Ursvs{v5 zihZFX;zN3cBt>2LK-g2oWyFkgn4c9%rLGAg59D55T^A@&@TT5jds`g#%5EpbKYCYb zWFj!pF9fSJ(q$3J0px6OqJXL5q{u3IuLtkNpdglDcd77>SOX-8BumkHw*mSOgH;L^ z>@s{1MN`A`3!`0GR2&tp21f^svwFK7Iw9H`vSL(tOZ*wfp}#Gge-upO!a1pi7S^{k zHr5uQjF1b8B1Q|XO-%)e=WPX#QgCq@uo)g6OR!f<;(A7Y%d~rUjJylpK@kvli&}WJ zWxziRFo9BD5ZB=|(v+yQAep7|XdsR-?2qRazB@(3{6S+1xw);(WQ}P&-5p}b#GJ#W zudPcVH;uKGlIfM7li0|2q?^zhsws_a4byy1HU$*ugIoR6Ia-z2S*-$7FBg6XiFY-m zd&F?V)BAc1=uxW&pRs?B{+j|j+9u)ms7Q2!xI`*Slcn!TZ)tXFC+J#qQ*?86Yjt~c zSL%MPdtYzWZ_xjfzHG1?VusHd-Zpj{XBt0c{F(9hCJFJ-cblFtH=5tKoU|IP0c*zE zZk=Wwwtm6-vQ4rrv~9HQwtdF-4cn`>U)cU+*V}#el)cqH)xOyNar-Cj|KUhD>K$_( zYaJIj4mgfG{>|Cw+~d5`d5iOY=abI&WRo0}ACSMOOmqRA+)j7cUGMI3-{XG7{j~dQ z?(ezZbpO$#^&Iou>s{r&&-=Eo&v&cuVc(a0FZkUsu(tc3^nca=EB{{uivnu{_XVB^ zd_C~}z)u6e3$oyx;PT++;03{}g0}`A4t^W z!v7L}J^ah?Un1tnKx9c|OJrZ}W`kmNq@rM&XPy8(;RQ^X&!1`+`P7VSMz1f*EZkP{BZMM z5hX1bCl?9O|&d(P{*sOM16v7S47 zKGpL?&$A^@DPF28Z7ID|I@N3Jb@#@5H}^i-`_DNchWX{hc-OB;e`$VveCG4^Tua4P1tnFrmt>p-Xd+8vt{{~&0Egja%{`3TVB~R za$e!QP3Jv)-aA{TZM}Kxo7=j!ZQJ(R_O|UiwtrzqV8>-Up4#!(ovU_!ZRg4Jd(MAw zmv&dfuAW`9cdgp>&hGH;((Vnr@7ewB-T$%2xo6s*f8Fyx7tFoj%NP9qLidHsF5GwF z-4~WGT5{2q7oE81&5PX^7cZWB@s5ixy7-Mt8ZKFP$-;FQb`0L}*<5P}bef-7a-?>S9Q;AbQ?BwfD z{jzVBz588AX>SuXd^L3tq8-i`9?q2SD!(T^qDkT-c6hprf4@~v!Y6RX!JbA$%>RP} zS`a7OE7T%eUu4{ICGK5`Hu-tv*Q|srKc|mE<+^$v``ww>uyOF;dRYg~htN*-xD#5m zN6^l{^RrHPWaKp*zr(#6x{m|*5Mlqw$aitPi{tC8R_-&_^~{u1YB&vASXZT};W&m%t#-Y3oxg2;VR%MW`01-Kr2Y!v+L%;Q4Az{Va=<2V0^ z;~}`v9}{$E9;k_GWZM9nZJ5&!It~g78+)u3!t5V^gv0^7_n^=Se29)aF30EF0l%N( zd<4f9T>oDlLRqllUEa~-GU$#U2W~wMyTjv%&3Js|bsWF1+{0(V0dF*XkK8Qk@q+Lr z$CCaW~d2-X|`?d-tQ=12_%? zUhpfc96p?rY$@)YdHkD@6&@3^EQR@=jDyZ}T!r8MBaS74Qw$3>9QLsX>TKKD2H3to z?3gXMv5rq4*TVPeufW}(pufunnSBGAu$6)dlDvt149DHL-h;mX6(Irr$OkwNVcyr({UeYF3}OtC{8nu<4kLu=p?P%OMq86 z#0);u+PWC$M}=B(0*<+O?qfK1;&>T)03Ysc1CP8KpNS68JC;E|_z2Osk>7Ee_EW(i z&cyfofUCd4`!9uNp%>%*JjU_~-2Xg|Cvngkz8}B8L-0c~Hlgj>(c>W~{kj1ITC)d* zG~0vu3=754<7wOO}x&1VH4+9KGe*!6hk3+Vd;fZ+pxnR+f% zt`j&%an#|6@p~6z9`<4m_TqdM&S!q!k7p0yy8}2Mg)jK?BM(SV33=(CaeNK;Ujt01 zLl^jC_y_$I-+vKO6%Nq|i|O;&AD`!Kg>Wy;vcUgl?2CG6Q;*{KBIaZkaAPm-x$!PH z;CM*bhr@_<-iyNx>$(njlV+aEaUY)fgb+ur1sO-2_2M0q)dRF5!H>`2OuWbg!hEqy zu;AQ^!@*ufJ4f(&2l`BF<2t+xFyj5jxNuGIp<`h5`Z$Me0r1TNmums{TJ|8GIgWQ6 z7tA;k;wto=-c9hQHBIopT4=z%20kC3!MggqP$#_xSbRf>NO2)AzJc%l1iBc;yO!g3 zKd2lh@!O5U0*q;&@TM>w@hK6a-*lGp!c@tI_8-HZ^m*tH4q=?aND>FU(aV3uaS{h? zx+5hV5VJ?%rZBP<_mB^-{F-{u=aI?G3US^pG~+Den2I$(*9jcUaWvr&a4;Mt99h7v zncfZ0bbJAoz*k`34@<9=?;2StJwkWJ{u3|5>OTP3Xt6quh)eL@ka}h-(GF~q-A_vtlvfIYIcVDE<^}bZD~78xz=V^d{@mvlC)aY!_b^zbXC% zd1!T#Q3^^)DI>K?AD8Zv9+94voK^CeAORyZPXKk#5%|I^Sm55i`fgaz-9!I76cJU?j z_=hMAKeop=kM>y51T`s5mu9kNt>!$<1)AfUJ2ekzPH4WQc|CFIN)DD-;!#+G@Q}wQ3c3)wUMxTeYoP>;AsabIvB4fNyF4`t5$s zbLPxEGxN-Io|$>(nade(%s*?mT0T9o12GBPzwbca{x|k--+#^i4f`+OzkdG(`)m1^ z?mudO;l7#sPTq&1c^_NT_vP;!@!H>Bd(oIzu87PD$^4i6HgoOaG}@z`0%x)_#W}&5 z?wsz-cG{eF=St@W=bH%DcIN?+GiR4v&K`+&=+D_s=v#>3Q1^6qwmZk2=gxQQ+{Nw^ z_guHZT^Sg|!l^NV_@OZe`UH?2x{s?HPPmXF4_OEN7jwkgpGY zXg_i~oKu~77(>suA8;P>QT7wQiJWvYsk=e79uHxqjhwDqj5c+gDKs-!i*gd{PRE)B z<~(e2i_A)Mj#FV;&E@6`d{5v~bCX$ZN0=US8(PXXdg`Cht2}6)G!L8I<_YsV^IP+h zdD-kV@1bG;)%?vynCqBq!_=&!X%XVI2ATBn!_8LOj32Px=stFLK0urMGuqal(}(S% z-TO6q^DkNB^)!9kBiIc0vPb5Hv7#f=0$TN{m7~2O%@3M!OS*qnOWwK zoGAY%Gshe>XR<2)Eb}g_YW{*2zJeZbIg3SC*{E4VE8J-ZoAYgs>9)D%0(!xk1v0; z+BJ4AEzOyBzFla~=9?RfX(^Y`@~ot_T+I&5cH3b)Z5LlaU2ng@`nRvz>+RQQlfGeZ zvftucN8h&JvEQ|K+Pm!CcC)?5-fOqmt+vN*w>#`k``>*30TzZRefLB5r1_?A@%$yNB`kT_(fa&RoeR^piWVv;T;3)DP(seq~Cq z{g<0(%mni&I?ChhF5QEU`wR4!$4sSp)l5g9IoJHtG?=8RL(f=jJ~W>$J1r_Nc-1bD4e?vyw)ooVPR6sI7bFbnHy>f`ZQ+fDYFvl5}R7S|=p z^AZ#48>`iGQmcxYMN>ip_;m}33q(`{Lj~o%^#b$u`ZsNHxIAr^?C8c6mdg#}Zf--x%LW20g{W@f7mRx`ugqjq~g4^6SUe#}m`fsv|59T}vf{H|NVqqeqATFfFs+zV3%u-Mwc6vj-pfpq~ zso{bx88K5;Q#o;LFYhA-{oh5@OT|utgeuD25U<&o-ze`z`DOBir-^tTM5d_Z?c_IB zds)OjC3<2Uv54GTwDd@sB0~98!jWHDpU9G@`8;LuRG1hq#>_m1|LwsXHJdq943KKa6vli6#1e&Ys z$0f2_^4Aw81{cgavu@T|o@d@z{BzZRNI{PoRJE|KXV9Rkgl()$44Nb|izHX}WD4NW zh025-&YN(@&#UVZL55kC8+pHy?ZmP9L`%7m1__raR0RpGrzA6>esS!koOtTC38KTR>mp)GVk=49c&J*Cb*HUo;VpeG{t&lbQ1kMD_4102qe7bWaDQb7t66Vn2R_XeKt1x`u}JhnHm(+fPhz$CIJ z{Ridy4COl-y5f{i?qeyR+>fDra?huHavw+ethpWG)H5CjTo`B)AFm<9R1$`1p8He5TZVczN2!jWhFS z($dt?MbNU+98BheeM4dC6q=~vi5$=Zw3_1;EfJ}j)UvTCKOUd9k@TkaM~N4CX(a+g z0yCaykVa$rnRQ#8xEs&g>KyBiuCJ7aG)$XJzT})=OBLp|_OFjL9(Iz~Z#Y#A&D5@{ z#%9_wr>ZdzcSAi5z`!_-kVW&JU)wk(FP|K0DIYh@h4c=S34}gMIqWyYt~7xfg`p;XXQ`i0KVo7XRNdcV+A-1PJY#+Xr%m@+9H zAr&c=VP!#L>ZFZ`p2*ims`RJP#tSV<6hUH@7FonM^-e@A^Ql)w)HAOb)wDZwAtLK4 z=SMEYGY=3TqDaD6co~BM3D{o0S;g_Vh&@(CY zFt386ZcvwVixTD3=Tkq$|1^@bLvs@q;GABNIG)=q;ad$1j@Qz!rZ_dbKtwn(3&x&N zu*H~a9CL73am+2)V%29J4)r-xaB2veFF4{jOK`-oKybvduwX0g-V9u4#L=R3RpMHvbct)Z(j~4HN|(4=l`e6uRJz2qO6d|;o6;q&)$sU)-WS-ePl=NW z=OqT6h{ICr<=$p_NKa4pESk=o>OA1^PGado^($1 zlDyD!3c^L6QxGl&cUo_Hm*|tG_XW=>=o>tzpkGSNXS1TCgw?Ade?YPLAcg)3c{BPwnkVA>?^C4lM>;Uggb8D`cyYvh%7M} z+A|-`&|XJx<_&+=^q7pw`)W##a?M0>{&Y%s9DAzWu=i9MDhlNV^(k8UVD|LL^uR96 zg%LutDjzh{^{>yasqPtPuRRk5|Ju49x4F9KSb2INe3`L<>DM-)<$@w#S^en=;bX%? zGu+IH+imiyMBpp*yVYBR&8!ZqhRA>Mt7AM_ZK}n-#0jz{d1BzWPyXmU#va>Gl7I7_ z!05$sUh9v=^I`Dp*a3Kd?}sOL#oNS68emhH`7)R1w%9nn?7KPno-woM?_xQ6(02#0 z*Rt_K;|7`YDEHl1Sh3xE{$XtDvM^K9k1z(_=(|~`hi%96&rEY?*|<~S`)8YScQ$sE z4ztEwXgaa%EH^7mH+HO2tUx7P1-KXB*TTKtG^!n|U7u$0w2XfX|1R9!*v#WtyE;j2 zC4Nns&J44b`wILz!HP5HU!#_=ZeIR{Y3UW2X5xJI2=bT@-f~iHBX%cr7D1)_PbBUf za)_&|kJ7`@S%@ttJ(VLVS^pSk6JJWyN@?23vyYDSwEo?^)8h)Ss{FUoMrm8&=n3Rh ztz2s*|2CfHk^fpa-@={M1o)iFv(VNJp1iwO<@j=ZxvExE|bS-6%FYaMBHl6Tz4@Mvx!pDuhQueF+|P!|W^ld7|@ zlFsINF1ZSB9QhZXO3Jg9-c$-wx`BKz;r+|yNvTI!|9n%_G@1*buT|w{DNyKK$FtB8 zCq(j{fvr&7-OB0yyy${+QbX1d+C`4??%TMFWG{zTbBRBD0RN6G4yJ6c-AeuhIXcYG z`2y_~#%F5nIP(kZ+JFtRIV;14&Eqy=qu7TtnI~Fmv(4Rhkj=rO*+hGCJ$Bqg*gOFIVJGFDk+V50fJ$`_Uj>{zUIPhze6 z$R1;UZS(CoJ05#lAv0pfF@rY2e%4OJI(mTGS7HlnA=c7ml;COej9RHnY$+DP<+NJQ zsm1zuJB7KF6YPn0nmx&U4SR6{yYAcA0xRsv_7ppvZ-&n>ubY3^N^`uevemW*Tkl@1 zy(?@jXN%9Yr!sqVx}C**%o*&Z^KGSKZO5XzKy0Se{b}Y;deX2J=W({-HP}_ZM9aONcIiT_$Ny!&Y`j_6hq-`z!mTeaimYK5d_|&)VngUi%yS zynVsGXn$*8vM<|L?C)@oxPu3*0EcxJ4oGUsz5mg19~lbLy$?#ys1ohql=slkdollhg?m@S&cjMf>> z9A=H?F&o3Vv(5tMV9sW4rp~E1-^OM>6r1^Q<~v53QOvk7bA%oG^Uf0Hg3fi$^XCeh zoMxv5P2hc*IYEawh1rj5m>(I0Wj(-bNeDapF=!S+?CVD}A76>hyn)%8>DbycnNitd za-3z%%iPKQ%g?d2-^c9CHs)t`JImS5xr6hsR+vprtGUWq>8vt0F$cFAE#%M4kZh+7 z{HhttOwc!&srowB`$jDJH<<4*OV?p;Hs3Nobk;Ec5yoDBzjMCHNAI}ST+M3kjc7Dq zWUlBB<_f3NJj_f~x0&IrW&UFw^B|n1>|E?z;(Wo`;9Tll=3MSv;e3&KzpGe}uphhs zi_DF^LVxrcvqt-5_Q<)~xh61Y;q2L=8B04`E@;VE+umAIGo!}4S5Eft#s0n2zn6RW z8L4}f|Lo(>nBqUr@b7;78KoIBRyQ_vcC=^A=vdy--m)rG-PFhp%%+ajs~f#Y&S|H6 z{#8DmRZ}uf^W&Z7(|1~TYg=^#c{n$RSHK|xWR<+Nsn&PavE7rCzZ|q#V zx~*|-cg9?=NTK;2S@S)z=BJSrI!l8x&r0`O(EBdfSfP0pmzJdR_9?BI99-B(S&d(w zTEBcXDQus@nwqSI{U}@LGkc-O?BK%A*7oJ0h05~KBBd#|sHwHHY3=G|Z7u5~i<(FDb2>{zp+CDiWWwx{8GR8;$=tM-df?U%CJ z=WTV03qFslYJ(kpLRRgUp(Yi}$Ex;uSW}YK(ND-aykdqry&`maWOb&I73$KU%&s)Q zU|UD~@~%*K?^~i0XpU5Z6a_xLHOB|n_R&}4m#Wq;Wlaj(r?aLuYi&RJ*7~nutzQY& zY9(0fRf2UMU)S}?d1PI0C0OTGf(!csJqFiSgf2|41U^4&r-m-l0I5|-n_J}OP(u27wOGicHXie*Lkf9+uZK+E(&vLpvp^miB|dI@)9jI zcdx-HFY$O*UhLnertq`@0Z(~Y%yup>o#Iq{t+<3M?cB9#;jY{TU%AP%HZeSF6T`D| zn|taxg{O@p{wgKK<)waprG9>;KE3QT7x^zQ_VG)7I!k>zIZ;8wOMUuEeY#3hbfwbw z^Dp)3EA{CrPT{5KPL)5Ek56y0pMJ5QU$LK0v7b(9iatNTVxNA$p)Q~7r+>Vk?o|JI zs!ta^v6iFK=R>8Re)W_=>R(b`)Yj3|RylLN|2$>D^VI&&#nt_vODg+6m-eRT%%`W!=YK^?UQ*$HIm&!~Rrv8MQsF+o%6xv6`Q<6|`CZ}jwan*3h0ljFpPyx^ z=MmS7 z?kC^n1M)8)KwtR)dddgTQ(iS7y#e%;*YpoBE79k(=2vDaU(2RQV_M=rOig>Bq!JRG z*@)h%FQIH|xihcTb9#D5aam> zsc7Qx(ZuPYiAz&2_TO@Gr6(=Ll_~|L#eS<&Jj0WY;u*z(nzfxB5~;MfQbm)yiePE6 zH<&0b^_p((Dq^K2UK3hc>Nj=8mFizRrB+3>w4|gg($dw9lG5GMtSOh2OwMjxy{4tJ zi!Mr-Qr7>mJffW*o%qs-_H*L$*yJ~lWyO;t+OJAT){2gfRgFtKE@}tvG%|##e<#A|?K1AfTmKB#5c`vH8YHCc?O-Z)t!kjd> zqBDOaD^3S-H;gU$**RFFDj0_j$4^!b%9lFgz+G=4+0-z#h+z$*fYTA7zbMHOMe2s!+Jf-DoAo<9pogS z*qb;)8~c)FJ!B=Y28)r!E;JW7-<}0Lo3;Ixb#$C&q*fn`#itc_7xo*A<>mt5g;;5< z-DtlI{3e!i7zv3~3UK4qT< zKF59oiyVwIFX+C_VhxK>SG#@!7JuJ3?rZrt_%<1WHRZC~P znU@Y%H+HTvb^YL~)vHYN>NM!nC)P`$SxzeCI5KhxDLtH^3`J2SBw?OD=BZ;o7~e2{ zL&?F?DP$E@Wq0`>IvdX%uN0+_KYDs59J>ulhz$S7O zHrp9$DX+$IS<4#LN#-2>Ct-y+4{OMBR;ixCdezIZgMA6ftH;LhO~P;HzXIFUtyl%; z+Ur=yy3hU(YZpDv3uT$)FK=N8mvwUFN?t^G7`_g5znRrAeDmnrj(U2moVT}IanEt~ z*(-Ge7N-f$OKJaia2Gjyu^OGuzuDQu^Irej?7YK@a={QExyyf_^Nu^u`B?t$ z6jquKWu5ap_h@$l|9NgHepB39|1Tl6>L;#Lh`7&nyY;`)UFmMnf3w?+k37r2+m!== z&Pmx*Q?^up_31e&i)o*|l$ENoBDD>>sH{j`qxR2>)yjF5+A=rxS}?EgwOrneHS!18 zAN#D2ce6fKY>xL~X_OVJSQW7&iVgAkK1(5$L2P@RiHt?hv)>&xz;ah^^6kRpJ9ar= z3SPlZsaCE|+!rTbwU=7 zBPa;Lp^uD9z8|v#DF-}isQ4?SZL#Nq*T$y^#LrEqLTD#GCBgp=;&0)433?s-Bfd=Y zWA;Zn?2ZfAoz!Vugzi)hZI(8|ZYJIB>_OTo?I4zJ1FraQpnPE9AB2X6&HCjZ>$gI~X=zL5TPKDm1!E%^Aq zZK)x#TK9GA8gZDz9nIfG ztII)-^3k@>b5XwSORtucTKLh&appnf*M-H;jY9(#PD*i4r^KJBY ztN9OR)X|QA2mc|IWF7B%y}20u?h?i!LG;0|(~{iCKbz6WO^kBBX}$xzg@2BgHb=|p zjV0*)Y(4$*V){MH?woVzshCy9r-5CZK|T%A#Qxc4+l;%#w$QgNv&-nMmcye=cm#!L zPOI3j+NQm@@GGeN3hHPihAy=Z{PplIqPz>iyD#A0puOVd%phm5L+1*1Rtq09;N#Wo zhP}pKLps;O(}<2_g3KOYN2wiFCj^*flrh?9=JbTKE}X3(WHMt2S#4BHk9is#bl{-y zPWa_2r-mx00%@GeP)-d~PKA|IVdkQLN~-rWV#{OR`v9|%Z?ofT4Exri?3a#NRwA)~ zEem%xD-*`B4q-UF7-h#$hNBq6WwTnKoHA6{3ih>6W^F)@%<&T{Be{|6h=Mj|_ZPx( z8P7TT4u-*fzM3kt`9R^jD;g?p;W%H!f#U)8Y__7G2;W`h`!ICY^TFw4FM2>nfe!nx z*5V^$!J*21SNWdHyuIwC74AFi*}4?BaDSL`KZ6AuYzeKvcvzK8#<_Ez4O%+Zh0@ns(K^S9&vq5UBold)zV+VUM{ zxQ;k;n6bYTpSw6gfD=V*513o*7D8ntItDG8lj+c;e}Y>^rJ2m#{}g<7da!s|n5tJwR<8OG~ytxtrc!^fdlQ)RGNAO8y~vKk2;Vc^_7@ z8W3aPBPsOtGf=0$z<)-K#7(~DX_Pou(4(wk-hS1;o0_L9DJ4e;D23>l(f<=YO{Y2( zFZpN25hnS;p&@BLGP+OG7Scj+qLDw+=aYPyv4HsY>2_YA%S}e&hxt(o(F?p7k`LuU ztM5ME;eG5ob#u z*OJd9|E{Hzw|9g;YU7h8l6wCs8bsR_{Z@X|`oE{beV<-wIg~e_rtNw${}t?ekN*m@ zU${g6Dt(|)3+4zcm~SF^Z`({x(a5HkYovdxV)a-JtJtn$1>0%tPL=-cT6&4=*yq}?x7A%gRY-)PuW(V!Tl_M7u)J@ko@QQhv~InMH70Be+Y}~ z>$u;b3>n&whv~;zSQSHZLtRfu2=_@1cNP0c#(=#b8U&++oJX?G7 zL9FhZL7!fUjh63hzzbI`wK=vHj=0K^ARL(m&TROSX|IPb5$!h}?Kd-&I~j22HhNpJ z#YVK3jHFp)2WkHp(f%=8d%&3XfP6I-8$(3IZ!@8D>C2SK=hIy$3BA_x7WX$@CRYnW9J4O2~PlxkXzYFYu+v_`3>HCi>TVXA34s%Z^VO>3BHT5;91MyaM{ zRnu}*(;B9lmZO^1Xw|WXsdhC?wX5N(U5!%hYKUrAxhf?Qm6DiBNv`TunW|Ui`m!Q= zRjx`*o=Qwa^(t5Os*E(biK$+dt9q5IdR4CKRhg<+<*HPTQK|CeX@tttNR^~qm7$o* z&{3*g<*E!FrP`GzLt|8iVk$kks!_SBQSq5Jw5V)WFlMl7Pqe6P)uINg7A5N#bIfO0 z#W;d-)pV#QcFIbZlOu#aOj;g&i5Va+vk(~sZs$Y9_(4SIjgvL)oRXw)vAYDyV)(G zx_3~e##P;0*1blVSrXkl#QN7v)^~~q9#Gi{tL!)`J67ezRe1@hytpbaGKVuuTd<(E zV1u>o8mw(sNLwv$Bt2MLt!!o5k+NR}dn>Iw-v_aaAxfVL-IOEQGFxLImFbB3?e%a29^pW(la8ZeAHw<&pDlKF(>{mBG= zmt*7Hmh9o_J(JaM1QI4L7JE-8R5(zplaYdG#+{7Nv_+w{cnaP6L-e^n(q_C(4a!RX z5AOGp57C+&#C4D~98HZs|XiK zZB$A1EJXqBYjagz11hh49{_tsu1ak{``UoYYcS1vF-ol$p5_)(>CDt#HmcG&T%|Ln z(wV8fEE0;0W~z+Fw3qcP7K2qfhp7Bn?Ll*udPjTE+%#K7uJ)k0+JgqP2hCL(4XBI; zwFe!lk{U>}Rpe?98q^*%S9{Q0mD+$xt*d=!Q2WkYmEE9kr4ai>uG%L?X%CvKJt*7v zuulY3fhpfT-1GgQ7~+Jg>KDbG}mEUL0TTxC6`vOZX)+>`H2)w~9&ln+)Zk7=)&qrE0) z#xqD9>Gz#puPJSwtn(jjBHBlWwT}#^^^qge`bg|!R;AJEIkxClGLm|e`f?!o59W?u zPj129d=UFKGiPEmmU@ytmIVI;t`F%k5BgHAvfZy&_$&7C-m#eU2Fb_h@eY#5+sRjW zIw&&&1Al2V9xmxWB;hg+f-c6a{YE~4R1cHN1-iF>`bel>h{fjBx4YzK-fH@+>@MbG zpG?ih!t88tzlQXD!+rz3{brrn6AP6?th@2Km%Sve%;{27nbigEvb%tfVrz0q=}F=~ zqj^Sdts*$tw#St&YK%WU6zD3;o+ zv|1QQvl3?ec3J5)ygHYqb#9o}xrlNwM{8bG>s&zp^v8Lo9Ms&y_i zt+P}s$(|Ic4J+9_BC9-1@(ub2&;D^gb3DHh z>BskNF0qE($>q(2?7}75n0z1QNap_?YP+-rx(~=WN-rOMpe=CIbRI`(bd^S@SLey- z*Vo)?Z$&OerUS~=fb!E-&M>=T6_WUq)$v$F+8C#N73)k&y5 z_Yl~uJ}U)A8%U)fRvMcUc|Yh1+qj5FFqI*(b}dq3o@Th6r;xqQOi z1AI|^ex>j^_hx){iyQk4IQ9|sU!ZWW!Ux^!!MUAX<<{KgJPW+fb8DJ+srxa7_i*x| zHFt`enk)D+$I41Mb^k`;4sd!UGV^uh%w}bJ>y_+2W2wTup@fa0HQmO}EGmj4tI&+D zLX)qIj{gpU5f6% zm0e}Bj_(Jw#1EQHx{mKoUB`F7uH$=vnV~;%(wnT~dzO}XxcRfL8<=ErC~Vh8YV3t5p@%8(1V07OXL?%beB5;z zD;1s#Y!)~7HC#7m+^FyZg_kJ2BF$eyuk~>}%z0l$`98w_XiJCk9+$XDBQeF^lz`YP!aq%bT7v;T# zf2HtQg`N*E{Bihy6~3zQ^l7FnsxYo_H1O<* z=RQ__3KW(qJXzrs;Moz+U9CQ+E1V}#(>&Wt*-w8-uYW4X6-r4v{uf0qQ`nv67M}+r z+Z0}%=DtDQUk2V8@!a23pYJNXU7;6C;GKR7o=+kz^kL0?ufjd}KNa!Zv?0+6kx$g$ zgZtF|X38gWuwUrAivK|>l&65WqtO(M=BR79!U@r$XnAx(bc{lAALILodv>&zn6slN zDD>O{r~Cf%ao-%hF1iVLfx>eY)&VbxdhTZRS*dW1LczbpkLAU^w%6ZFClz{y`g@_b zrr{8aoNv_J@#nsoYkPFJ!Y#e-o$B*+l$Ig-bo2>@o?GDa>VH7_kPiPKKCvOO%-GSf zA<_30z9Ue4q91wwJ`AP&JLdi%&q-zhCL1 zHCWgEE3m<3O{sa${X6b*)i0h_9pp*X6n>#TTNL()zdcLhnmb)qxSMA+h0kdU4@(N> z*5qUjy-A?Px>eJ;(_M#;tVpxwcS_aXPd*g4;yfwPo}%t0n)^acf1#$f(3R8{YUn~u zVWFmWllnZO>3CYw290}*`rM+J>lEh=^?z0UUsWGj31`i#n$D|QuFJGsFKE6=E!Pq) z*PpdqFK7xcC_OK@Hxl;+rRpV3?FC84PVn5C@(bd&i`3^HjVrcZYksCQ+@bytsK3lm zTC-LCx2pgB>T|#P$SKymJH>oiX?xjoDg%U z=_2%T;0tacKIQIs+>g7T1NLZM_c~9BTXVVBxfh&#)kE*r^na}Wo788w_}FEd<_=Bs z4NbFB)BKI5d7q}aL(|-$v1FFOnjMm|*`svsao!WRhW=dPxtiA^O>>c^ut-wi{1efU z7kN-qI7i*gjZ2#PM$UD22#&fJssAG9HGICMn2&49yEJr{`s`AiU0TxRT9%!f@0(hd zDlN|BCwGr~b^9 zfOEI{->v@NSD){z&m&6D6N>qW=6;vv{)p!Oh~ht@_>XA5YsAM67koQN;&NJy&~U$| zutj}_YdTxhe~a=~#s-!zU&?#AS22I2p}Q5{s}K}s5d|;IC3`q5qljXl>nwLx=zbT& z3Oo5yfLxZn6ksQB1G>b?=8vD`oxF{*g&57J(i(%Sobyz?kxL6BmsZ9vVm*#Bl4*37 zI(k+H=U8-b>h?vXX4orY7{eHLhV)(HSI%_;d2|WY$%_5nAaWk21d~tIw78Qww#hn$AqgYw>SyRIPm|8Q3GnLNe+@5yMtJ$DfgW+@( z8b`x}iHrlMu!Cl%nQIoYqh>j)DA%#4Mp7Hhn~O1G%wwJAB-V;fg;S?8LabwKxPo(% z)|<=Vq+2y(LEKC`WA5y@X`Vm#j5y;)kCp&ZG89gaGX?N@1~&UM*`Fh4G@Z{WIG6i* z1hEJXW1aYT#-J6vjY@Mmr{pX)OR+0;a`M#`J|6R@DW0x?By{fUXt=o+sIh5^o?u35> zHmzRc7Bw9)Y;J2^?oR$UAR8^+X|mn&$lx+gA8;#=970Z`d+NUd*{to(ku9z60)>ke zHYi*sJ38IABZnQG&FyaIk;5)|n-~2XkPWTwWwNdHh+(OFHTXvk%iJ%^4$&iq2o*|MHUU`Qd> zVBDU4DvH~omP_v-ZKJ?kh0<48YQI3Q7aF1N2yM<3^Ojw}Nli=nU&5C{_VOi=I(HfS z+a3rwe0!xjaBko`{C5VP4eSfN9~=@a4=yDgNlRAioXs}@IYo@t>|*X!tWA2+yw0g& z!#Q_s4ECqlaw1pnKDJlVPPRJinO5{ZZKOPbGA*Pfy@*+F`I3ix$K!oYTN}YQa872X zdLe6Rmhi2I2Idn|-)@jEH+&cS|LxeF{S&!#U)&CQw-r8TrB{`e?x~)snDR?&>tONy z9q`xoRp8UCL~=PL>wU|v8P3Z3tNjc2k2pK)UGD$j1g-b5{&B{X@Ib#7aZBpdEoZL2 z8JG7~K)>L<&mrKA<`UZ=c5W?=^ji&tTjzPbgr5>Fdso4Cb}NU)=l_>Iog#74qlpC+ zYMnTgjvGL=CwqQ5{deg}ibyPF=DqS(d6Rj{CrNLdrYHL*iU>!iA$6I>vV6Bia*{8t zi?7E)4RIU|7wx+*b#x0fF|iDLeh%+;R6prEqEpp~&sXEpYGmJ&>@J3Oq~$Fz`s~UD%Go%O{@4B!Z7+vY+&BSJ)I-e)T<7s|FX-8AE35IBGmin3UbD+kR z(-B#@hki}lLd%jCO0LqD`6UWStsPLRqoGq)gb7V&PcW<)DcTEQOr6D6OU7 LNelOV-hlaktnBkk literal 0 HcmV?d00001 diff --git a/OKAYY Framework Basic/kuz_Notifications/utils/jquery-ui.js b/OKAYY Framework Basic/kuz_Notifications/utils/jquery-ui.js new file mode 100644 index 0000000..0213552 --- /dev/null +++ b/OKAYY Framework Basic/kuz_Notifications/utils/jquery-ui.js @@ -0,0 +1,18706 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.ui = $.ui || {}; + +var version = $.ui.version = "1.12.1"; + + +/*! + * jQuery UI Widget 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Widget +//>>group: Core +//>>description: Provides a factory for creating stateful widgets with a common API. +//>>docs: http://api.jqueryui.com/jQuery.widget/ +//>>demos: http://jqueryui.com/widget/ + + + +var widgetUuid = 0; +var widgetSlice = Array.prototype.slice; + +$.cleanData = ( function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // Http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +} )( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var existingConstructor, constructor, basePrototype; + + // ProxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + var proxiedPrototype = {}; + + var namespace = name.split( "." )[ 0 ]; + name = name.split( "." )[ 1 ]; + var fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + if ( $.isArray( prototype ) ) { + prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); + } + + // Create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + + // Allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // Allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + // Extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + + // Copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + + // Track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + } ); + + basePrototype = new base(); + + // We need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = ( function() { + function _super() { + return base.prototype[ prop ].apply( this, arguments ); + } + + function _superApply( args ) { + return base.prototype[ prop ].apply( this, args ); + } + + return function() { + var __super = this._super; + var __superApply = this._superApply; + var returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + } )(); + } ); + constructor.prototype = $.widget.extend( basePrototype, { + + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + } ); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // Redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, + child._proto ); + } ); + + // Remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widgetSlice.call( arguments, 1 ); + var inputIndex = 0; + var inputLength = input.length; + var key; + var value; + + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string"; + var args = widgetSlice.call( arguments, 1 ); + var returnValue = this; + + if ( isMethodCall ) { + + // If this is an empty collection, we need to have the instance method + // return undefined instead of the jQuery instance + if ( !this.length && options === "instance" ) { + returnValue = undefined; + } else { + this.each( function() { + var methodValue; + var instance = $.data( this, fullName ); + + if ( options === "instance" ) { + returnValue = instance; + return false; + } + + if ( !instance ) { + return $.error( "cannot call methods on " + name + + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + + if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + + " widget instance" ); + } + + methodValue = instance[ options ].apply( instance, args ); + + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + } ); + } + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat( args ) ); + } + + this.each( function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + } ); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + + options: { + classes: {}, + disabled: false, + + // Callbacks + create: null + }, + + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widgetUuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + this.classesElementLookup = {}; + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + } ); + this.document = $( element.style ? + + // Element within the document + element.ownerDocument : + + // Element is window or document + element.document || element ); + this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + + if ( this.options.disabled ) { + this._setOptionDisabled( this.options.disabled ); + } + + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + + _getCreateOptions: function() { + return {}; + }, + + _getCreateEventData: $.noop, + + _create: $.noop, + + _init: $.noop, + + destroy: function() { + var that = this; + + this._destroy(); + $.each( this.classesElementLookup, function( key, value ) { + that._removeClass( value, key ); + } ); + + // We can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .off( this.eventNamespace ) + .removeData( this.widgetFullName ); + this.widget() + .off( this.eventNamespace ) + .removeAttr( "aria-disabled" ); + + // Clean up events and states + this.bindings.off( this.eventNamespace ); + }, + + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + var parts; + var curOption; + var i; + + if ( arguments.length === 0 ) { + + // Don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + + // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + + _setOption: function( key, value ) { + if ( key === "classes" ) { + this._setOptionClasses( value ); + } + + this.options[ key ] = value; + + if ( key === "disabled" ) { + this._setOptionDisabled( value ); + } + + return this; + }, + + _setOptionClasses: function( value ) { + var classKey, elements, currentElements; + + for ( classKey in value ) { + currentElements = this.classesElementLookup[ classKey ]; + if ( value[ classKey ] === this.options.classes[ classKey ] || + !currentElements || + !currentElements.length ) { + continue; + } + + // We are doing this to create a new jQuery object because the _removeClass() call + // on the next line is going to destroy the reference to the current elements being + // tracked. We need to save a copy of this collection so that we can add the new classes + // below. + elements = $( currentElements.get() ); + this._removeClass( currentElements, classKey ); + + // We don't use _addClass() here, because that uses this.options.classes + // for generating the string of classes. We want to use the value passed in from + // _setOption(), this is the new value of the classes option which was passed to + // _setOption(). We pass this value directly to _classes(). + elements.addClass( this._classes( { + element: elements, + keys: classKey, + classes: value, + add: true + } ) ); + } + }, + + _setOptionDisabled: function( value ) { + this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this._removeClass( this.hoverable, null, "ui-state-hover" ); + this._removeClass( this.focusable, null, "ui-state-focus" ); + } + }, + + enable: function() { + return this._setOptions( { disabled: false } ); + }, + + disable: function() { + return this._setOptions( { disabled: true } ); + }, + + _classes: function( options ) { + var full = []; + var that = this; + + options = $.extend( { + element: this.element, + classes: this.options.classes || {} + }, options ); + + function processClassString( classes, checkOption ) { + var current, i; + for ( i = 0; i < classes.length; i++ ) { + current = that.classesElementLookup[ classes[ i ] ] || $(); + if ( options.add ) { + current = $( $.unique( current.get().concat( options.element.get() ) ) ); + } else { + current = $( current.not( options.element ).get() ); + } + that.classesElementLookup[ classes[ i ] ] = current; + full.push( classes[ i ] ); + if ( checkOption && options.classes[ classes[ i ] ] ) { + full.push( options.classes[ classes[ i ] ] ); + } + } + } + + this._on( options.element, { + "remove": "_untrackClassesElement" + } ); + + if ( options.keys ) { + processClassString( options.keys.match( /\S+/g ) || [], true ); + } + if ( options.extra ) { + processClassString( options.extra.match( /\S+/g ) || [] ); + } + + return full.join( " " ); + }, + + _untrackClassesElement: function( event ) { + var that = this; + $.each( that.classesElementLookup, function( key, value ) { + if ( $.inArray( event.target, value ) !== -1 ) { + that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); + } + } ); + }, + + _removeClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, false ); + }, + + _addClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, true ); + }, + + _toggleClass: function( element, keys, extra, add ) { + add = ( typeof add === "boolean" ) ? add : extra; + var shift = ( typeof element === "string" || element === null ), + options = { + extra: shift ? keys : extra, + keys: shift ? element : keys, + element: shift ? this.element : element, + add: add + }; + options.element.toggleClass( this._classes( options ), add ); + return this; + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement; + var instance = this; + + // No suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // No element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + + // Allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // Copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ); + var eventName = match[ 1 ] + instance.eventNamespace; + var selector = match[ 2 ]; + + if ( selector ) { + delegateElement.on( eventName, selector, handlerProxy ); + } else { + element.on( eventName, handlerProxy ); + } + } ); + }, + + _off: function( element, eventName ) { + eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.off( eventName ).off( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); + }, + mouseleave: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); + } + } ); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); + }, + focusout: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); + } + } ); + }, + + _trigger: function( type, event, data ) { + var prop, orig; + var callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + + // The original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // Copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + + var hasOptions; + var effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + + if ( options.delay ) { + element.delay( options.delay ); + } + + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue( function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + } ); + } + }; +} ); + +var widget = $.widget; + + +/*! + * jQuery UI Position 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +//>>label: Position +//>>group: Core +//>>description: Positions elements relative to other elements. +//>>docs: http://api.jqueryui.com/position/ +//>>demos: http://jqueryui.com/position/ + + +( function() { +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[ 0 ]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" + + "
" ), + innerDiv = div.children()[ 0 ]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[ 0 ].clientWidth; + } + + div.remove(); + + return ( cachedScrollbarWidth = w1 - w2 ); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[ 0 ] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, + hasOffset = !isWindow && !isDocument; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: withinElement.outerWidth(), + height: withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // Make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[ 0 ].preventDefault ) { + + // Force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + + // Clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // Force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1 ) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // Calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // Reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + } ); + + // Normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each( function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + } ); + } + } ); + + if ( options.using ) { + + // Adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + } ); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // Element is wider than within + if ( data.collisionWidth > outerWidth ) { + + // Element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - + withinOffset; + position.left += overLeft - newOverRight; + + // Element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + + // Element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + + // Too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + + // Too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + + // Adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // Element is taller than within + if ( data.collisionHeight > outerHeight ) { + + // Element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - + withinOffset; + position.top += overTop - newOverBottom; + + // Element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + + // Element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + + // Too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + + // Too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + + // Adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - + outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - + outerHeight - withinOffset; + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +} )(); + +var position = $.ui.position; + + +/*! + * jQuery UI :data 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :data Selector +//>>group: Core +//>>description: Selects elements which have data stored under the specified key. +//>>docs: http://api.jqueryui.com/data-selector/ + + +var data = $.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo( function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + } ) : + + // Support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + } +} ); + +/*! + * jQuery UI Disable Selection 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: disableSelection +//>>group: Core +//>>description: Disable selection of text content within the set of matched elements. +//>>docs: http://api.jqueryui.com/disableSelection/ + +// This file is deprecated + + +var disableSelection = $.fn.extend( { + disableSelection: ( function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.on( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + } ); + }; + } )(), + + enableSelection: function() { + return this.off( ".ui-disableSelection" ); + } +} ); + + +/*! + * jQuery UI Effects 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Effects Core +//>>group: Effects +// jscs:disable maximumLineLength +//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/category/effects-core/ +//>>demos: http://jqueryui.com/effect/ + + + +var dataSpace = "ui-effects-", + dataSpaceStyle = "ui-effects-style", + dataSpaceAnimated = "ui-effects-animated", + + // Create a local jQuery because jQuery Color relies on it and the + // global may not exist with AMD and a custom build (#10199) + jQuery = $; + +$.effects = { + effect: {} +}; + +/*! + * jQuery Color Animations v2.1.2 + * https://github.com/jquery/jquery-color + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * Date: Wed Jan 16 08:47:09 2013 -0600 + */ +( function( jQuery, undefined ) { + + var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " + + "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", + + // Plusequals test for += 100 -= 100 + rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, + + // A set of RE's that can match strings and generate color tuples. + stringParsers = [ { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ], + execResult[ 3 ], + execResult[ 4 ] + ]; + } + }, { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ] * 2.55, + execResult[ 2 ] * 2.55, + execResult[ 3 ] * 2.55, + execResult[ 4 ] + ]; + } + }, { + + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ], 16 ) + ]; + } + }, { + + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) + ]; + } + }, { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: "hsla", + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ] / 100, + execResult[ 3 ] / 100, + execResult[ 4 ] + ]; + } + } ], + + // JQuery.Color( ) + color = jQuery.Color = function( color, green, blue, alpha ) { + return new jQuery.Color.fn.parse( color, green, blue, alpha ); + }, + spaces = { + rgba: { + props: { + red: { + idx: 0, + type: "byte" + }, + green: { + idx: 1, + type: "byte" + }, + blue: { + idx: 2, + type: "byte" + } + } + }, + + hsla: { + props: { + hue: { + idx: 0, + type: "degrees" + }, + saturation: { + idx: 1, + type: "percent" + }, + lightness: { + idx: 2, + type: "percent" + } + } + } + }, + propTypes = { + "byte": { + floor: true, + max: 255 + }, + "percent": { + max: 1 + }, + "degrees": { + mod: 360, + floor: true + } + }, + support = color.support = {}, + + // Element for support tests + supportElem = jQuery( "

" )[ 0 ], + + // Colors = jQuery.Color.names + colors, + + // Local aliases of functions called often + each = jQuery.each; + +// Determine rgba support immediately +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; + +// Define cache name and alpha properties +// for rgba and hsla spaces +each( spaces, function( spaceName, space ) { + space.cache = "_" + spaceName; + space.props.alpha = { + idx: 3, + type: "percent", + def: 1 + }; +} ); + +function clamp( value, prop, allowEmpty ) { + var type = propTypes[ prop.type ] || {}; + + if ( value == null ) { + return ( allowEmpty || !prop.def ) ? null : prop.def; + } + + // ~~ is an short way of doing floor for positive numbers + value = type.floor ? ~~value : parseFloat( value ); + + // IE will pass in empty strings as value for alpha, + // which will hit this case + if ( isNaN( value ) ) { + return prop.def; + } + + if ( type.mod ) { + + // We add mod before modding to make sure that negatives values + // get converted properly: -10 -> 350 + return ( value + type.mod ) % type.mod; + } + + // For now all property types without mod have min and max + return 0 > value ? 0 : type.max < value ? type.max : value; +} + +function stringParse( string ) { + var inst = color(), + rgba = inst._rgba = []; + + string = string.toLowerCase(); + + each( stringParsers, function( i, parser ) { + var parsed, + match = parser.re.exec( string ), + values = match && parser.parse( match ), + spaceName = parser.space || "rgba"; + + if ( values ) { + parsed = inst[ spaceName ]( values ); + + // If this was an rgba parse the assignment might happen twice + // oh well.... + inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; + rgba = inst._rgba = parsed._rgba; + + // Exit each( stringParsers ) here because we matched + return false; + } + } ); + + // Found a stringParser that handled it + if ( rgba.length ) { + + // If this came from a parsed string, force "transparent" when alpha is 0 + // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) + if ( rgba.join() === "0,0,0,0" ) { + jQuery.extend( rgba, colors.transparent ); + } + return inst; + } + + // Named colors + return colors[ string ]; +} + +color.fn = jQuery.extend( color.prototype, { + parse: function( red, green, blue, alpha ) { + if ( red === undefined ) { + this._rgba = [ null, null, null, null ]; + return this; + } + if ( red.jquery || red.nodeType ) { + red = jQuery( red ).css( green ); + green = undefined; + } + + var inst = this, + type = jQuery.type( red ), + rgba = this._rgba = []; + + // More than 1 argument specified - assume ( red, green, blue, alpha ) + if ( green !== undefined ) { + red = [ red, green, blue, alpha ]; + type = "array"; + } + + if ( type === "string" ) { + return this.parse( stringParse( red ) || colors._default ); + } + + if ( type === "array" ) { + each( spaces.rgba.props, function( key, prop ) { + rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); + } ); + return this; + } + + if ( type === "object" ) { + if ( red instanceof color ) { + each( spaces, function( spaceName, space ) { + if ( red[ space.cache ] ) { + inst[ space.cache ] = red[ space.cache ].slice(); + } + } ); + } else { + each( spaces, function( spaceName, space ) { + var cache = space.cache; + each( space.props, function( key, prop ) { + + // If the cache doesn't exist, and we know how to convert + if ( !inst[ cache ] && space.to ) { + + // If the value was null, we don't need to copy it + // if the key was alpha, we don't need to copy it either + if ( key === "alpha" || red[ key ] == null ) { + return; + } + inst[ cache ] = space.to( inst._rgba ); + } + + // This is the only case where we allow nulls for ALL properties. + // call clamp with alwaysAllowEmpty + inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); + } ); + + // Everything defined but alpha? + if ( inst[ cache ] && + jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { + + // Use the default of 1 + inst[ cache ][ 3 ] = 1; + if ( space.from ) { + inst._rgba = space.from( inst[ cache ] ); + } + } + } ); + } + return this; + } + }, + is: function( compare ) { + var is = color( compare ), + same = true, + inst = this; + + each( spaces, function( _, space ) { + var localCache, + isCache = is[ space.cache ]; + if ( isCache ) { + localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; + each( space.props, function( _, prop ) { + if ( isCache[ prop.idx ] != null ) { + same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); + return same; + } + } ); + } + return same; + } ); + return same; + }, + _space: function() { + var used = [], + inst = this; + each( spaces, function( spaceName, space ) { + if ( inst[ space.cache ] ) { + used.push( spaceName ); + } + } ); + return used.pop(); + }, + transition: function( other, distance ) { + var end = color( other ), + spaceName = end._space(), + space = spaces[ spaceName ], + startColor = this.alpha() === 0 ? color( "transparent" ) : this, + start = startColor[ space.cache ] || space.to( startColor._rgba ), + result = start.slice(); + + end = end[ space.cache ]; + each( space.props, function( key, prop ) { + var index = prop.idx, + startValue = start[ index ], + endValue = end[ index ], + type = propTypes[ prop.type ] || {}; + + // If null, don't override start value + if ( endValue === null ) { + return; + } + + // If null - use end + if ( startValue === null ) { + result[ index ] = endValue; + } else { + if ( type.mod ) { + if ( endValue - startValue > type.mod / 2 ) { + startValue += type.mod; + } else if ( startValue - endValue > type.mod / 2 ) { + startValue -= type.mod; + } + } + result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); + } + } ); + return this[ spaceName ]( result ); + }, + blend: function( opaque ) { + + // If we are already opaque - return ourself + if ( this._rgba[ 3 ] === 1 ) { + return this; + } + + var rgb = this._rgba.slice(), + a = rgb.pop(), + blend = color( opaque )._rgba; + + return color( jQuery.map( rgb, function( v, i ) { + return ( 1 - a ) * blend[ i ] + a * v; + } ) ); + }, + toRgbaString: function() { + var prefix = "rgba(", + rgba = jQuery.map( this._rgba, function( v, i ) { + return v == null ? ( i > 2 ? 1 : 0 ) : v; + } ); + + if ( rgba[ 3 ] === 1 ) { + rgba.pop(); + prefix = "rgb("; + } + + return prefix + rgba.join() + ")"; + }, + toHslaString: function() { + var prefix = "hsla(", + hsla = jQuery.map( this.hsla(), function( v, i ) { + if ( v == null ) { + v = i > 2 ? 1 : 0; + } + + // Catch 1 and 2 + if ( i && i < 3 ) { + v = Math.round( v * 100 ) + "%"; + } + return v; + } ); + + if ( hsla[ 3 ] === 1 ) { + hsla.pop(); + prefix = "hsl("; + } + return prefix + hsla.join() + ")"; + }, + toHexString: function( includeAlpha ) { + var rgba = this._rgba.slice(), + alpha = rgba.pop(); + + if ( includeAlpha ) { + rgba.push( ~~( alpha * 255 ) ); + } + + return "#" + jQuery.map( rgba, function( v ) { + + // Default to 0 when nulls exist + v = ( v || 0 ).toString( 16 ); + return v.length === 1 ? "0" + v : v; + } ).join( "" ); + }, + toString: function() { + return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); + } +} ); +color.fn.parse.prototype = color.fn; + +// Hsla conversions adapted from: +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 + +function hue2rgb( p, q, h ) { + h = ( h + 1 ) % 1; + if ( h * 6 < 1 ) { + return p + ( q - p ) * h * 6; + } + if ( h * 2 < 1 ) { + return q; + } + if ( h * 3 < 2 ) { + return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; + } + return p; +} + +spaces.hsla.to = function( rgba ) { + if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { + return [ null, null, null, rgba[ 3 ] ]; + } + var r = rgba[ 0 ] / 255, + g = rgba[ 1 ] / 255, + b = rgba[ 2 ] / 255, + a = rgba[ 3 ], + max = Math.max( r, g, b ), + min = Math.min( r, g, b ), + diff = max - min, + add = max + min, + l = add * 0.5, + h, s; + + if ( min === max ) { + h = 0; + } else if ( r === max ) { + h = ( 60 * ( g - b ) / diff ) + 360; + } else if ( g === max ) { + h = ( 60 * ( b - r ) / diff ) + 120; + } else { + h = ( 60 * ( r - g ) / diff ) + 240; + } + + // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0% + // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) + if ( diff === 0 ) { + s = 0; + } else if ( l <= 0.5 ) { + s = diff / add; + } else { + s = diff / ( 2 - add ); + } + return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ]; +}; + +spaces.hsla.from = function( hsla ) { + if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { + return [ null, null, null, hsla[ 3 ] ]; + } + var h = hsla[ 0 ] / 360, + s = hsla[ 1 ], + l = hsla[ 2 ], + a = hsla[ 3 ], + q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, + p = 2 * l - q; + + return [ + Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), + Math.round( hue2rgb( p, q, h ) * 255 ), + Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), + a + ]; +}; + +each( spaces, function( spaceName, space ) { + var props = space.props, + cache = space.cache, + to = space.to, + from = space.from; + + // Makes rgba() and hsla() + color.fn[ spaceName ] = function( value ) { + + // Generate a cache for this space if it doesn't exist + if ( to && !this[ cache ] ) { + this[ cache ] = to( this._rgba ); + } + if ( value === undefined ) { + return this[ cache ].slice(); + } + + var ret, + type = jQuery.type( value ), + arr = ( type === "array" || type === "object" ) ? value : arguments, + local = this[ cache ].slice(); + + each( props, function( key, prop ) { + var val = arr[ type === "object" ? key : prop.idx ]; + if ( val == null ) { + val = local[ prop.idx ]; + } + local[ prop.idx ] = clamp( val, prop ); + } ); + + if ( from ) { + ret = color( from( local ) ); + ret[ cache ] = local; + return ret; + } else { + return color( local ); + } + }; + + // Makes red() green() blue() alpha() hue() saturation() lightness() + each( props, function( key, prop ) { + + // Alpha is included in more than one space + if ( color.fn[ key ] ) { + return; + } + color.fn[ key ] = function( value ) { + var vtype = jQuery.type( value ), + fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ), + local = this[ fn ](), + cur = local[ prop.idx ], + match; + + if ( vtype === "undefined" ) { + return cur; + } + + if ( vtype === "function" ) { + value = value.call( this, cur ); + vtype = jQuery.type( value ); + } + if ( value == null && prop.empty ) { + return this; + } + if ( vtype === "string" ) { + match = rplusequals.exec( value ); + if ( match ) { + value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); + } + } + local[ prop.idx ] = value; + return this[ fn ]( local ); + }; + } ); +} ); + +// Add cssHook and .fx.step function for each named hook. +// accept a space separated string of properties +color.hook = function( hook ) { + var hooks = hook.split( " " ); + each( hooks, function( i, hook ) { + jQuery.cssHooks[ hook ] = { + set: function( elem, value ) { + var parsed, curElem, + backgroundColor = ""; + + if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || + ( parsed = stringParse( value ) ) ) ) { + value = color( parsed || value ); + if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { + curElem = hook === "backgroundColor" ? elem.parentNode : elem; + while ( + ( backgroundColor === "" || backgroundColor === "transparent" ) && + curElem && curElem.style + ) { + try { + backgroundColor = jQuery.css( curElem, "backgroundColor" ); + curElem = curElem.parentNode; + } catch ( e ) { + } + } + + value = value.blend( backgroundColor && backgroundColor !== "transparent" ? + backgroundColor : + "_default" ); + } + + value = value.toRgbaString(); + } + try { + elem.style[ hook ] = value; + } catch ( e ) { + + // Wrapped to prevent IE from throwing errors on "invalid" values like + // 'auto' or 'inherit' + } + } + }; + jQuery.fx.step[ hook ] = function( fx ) { + if ( !fx.colorInit ) { + fx.start = color( fx.elem, hook ); + fx.end = color( fx.end ); + fx.colorInit = true; + } + jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); + }; + } ); + +}; + +color.hook( stepHooks ); + +jQuery.cssHooks.borderColor = { + expand: function( value ) { + var expanded = {}; + + each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) { + expanded[ "border" + part + "Color" ] = value; + } ); + return expanded; + } +}; + +// Basic color names only. +// Usage of any of the other color names requires adding yourself or including +// jquery.color.svg-names.js. +colors = jQuery.Color.names = { + + // 4.1. Basic color keywords + aqua: "#00ffff", + black: "#000000", + blue: "#0000ff", + fuchsia: "#ff00ff", + gray: "#808080", + green: "#008000", + lime: "#00ff00", + maroon: "#800000", + navy: "#000080", + olive: "#808000", + purple: "#800080", + red: "#ff0000", + silver: "#c0c0c0", + teal: "#008080", + white: "#ffffff", + yellow: "#ffff00", + + // 4.2.3. "transparent" color keyword + transparent: [ null, null, null, 0 ], + + _default: "#ffffff" +}; + +} )( jQuery ); + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ +( function() { + +var classAnimationActions = [ "add", "remove", "toggle" ], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +$.each( + [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], + function( _, prop ) { + $.fx.step[ prop ] = function( fx ) { + if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { + jQuery.style( fx.elem, prop, fx.end ); + fx.setAttr = true; + } + }; + } +); + +function getElementStyles( elem ) { + var key, len, + style = elem.ownerDocument.defaultView ? + elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : + elem.currentStyle, + styles = {}; + + if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { + len = style.length; + while ( len-- ) { + key = style[ len ]; + if ( typeof style[ key ] === "string" ) { + styles[ $.camelCase( key ) ] = style[ key ]; + } + } + + // Support: Opera, IE <9 + } else { + for ( key in style ) { + if ( typeof style[ key ] === "string" ) { + styles[ key ] = style[ key ]; + } + } + } + + return styles; +} + +function styleDifference( oldStyle, newStyle ) { + var diff = {}, + name, value; + + for ( name in newStyle ) { + value = newStyle[ name ]; + if ( oldStyle[ name ] !== value ) { + if ( !shorthandStyles[ name ] ) { + if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { + diff[ name ] = value; + } + } + } + } + + return diff; +} + +// Support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +$.effects.animateClass = function( value, duration, easing, callback ) { + var o = $.speed( duration, easing, callback ); + + return this.queue( function() { + var animated = $( this ), + baseClass = animated.attr( "class" ) || "", + applyClassChange, + allAnimations = o.children ? animated.find( "*" ).addBack() : animated; + + // Map the animated objects to store the original styles. + allAnimations = allAnimations.map( function() { + var el = $( this ); + return { + el: el, + start: getElementStyles( this ) + }; + } ); + + // Apply class change + applyClassChange = function() { + $.each( classAnimationActions, function( i, action ) { + if ( value[ action ] ) { + animated[ action + "Class" ]( value[ action ] ); + } + } ); + }; + applyClassChange(); + + // Map all animated objects again - calculate new styles and diff + allAnimations = allAnimations.map( function() { + this.end = getElementStyles( this.el[ 0 ] ); + this.diff = styleDifference( this.start, this.end ); + return this; + } ); + + // Apply original class + animated.attr( "class", baseClass ); + + // Map all animated objects again - this time collecting a promise + allAnimations = allAnimations.map( function() { + var styleInfo = this, + dfd = $.Deferred(), + opts = $.extend( {}, o, { + queue: false, + complete: function() { + dfd.resolve( styleInfo ); + } + } ); + + this.el.animate( this.diff, opts ); + return dfd.promise(); + } ); + + // Once all animations have completed: + $.when.apply( $, allAnimations.get() ).done( function() { + + // Set the final class + applyClassChange(); + + // For each animated element, + // clear all css properties that were animated + $.each( arguments, function() { + var el = this.el; + $.each( this.diff, function( key ) { + el.css( key, "" ); + } ); + } ); + + // This is guarnteed to be there if you use jQuery.speed() + // it also handles dequeuing the next anim... + o.complete.call( animated[ 0 ] ); + } ); + } ); +}; + +$.fn.extend( { + addClass: ( function( orig ) { + return function( classNames, speed, easing, callback ) { + return speed ? + $.effects.animateClass.call( this, + { add: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + } )( $.fn.addClass ), + + removeClass: ( function( orig ) { + return function( classNames, speed, easing, callback ) { + return arguments.length > 1 ? + $.effects.animateClass.call( this, + { remove: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + } )( $.fn.removeClass ), + + toggleClass: ( function( orig ) { + return function( classNames, force, speed, easing, callback ) { + if ( typeof force === "boolean" || force === undefined ) { + if ( !speed ) { + + // Without speed parameter + return orig.apply( this, arguments ); + } else { + return $.effects.animateClass.call( this, + ( force ? { add: classNames } : { remove: classNames } ), + speed, easing, callback ); + } + } else { + + // Without force parameter + return $.effects.animateClass.call( this, + { toggle: classNames }, force, speed, easing ); + } + }; + } )( $.fn.toggleClass ), + + switchClass: function( remove, add, speed, easing, callback ) { + return $.effects.animateClass.call( this, { + add: add, + remove: remove + }, speed, easing, callback ); + } +} ); + +} )(); + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +( function() { + +if ( $.expr && $.expr.filters && $.expr.filters.animated ) { + $.expr.filters.animated = ( function( orig ) { + return function( elem ) { + return !!$( elem ).data( dataSpaceAnimated ) || orig( elem ); + }; + } )( $.expr.filters.animated ); +} + +if ( $.uiBackCompat !== false ) { + $.extend( $.effects, { + + // Saves a set of properties in a data storage + save: function( element, set ) { + var i = 0, length = set.length; + for ( ; i < length; i++ ) { + if ( set[ i ] !== null ) { + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function( element, set ) { + var val, i = 0, length = set.length; + for ( ; i < length; i++ ) { + if ( set[ i ] !== null ) { + val = element.data( dataSpace + set[ i ] ); + element.css( set[ i ], val ); + } + } + }, + + setMode: function( el, mode ) { + if ( mode === "toggle" ) { + mode = el.is( ":hidden" ) ? "show" : "hide"; + } + return mode; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function( element ) { + + // If the element is already wrapped, return it + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + return element.parent(); + } + + // Wrap the element + var props = { + width: element.outerWidth( true ), + height: element.outerHeight( true ), + "float": element.css( "float" ) + }, + wrapper = $( "

" ) + .addClass( "ui-effects-wrapper" ) + .css( { + fontSize: "100%", + background: "transparent", + border: "none", + margin: 0, + padding: 0 + } ), + + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement; + + // Support: Firefox + // Firefox incorrectly exposes anonymous content + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 + try { + active.id; + } catch ( e ) { + active = document.body; + } + + element.wrap( wrapper ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).trigger( "focus" ); + } + + // Hotfix for jQuery 1.4 since some change in wrap() seems to actually + // lose the reference to the wrapped element + wrapper = element.parent(); + + // Transfer positioning properties to the wrapper + if ( element.css( "position" ) === "static" ) { + wrapper.css( { position: "relative" } ); + element.css( { position: "relative" } ); + } else { + $.extend( props, { + position: element.css( "position" ), + zIndex: element.css( "z-index" ) + } ); + $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) { + props[ pos ] = element.css( pos ); + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { + props[ pos ] = "auto"; + } + } ); + element.css( { + position: "relative", + top: 0, + left: 0, + right: "auto", + bottom: "auto" + } ); + } + element.css( size ); + + return wrapper.css( props ).show(); + }, + + removeWrapper: function( element ) { + var active = document.activeElement; + + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + element.parent().replaceWith( element ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).trigger( "focus" ); + } + } + + return element; + } + } ); +} + +$.extend( $.effects, { + version: "1.12.1", + + define: function( name, mode, effect ) { + if ( !effect ) { + effect = mode; + mode = "effect"; + } + + $.effects.effect[ name ] = effect; + $.effects.effect[ name ].mode = mode; + + return effect; + }, + + scaledDimensions: function( element, percent, direction ) { + if ( percent === 0 ) { + return { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0 + }; + } + + var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1, + y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1; + + return { + height: element.height() * y, + width: element.width() * x, + outerHeight: element.outerHeight() * y, + outerWidth: element.outerWidth() * x + }; + + }, + + clipToBox: function( animation ) { + return { + width: animation.clip.right - animation.clip.left, + height: animation.clip.bottom - animation.clip.top, + left: animation.clip.left, + top: animation.clip.top + }; + }, + + // Injects recently queued functions to be first in line (after "inprogress") + unshift: function( element, queueLength, count ) { + var queue = element.queue(); + + if ( queueLength > 1 ) { + queue.splice.apply( queue, + [ 1, 0 ].concat( queue.splice( queueLength, count ) ) ); + } + element.dequeue(); + }, + + saveStyle: function( element ) { + element.data( dataSpaceStyle, element[ 0 ].style.cssText ); + }, + + restoreStyle: function( element ) { + element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || ""; + element.removeData( dataSpaceStyle ); + }, + + mode: function( element, mode ) { + var hidden = element.is( ":hidden" ); + + if ( mode === "toggle" ) { + mode = hidden ? "show" : "hide"; + } + if ( hidden ? mode === "hide" : mode === "show" ) { + mode = "none"; + } + return mode; + }, + + // Translates a [top,left] array into a baseline value + getBaseline: function( origin, original ) { + var y, x; + + switch ( origin[ 0 ] ) { + case "top": + y = 0; + break; + case "middle": + y = 0.5; + break; + case "bottom": + y = 1; + break; + default: + y = origin[ 0 ] / original.height; + } + + switch ( origin[ 1 ] ) { + case "left": + x = 0; + break; + case "center": + x = 0.5; + break; + case "right": + x = 1; + break; + default: + x = origin[ 1 ] / original.width; + } + + return { + x: x, + y: y + }; + }, + + // Creates a placeholder element so that the original element can be made absolute + createPlaceholder: function( element ) { + var placeholder, + cssPosition = element.css( "position" ), + position = element.position(); + + // Lock in margins first to account for form elements, which + // will change margin if you explicitly set height + // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 + // Support: Safari + element.css( { + marginTop: element.css( "marginTop" ), + marginBottom: element.css( "marginBottom" ), + marginLeft: element.css( "marginLeft" ), + marginRight: element.css( "marginRight" ) + } ) + .outerWidth( element.outerWidth() ) + .outerHeight( element.outerHeight() ); + + if ( /^(static|relative)/.test( cssPosition ) ) { + cssPosition = "absolute"; + + placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( { + + // Convert inline to inline block to account for inline elements + // that turn to inline block based on content (like img) + display: /^(inline|ruby)/.test( element.css( "display" ) ) ? + "inline-block" : + "block", + visibility: "hidden", + + // Margins need to be set to account for margin collapse + marginTop: element.css( "marginTop" ), + marginBottom: element.css( "marginBottom" ), + marginLeft: element.css( "marginLeft" ), + marginRight: element.css( "marginRight" ), + "float": element.css( "float" ) + } ) + .outerWidth( element.outerWidth() ) + .outerHeight( element.outerHeight() ) + .addClass( "ui-effects-placeholder" ); + + element.data( dataSpace + "placeholder", placeholder ); + } + + element.css( { + position: cssPosition, + left: position.left, + top: position.top + } ); + + return placeholder; + }, + + removePlaceholder: function( element ) { + var dataKey = dataSpace + "placeholder", + placeholder = element.data( dataKey ); + + if ( placeholder ) { + placeholder.remove(); + element.removeData( dataKey ); + } + }, + + // Removes a placeholder if it exists and restores + // properties that were modified during placeholder creation + cleanUp: function( element ) { + $.effects.restoreStyle( element ); + $.effects.removePlaceholder( element ); + }, + + setTransition: function( element, list, factor, value ) { + value = value || {}; + $.each( list, function( i, x ) { + var unit = element.cssUnit( x ); + if ( unit[ 0 ] > 0 ) { + value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; + } + } ); + return value; + } +} ); + +// Return an effect options object for the given parameters: +function _normalizeArguments( effect, options, speed, callback ) { + + // Allow passing all options as the first parameter + if ( $.isPlainObject( effect ) ) { + options = effect; + effect = effect.effect; + } + + // Convert to an object + effect = { effect: effect }; + + // Catch (effect, null, ...) + if ( options == null ) { + options = {}; + } + + // Catch (effect, callback) + if ( $.isFunction( options ) ) { + callback = options; + speed = null; + options = {}; + } + + // Catch (effect, speed, ?) + if ( typeof options === "number" || $.fx.speeds[ options ] ) { + callback = speed; + speed = options; + options = {}; + } + + // Catch (effect, options, callback) + if ( $.isFunction( speed ) ) { + callback = speed; + speed = null; + } + + // Add options to effect + if ( options ) { + $.extend( effect, options ); + } + + speed = speed || options.duration; + effect.duration = $.fx.off ? 0 : + typeof speed === "number" ? speed : + speed in $.fx.speeds ? $.fx.speeds[ speed ] : + $.fx.speeds._default; + + effect.complete = callback || options.complete; + + return effect; +} + +function standardAnimationOption( option ) { + + // Valid standard speeds (nothing, number, named speed) + if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { + return true; + } + + // Invalid strings - treat as "normal" speed + if ( typeof option === "string" && !$.effects.effect[ option ] ) { + return true; + } + + // Complete callback + if ( $.isFunction( option ) ) { + return true; + } + + // Options hash (but not naming an effect) + if ( typeof option === "object" && !option.effect ) { + return true; + } + + // Didn't match any standard API + return false; +} + +$.fn.extend( { + effect: function( /* effect, options, speed, callback */ ) { + var args = _normalizeArguments.apply( this, arguments ), + effectMethod = $.effects.effect[ args.effect ], + defaultMode = effectMethod.mode, + queue = args.queue, + queueName = queue || "fx", + complete = args.complete, + mode = args.mode, + modes = [], + prefilter = function( next ) { + var el = $( this ), + normalizedMode = $.effects.mode( el, mode ) || defaultMode; + + // Sentinel for duck-punching the :animated psuedo-selector + el.data( dataSpaceAnimated, true ); + + // Save effect mode for later use, + // we can't just call $.effects.mode again later, + // as the .show() below destroys the initial state + modes.push( normalizedMode ); + + // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13 + if ( defaultMode && ( normalizedMode === "show" || + ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) { + el.show(); + } + + if ( !defaultMode || normalizedMode !== "none" ) { + $.effects.saveStyle( el ); + } + + if ( $.isFunction( next ) ) { + next(); + } + }; + + if ( $.fx.off || !effectMethod ) { + + // Delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args.duration, complete ); + } else { + return this.each( function() { + if ( complete ) { + complete.call( this ); + } + } ); + } + } + + function run( next ) { + var elem = $( this ); + + function cleanup() { + elem.removeData( dataSpaceAnimated ); + + $.effects.cleanUp( elem ); + + if ( args.mode === "hide" ) { + elem.hide(); + } + + done(); + } + + function done() { + if ( $.isFunction( complete ) ) { + complete.call( elem[ 0 ] ); + } + + if ( $.isFunction( next ) ) { + next(); + } + } + + // Override mode option on a per element basis, + // as toggle can be either show or hide depending on element state + args.mode = modes.shift(); + + if ( $.uiBackCompat !== false && !defaultMode ) { + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { + + // Call the core method to track "olddisplay" properly + elem[ mode ](); + done(); + } else { + effectMethod.call( elem[ 0 ], args, done ); + } + } else { + if ( args.mode === "none" ) { + + // Call the core method to track "olddisplay" properly + elem[ mode ](); + done(); + } else { + effectMethod.call( elem[ 0 ], args, cleanup ); + } + } + } + + // Run prefilter on all elements first to ensure that + // any showing or hiding happens before placeholder creation, + // which ensures that any layout changes are correctly captured. + return queue === false ? + this.each( prefilter ).each( run ) : + this.queue( queueName, prefilter ).queue( queueName, run ); + }, + + show: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "show"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.show ), + + hide: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "hide"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.hide ), + + toggle: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) || typeof option === "boolean" ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "toggle"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.toggle ), + + cssUnit: function( key ) { + var style = this.css( key ), + val = []; + + $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { + if ( style.indexOf( unit ) > 0 ) { + val = [ parseFloat( style ), unit ]; + } + } ); + return val; + }, + + cssClip: function( clipObj ) { + if ( clipObj ) { + return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " + + clipObj.bottom + "px " + clipObj.left + "px)" ); + } + return parseClip( this.css( "clip" ), this ); + }, + + transfer: function( options, done ) { + var element = $( this ), + target = $( options.to ), + targetFixed = target.css( "position" ) === "fixed", + body = $( "body" ), + fixTop = targetFixed ? body.scrollTop() : 0, + fixLeft = targetFixed ? body.scrollLeft() : 0, + endPosition = target.offset(), + animation = { + top: endPosition.top - fixTop, + left: endPosition.left - fixLeft, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = element.offset(), + transfer = $( "
" ) + .appendTo( "body" ) + .addClass( options.className ) + .css( { + top: startPosition.top - fixTop, + left: startPosition.left - fixLeft, + height: element.innerHeight(), + width: element.innerWidth(), + position: targetFixed ? "fixed" : "absolute" + } ) + .animate( animation, options.duration, options.easing, function() { + transfer.remove(); + if ( $.isFunction( done ) ) { + done(); + } + } ); + } +} ); + +function parseClip( str, element ) { + var outerWidth = element.outerWidth(), + outerHeight = element.outerHeight(), + clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, + values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ]; + + return { + top: parseFloat( values[ 1 ] ) || 0, + right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ), + bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ), + left: parseFloat( values[ 4 ] ) || 0 + }; +} + +$.fx.step.clip = function( fx ) { + if ( !fx.clipInit ) { + fx.start = $( fx.elem ).cssClip(); + if ( typeof fx.end === "string" ) { + fx.end = parseClip( fx.end, fx.elem ); + } + fx.clipInit = true; + } + + $( fx.elem ).cssClip( { + top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top, + right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right, + bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom, + left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left + } ); +}; + +} )(); + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +( function() { + +// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing) + +var baseEasings = {}; + +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { + baseEasings[ name ] = function( p ) { + return Math.pow( p, i + 2 ); + }; +} ); + +$.extend( baseEasings, { + Sine: function( p ) { + return 1 - Math.cos( p * Math.PI / 2 ); + }, + Circ: function( p ) { + return 1 - Math.sqrt( 1 - p * p ); + }, + Elastic: function( p ) { + return p === 0 || p === 1 ? p : + -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 ); + }, + Back: function( p ) { + return p * p * ( 3 * p - 2 ); + }, + Bounce: function( p ) { + var pow2, + bounce = 4; + + while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} + return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); + } +} ); + +$.each( baseEasings, function( name, easeIn ) { + $.easing[ "easeIn" + name ] = easeIn; + $.easing[ "easeOut" + name ] = function( p ) { + return 1 - easeIn( 1 - p ); + }; + $.easing[ "easeInOut" + name ] = function( p ) { + return p < 0.5 ? + easeIn( p * 2 ) / 2 : + 1 - easeIn( p * -2 + 2 ) / 2; + }; +} ); + +} )(); + +var effect = $.effects; + + +/*! + * jQuery UI Effects Blind 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Blind Effect +//>>group: Effects +//>>description: Blinds the element. +//>>docs: http://api.jqueryui.com/blind-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) { + var map = { + up: [ "bottom", "top" ], + vertical: [ "bottom", "top" ], + down: [ "top", "bottom" ], + left: [ "right", "left" ], + horizontal: [ "right", "left" ], + right: [ "left", "right" ] + }, + element = $( this ), + direction = options.direction || "up", + start = element.cssClip(), + animate = { clip: $.extend( {}, start ) }, + placeholder = $.effects.createPlaceholder( element ); + + animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ]; + + if ( options.mode === "show" ) { + element.cssClip( animate.clip ); + if ( placeholder ) { + placeholder.css( $.effects.clipToBox( animate ) ); + } + + animate.clip = start; + } + + if ( placeholder ) { + placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing ); + } + + element.animate( animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Bounce 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Bounce Effect +//>>group: Effects +//>>description: Bounces an element horizontally or vertically n times. +//>>docs: http://api.jqueryui.com/bounce-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) { + var upAnim, downAnim, refValue, + element = $( this ), + + // Defaults: + mode = options.mode, + hide = mode === "hide", + show = mode === "show", + direction = options.direction || "up", + distance = options.distance, + times = options.times || 5, + + // Number of internal animations + anims = times * 2 + ( show || hide ? 1 : 0 ), + speed = options.duration / anims, + easing = options.easing, + + // Utility: + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ), + i = 0, + + queuelen = element.queue().length; + + $.effects.createPlaceholder( element ); + + refValue = element.css( ref ); + + // Default distance for the BIGGEST bounce is the outer Distance / 3 + if ( !distance ) { + distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; + } + + if ( show ) { + downAnim = { opacity: 1 }; + downAnim[ ref ] = refValue; + + // If we are showing, force opacity 0 and set the initial position + // then do the "first" animation + element + .css( "opacity", 0 ) + .css( ref, motion ? -distance * 2 : distance * 2 ) + .animate( downAnim, speed, easing ); + } + + // Start at the smallest distance if we are hiding + if ( hide ) { + distance = distance / Math.pow( 2, times - 1 ); + } + + downAnim = {}; + downAnim[ ref ] = refValue; + + // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here + for ( ; i < times; i++ ) { + upAnim = {}; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + element + .animate( upAnim, speed, easing ) + .animate( downAnim, speed, easing ); + + distance = hide ? distance * 2 : distance / 2; + } + + // Last Bounce when Hiding + if ( hide ) { + upAnim = { opacity: 0 }; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + element.animate( upAnim, speed, easing ); + } + + element.queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Clip 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Clip Effect +//>>group: Effects +//>>description: Clips the element on and off like an old TV. +//>>docs: http://api.jqueryui.com/clip-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) { + var start, + animate = {}, + element = $( this ), + direction = options.direction || "vertical", + both = direction === "both", + horizontal = both || direction === "horizontal", + vertical = both || direction === "vertical"; + + start = element.cssClip(); + animate.clip = { + top: vertical ? ( start.bottom - start.top ) / 2 : start.top, + right: horizontal ? ( start.right - start.left ) / 2 : start.right, + bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom, + left: horizontal ? ( start.right - start.left ) / 2 : start.left + }; + + $.effects.createPlaceholder( element ); + + if ( options.mode === "show" ) { + element.cssClip( animate.clip ); + animate.clip = start; + } + + element.animate( animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); + +} ); + + +/*! + * jQuery UI Effects Drop 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Drop Effect +//>>group: Effects +//>>description: Moves an element in one direction and hides it at the same time. +//>>docs: http://api.jqueryui.com/drop-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) { + + var distance, + element = $( this ), + mode = options.mode, + show = mode === "show", + direction = options.direction || "left", + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=", + oppositeMotion = ( motion === "+=" ) ? "-=" : "+=", + animation = { + opacity: 0 + }; + + $.effects.createPlaceholder( element ); + + distance = options.distance || + element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; + + animation[ ref ] = motion + distance; + + if ( show ) { + element.css( animation ); + + animation[ ref ] = oppositeMotion + distance; + animation.opacity = 1; + } + + // Animate + element.animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Explode 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Explode Effect +//>>group: Effects +// jscs:disable maximumLineLength +//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/explode-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) { + + var i, j, left, top, mx, my, + rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3, + cells = rows, + element = $( this ), + mode = options.mode, + show = mode === "show", + + // Show and then visibility:hidden the element before calculating offset + offset = element.show().css( "visibility", "hidden" ).offset(), + + // Width and height of a piece + width = Math.ceil( element.outerWidth() / cells ), + height = Math.ceil( element.outerHeight() / rows ), + pieces = []; + + // Children animate complete: + function childComplete() { + pieces.push( this ); + if ( pieces.length === rows * cells ) { + animComplete(); + } + } + + // Clone the element for each row and cell. + for ( i = 0; i < rows; i++ ) { // ===> + top = offset.top + i * height; + my = i - ( rows - 1 ) / 2; + + for ( j = 0; j < cells; j++ ) { // ||| + left = offset.left + j * width; + mx = j - ( cells - 1 ) / 2; + + // Create a clone of the now hidden main element that will be absolute positioned + // within a wrapper div off the -left and -top equal to size of our pieces + element + .clone() + .appendTo( "body" ) + .wrap( "
" ) + .css( { + position: "absolute", + visibility: "visible", + left: -j * width, + top: -i * height + } ) + + // Select the wrapper - make it overflow: hidden and absolute positioned based on + // where the original was located +left and +top equal to the size of pieces + .parent() + .addClass( "ui-effects-explode" ) + .css( { + position: "absolute", + overflow: "hidden", + width: width, + height: height, + left: left + ( show ? mx * width : 0 ), + top: top + ( show ? my * height : 0 ), + opacity: show ? 0 : 1 + } ) + .animate( { + left: left + ( show ? 0 : mx * width ), + top: top + ( show ? 0 : my * height ), + opacity: show ? 1 : 0 + }, options.duration || 500, options.easing, childComplete ); + } + } + + function animComplete() { + element.css( { + visibility: "visible" + } ); + $( pieces ).remove(); + done(); + } +} ); + + +/*! + * jQuery UI Effects Fade 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Fade Effect +//>>group: Effects +//>>description: Fades the element. +//>>docs: http://api.jqueryui.com/fade-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) { + var show = options.mode === "show"; + + $( this ) + .css( "opacity", show ? 0 : 1 ) + .animate( { + opacity: show ? 1 : 0 + }, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Fold 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Fold Effect +//>>group: Effects +//>>description: Folds an element first horizontally and then vertically. +//>>docs: http://api.jqueryui.com/fold-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) { + + // Create element + var element = $( this ), + mode = options.mode, + show = mode === "show", + hide = mode === "hide", + size = options.size || 15, + percent = /([0-9]+)%/.exec( size ), + horizFirst = !!options.horizFirst, + ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ], + duration = options.duration / 2, + + placeholder = $.effects.createPlaceholder( element ), + + start = element.cssClip(), + animation1 = { clip: $.extend( {}, start ) }, + animation2 = { clip: $.extend( {}, start ) }, + + distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ], + + queuelen = element.queue().length; + + if ( percent ) { + size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; + } + animation1.clip[ ref[ 0 ] ] = size; + animation2.clip[ ref[ 0 ] ] = size; + animation2.clip[ ref[ 1 ] ] = 0; + + if ( show ) { + element.cssClip( animation2.clip ); + if ( placeholder ) { + placeholder.css( $.effects.clipToBox( animation2 ) ); + } + + animation2.clip = start; + } + + // Animate + element + .queue( function( next ) { + if ( placeholder ) { + placeholder + .animate( $.effects.clipToBox( animation1 ), duration, options.easing ) + .animate( $.effects.clipToBox( animation2 ), duration, options.easing ); + } + + next(); + } ) + .animate( animation1, duration, options.easing ) + .animate( animation2, duration, options.easing ) + .queue( done ); + + $.effects.unshift( element, queuelen, 4 ); +} ); + + +/*! + * jQuery UI Effects Highlight 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Highlight Effect +//>>group: Effects +//>>description: Highlights the background of an element in a defined color for a custom duration. +//>>docs: http://api.jqueryui.com/highlight-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) { + var element = $( this ), + animation = { + backgroundColor: element.css( "backgroundColor" ) + }; + + if ( options.mode === "hide" ) { + animation.opacity = 0; + } + + $.effects.saveStyle( element ); + + element + .css( { + backgroundImage: "none", + backgroundColor: options.color || "#ffff99" + } ) + .animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Size 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Size Effect +//>>group: Effects +//>>description: Resize an element to a specified width and height. +//>>docs: http://api.jqueryui.com/size-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectSize = $.effects.define( "size", function( options, done ) { + + // Create element + var baseline, factor, temp, + element = $( this ), + + // Copy for children + cProps = [ "fontSize" ], + vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], + hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], + + // Set options + mode = options.mode, + restore = mode !== "effect", + scale = options.scale || "both", + origin = options.origin || [ "middle", "center" ], + position = element.css( "position" ), + pos = element.position(), + original = $.effects.scaledDimensions( element ), + from = options.from || original, + to = options.to || $.effects.scaledDimensions( element, 0 ); + + $.effects.createPlaceholder( element ); + + if ( mode === "show" ) { + temp = from; + from = to; + to = temp; + } + + // Set scaling factor + factor = { + from: { + y: from.height / original.height, + x: from.width / original.width + }, + to: { + y: to.height / original.height, + x: to.width / original.width + } + }; + + // Scale the css box + if ( scale === "box" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + from = $.effects.setTransition( element, vProps, factor.from.y, from ); + to = $.effects.setTransition( element, vProps, factor.to.y, to ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + from = $.effects.setTransition( element, hProps, factor.from.x, from ); + to = $.effects.setTransition( element, hProps, factor.to.x, to ); + } + } + + // Scale the content + if ( scale === "content" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + from = $.effects.setTransition( element, cProps, factor.from.y, from ); + to = $.effects.setTransition( element, cProps, factor.to.y, to ); + } + } + + // Adjust the position properties based on the provided origin points + if ( origin ) { + baseline = $.effects.getBaseline( origin, original ); + from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top; + from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left; + to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top; + to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left; + } + element.css( from ); + + // Animate the children if desired + if ( scale === "content" || scale === "both" ) { + + vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps ); + hProps = hProps.concat( [ "marginLeft", "marginRight" ] ); + + // Only animate children with width attributes specified + // TODO: is this right? should we include anything with css width specified as well + element.find( "*[width]" ).each( function() { + var child = $( this ), + childOriginal = $.effects.scaledDimensions( child ), + childFrom = { + height: childOriginal.height * factor.from.y, + width: childOriginal.width * factor.from.x, + outerHeight: childOriginal.outerHeight * factor.from.y, + outerWidth: childOriginal.outerWidth * factor.from.x + }, + childTo = { + height: childOriginal.height * factor.to.y, + width: childOriginal.width * factor.to.x, + outerHeight: childOriginal.height * factor.to.y, + outerWidth: childOriginal.width * factor.to.x + }; + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom ); + childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom ); + childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo ); + } + + if ( restore ) { + $.effects.saveStyle( child ); + } + + // Animate children + child.css( childFrom ); + child.animate( childTo, options.duration, options.easing, function() { + + // Restore children + if ( restore ) { + $.effects.restoreStyle( child ); + } + } ); + } ); + } + + // Animate + element.animate( to, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: function() { + + var offset = element.offset(); + + if ( to.opacity === 0 ) { + element.css( "opacity", from.opacity ); + } + + if ( !restore ) { + element + .css( "position", position === "static" ? "relative" : position ) + .offset( offset ); + + // Need to save style here so that automatic style restoration + // doesn't restore to the original styles from before the animation. + $.effects.saveStyle( element ); + } + + done(); + } + } ); + +} ); + + +/*! + * jQuery UI Effects Scale 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Scale Effect +//>>group: Effects +//>>description: Grows or shrinks an element and its content. +//>>docs: http://api.jqueryui.com/scale-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectScale = $.effects.define( "scale", function( options, done ) { + + // Create element + var el = $( this ), + mode = options.mode, + percent = parseInt( options.percent, 10 ) || + ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ), + + newOptions = $.extend( true, { + from: $.effects.scaledDimensions( el ), + to: $.effects.scaledDimensions( el, percent, options.direction || "both" ), + origin: options.origin || [ "middle", "center" ] + }, options ); + + // Fade option to support puff + if ( options.fade ) { + newOptions.from.opacity = 1; + newOptions.to.opacity = 0; + } + + $.effects.effect.size.call( this, newOptions, done ); +} ); + + +/*! + * jQuery UI Effects Puff 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Puff Effect +//>>group: Effects +//>>description: Creates a puff effect by scaling the element up and hiding it at the same time. +//>>docs: http://api.jqueryui.com/puff-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) { + var newOptions = $.extend( true, {}, options, { + fade: true, + percent: parseInt( options.percent, 10 ) || 150 + } ); + + $.effects.effect.scale.call( this, newOptions, done ); +} ); + + +/*! + * jQuery UI Effects Pulsate 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Pulsate Effect +//>>group: Effects +//>>description: Pulsates an element n times by changing the opacity to zero and back. +//>>docs: http://api.jqueryui.com/pulsate-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) { + var element = $( this ), + mode = options.mode, + show = mode === "show", + hide = mode === "hide", + showhide = show || hide, + + // Showing or hiding leaves off the "last" animation + anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), + duration = options.duration / anims, + animateTo = 0, + i = 1, + queuelen = element.queue().length; + + if ( show || !element.is( ":visible" ) ) { + element.css( "opacity", 0 ).show(); + animateTo = 1; + } + + // Anims - 1 opacity "toggles" + for ( ; i < anims; i++ ) { + element.animate( { opacity: animateTo }, duration, options.easing ); + animateTo = 1 - animateTo; + } + + element.animate( { opacity: animateTo }, duration, options.easing ); + + element.queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Shake 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Shake Effect +//>>group: Effects +//>>description: Shakes an element horizontally or vertically n times. +//>>docs: http://api.jqueryui.com/shake-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectShake = $.effects.define( "shake", function( options, done ) { + + var i = 1, + element = $( this ), + direction = options.direction || "left", + distance = options.distance || 20, + times = options.times || 3, + anims = times * 2 + 1, + speed = Math.round( options.duration / anims ), + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + positiveMotion = ( direction === "up" || direction === "left" ), + animation = {}, + animation1 = {}, + animation2 = {}, + + queuelen = element.queue().length; + + $.effects.createPlaceholder( element ); + + // Animation + animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; + animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; + animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; + + // Animate + element.animate( animation, speed, options.easing ); + + // Shakes + for ( ; i < times; i++ ) { + element + .animate( animation1, speed, options.easing ) + .animate( animation2, speed, options.easing ); + } + + element + .animate( animation1, speed, options.easing ) + .animate( animation, speed / 2, options.easing ) + .queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Slide 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Slide Effect +//>>group: Effects +//>>description: Slides an element in and out of the viewport. +//>>docs: http://api.jqueryui.com/slide-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) { + var startClip, startRef, + element = $( this ), + map = { + up: [ "bottom", "top" ], + down: [ "top", "bottom" ], + left: [ "right", "left" ], + right: [ "left", "right" ] + }, + mode = options.mode, + direction = options.direction || "left", + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + positiveMotion = ( direction === "up" || direction === "left" ), + distance = options.distance || + element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ), + animation = {}; + + $.effects.createPlaceholder( element ); + + startClip = element.cssClip(); + startRef = element.position()[ ref ]; + + // Define hide animation + animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef; + animation.clip = element.cssClip(); + animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ]; + + // Reverse the animation if we're showing + if ( mode === "show" ) { + element.cssClip( animation.clip ); + element.css( ref, animation[ ref ] ); + animation.clip = startClip; + animation[ ref ] = startRef; + } + + // Actually animate + element.animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Transfer 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Transfer Effect +//>>group: Effects +//>>description: Displays a transfer effect from one element to another. +//>>docs: http://api.jqueryui.com/transfer-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effect; +if ( $.uiBackCompat !== false ) { + effect = $.effects.define( "transfer", function( options, done ) { + $( this ).transfer( options, done ); + } ); +} +var effectsEffectTransfer = effect; + + +/*! + * jQuery UI Focusable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :focusable Selector +//>>group: Core +//>>description: Selects elements which can be focused. +//>>docs: http://api.jqueryui.com/focusable-selector/ + + + +// Selectors +$.ui.focusable = function( element, hasTabindex ) { + var map, mapName, img, focusableIfVisible, fieldset, + nodeName = element.nodeName.toLowerCase(); + + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" ); + return img.length > 0 && img.is( ":visible" ); + } + + if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) { + focusableIfVisible = !element.disabled; + + if ( focusableIfVisible ) { + + // Form controls within a disabled fieldset are disabled. + // However, controls within the fieldset's legend do not get disabled. + // Since controls generally aren't placed inside legends, we skip + // this portion of the check. + fieldset = $( element ).closest( "fieldset" )[ 0 ]; + if ( fieldset ) { + focusableIfVisible = !fieldset.disabled; + } + } + } else if ( "a" === nodeName ) { + focusableIfVisible = element.href || hasTabindex; + } else { + focusableIfVisible = hasTabindex; + } + + return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) ); +}; + +// Support: IE 8 only +// IE 8 doesn't resolve inherit to visible/hidden for computed values +function visible( element ) { + var visibility = element.css( "visibility" ); + while ( visibility === "inherit" ) { + element = element.parent(); + visibility = element.css( "visibility" ); + } + return visibility !== "hidden"; +} + +$.extend( $.expr[ ":" ], { + focusable: function( element ) { + return $.ui.focusable( element, $.attr( element, "tabindex" ) != null ); + } +} ); + +var focusable = $.ui.focusable; + + + + +// Support: IE8 Only +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop +// with a string, so we need to find the proper form. +var form = $.fn.form = function() { + return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form ); +}; + + +/*! + * jQuery UI Form Reset Mixin 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Form Reset Mixin +//>>group: Core +//>>description: Refresh input widgets when their form is reset +//>>docs: http://api.jqueryui.com/form-reset-mixin/ + + + +var formResetMixin = $.ui.formResetMixin = { + _formResetHandler: function() { + var form = $( this ); + + // Wait for the form reset to actually happen before refreshing + setTimeout( function() { + var instances = form.data( "ui-form-reset-instances" ); + $.each( instances, function() { + this.refresh(); + } ); + } ); + }, + + _bindFormResetHandler: function() { + this.form = this.element.form(); + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ) || []; + if ( !instances.length ) { + + // We don't use _on() here because we use a single event handler per form + this.form.on( "reset.ui-form-reset", this._formResetHandler ); + } + instances.push( this ); + this.form.data( "ui-form-reset-instances", instances ); + }, + + _unbindFormResetHandler: function() { + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ); + instances.splice( $.inArray( this, instances ), 1 ); + if ( instances.length ) { + this.form.data( "ui-form-reset-instances", instances ); + } else { + this.form + .removeData( "ui-form-reset-instances" ) + .off( "reset.ui-form-reset" ); + } + } +}; + + +/*! + * jQuery UI Support for jQuery core 1.7.x 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + */ + +//>>label: jQuery 1.7 Support +//>>group: Core +//>>description: Support version 1.7.x of jQuery core + + + +// Support: jQuery 1.7 only +// Not a great way to check versions, but since we only support 1.7+ and only +// need to detect <1.8, this is a simple check that should suffice. Checking +// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0 +// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting +// 1.7 anymore). See #11197 for why we're not using feature detection. +if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) { + + // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight() + // Unlike jQuery Core 1.8+, these only support numeric values to set the + // dimensions in pixels + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + } ); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size ) + "px" ); + } ); + }; + + $.fn[ "outer" + name ] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size, true, margin ) + "px" ); + } ); + }; + } ); + + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +; +/*! + * jQuery UI Keycode 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Keycode +//>>group: Core +//>>description: Provide keycodes as keynames +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ + + +var keycode = $.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 +}; + + + + +// Internal use only +var escapeSelector = $.ui.escapeSelector = ( function() { + var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; + return function( selector ) { + return selector.replace( selectorEscape, "\\$1" ); + }; +} )(); + + +/*! + * jQuery UI Labels 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: labels +//>>group: Core +//>>description: Find all the labels associated with a given input +//>>docs: http://api.jqueryui.com/labels/ + + + +var labels = $.fn.labels = function() { + var ancestor, selector, id, labels, ancestors; + + // Check control.labels first + if ( this[ 0 ].labels && this[ 0 ].labels.length ) { + return this.pushStack( this[ 0 ].labels ); + } + + // Support: IE <= 11, FF <= 37, Android <= 2.3 only + // Above browsers do not support control.labels. Everything below is to support them + // as well as document fragments. control.labels does not work on document fragments + labels = this.eq( 0 ).parents( "label" ); + + // Look for the label based on the id + id = this.attr( "id" ); + if ( id ) { + + // We don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.eq( 0 ).parents().last(); + + // Get a full set of top level ancestors + ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() ); + + // Create a selector for the label based on the id + selector = "label[for='" + $.ui.escapeSelector( id ) + "']"; + + labels = labels.add( ancestors.find( selector ).addBack( selector ) ); + + } + + // Return whatever we have found for labels + return this.pushStack( labels ); +}; + + +/*! + * jQuery UI Scroll Parent 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: scrollParent +//>>group: Core +//>>description: Get the closest ancestor element that is scrollable. +//>>docs: http://api.jqueryui.com/scrollParent/ + + + +var scrollParent = $.fn.scrollParent = function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + + parent.css( "overflow-x" ) ); + } ).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? + $( this[ 0 ].ownerDocument || document ) : + scrollParent; +}; + + +/*! + * jQuery UI Tabbable 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :tabbable Selector +//>>group: Core +//>>description: Selects elements which can be tabbed to. +//>>docs: http://api.jqueryui.com/tabbable-selector/ + + + +var tabbable = $.extend( $.expr[ ":" ], { + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + hasTabindex = tabIndex != null; + return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex ); + } +} ); + + +/*! + * jQuery UI Unique ID 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: uniqueId +//>>group: Core +//>>description: Functions to generate and remove uniqueId's +//>>docs: http://api.jqueryui.com/uniqueId/ + + + +var uniqueId = $.fn.extend( { + uniqueId: ( function() { + var uuid = 0; + + return function() { + return this.each( function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + } ); + }; + } )(), + + removeUniqueId: function() { + return this.each( function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + } ); + } +} ); + + +/*! + * jQuery UI Accordion 1.12.1 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Accordion +//>>group: Widgets +// jscs:disable maximumLineLength +//>>description: Displays collapsible content panels for presenting information in a limited amount of space. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/accordion/ +//>>demos: http://jqueryui.com/accordion/ +//>>css.structure: ../../themes/base/core.css +//>>css.structure: ../../themes/base/accordion.css +//>>css.theme: ../../themes/base/theme.css + + + +var widgetsAccordion = $.widget( "ui.accordion", { + version: "1.12.1", + options: { + active: 0, + animate: {}, + classes: { + "ui-accordion-header": "ui-corner-top", + "ui-accordion-header-collapsed": "ui-corner-all", + "ui-accordion-content": "ui-corner-bottom" + }, + collapsible: false, + event: "click", + header: "> li > :first-child, > :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // Callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: "hide", + borderBottomWidth: "hide", + paddingTop: "hide", + paddingBottom: "hide", + height: "hide" + }, + + showProps: { + borderTopWidth: "show", + borderBottomWidth: "show", + paddingTop: "show", + paddingBottom: "show", + height: "show" + }, + + _create: function() { + var options = this.options; + + this.prevShow = this.prevHide = $(); + this._addClass( "ui-accordion", "ui-widget ui-helper-reset" ); + this.element.attr( "role", "tablist" ); + + // Don't allow collapsible: false and active: false / null + if ( !options.collapsible && ( options.active === false || options.active == null ) ) { + options.active = 0; + } + + this._processPanels(); + + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icon, children, + icons = this.options.icons; + + if ( icons ) { + icon = $( "" ); + this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header ); + icon.prependTo( this.headers ); + children = this.active.children( ".ui-accordion-header-icon" ); + this._removeClass( children, icons.header ) + ._addClass( children, null, icons.activeHeader ) + ._addClass( this.headers, "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this._removeClass( this.headers, "ui-accordion-icons" ); + this.headers.children( ".ui-accordion-header-icon" ).remove(); + }, + + _destroy: function() { + var contents; + + // Clean up main element + this.element.removeAttr( "role" ); + + // Clean up headers + this.headers + .removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" ) + .removeUniqueId(); + + this._destroyIcons(); + + // Clean up content panels + contents = this.headers.next() + .css( "display", "" ) + .removeAttr( "role aria-hidden aria-labelledby" ) + .removeUniqueId(); + + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // Setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + }, + + _setOptionDisabled: function( value ) { + this._super( value ); + + this.element.attr( "aria-disabled", value ); + + // Support: IE8 Only + // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + this._toggleClass( null, "ui-state-disabled", !!value ); + this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled", + !!value ); + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + $( toFocus ).trigger( "focus" ); + event.preventDefault(); + } + }, + + _panelKeyDown: function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().trigger( "focus" ); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // Was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || + !this.headers.length ) { + options.active = false; + this.active = $(); + + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + + // all remaining panel are disabled + if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) { + options.active = false; + this.active = $(); + + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + + // was active, active panel still exists + } else { + + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + var prevHeaders = this.headers, + prevPanels = this.panels; + + this.headers = this.element.find( this.options.header ); + this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed", + "ui-state-default" ); + + this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide(); + this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" ); + + // Avoid memory leaks (#10056) + if ( prevPanels ) { + this._off( prevHeaders.not( this.headers ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(); + + this.active = this._findActive( options.active ); + this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" ) + ._removeClass( this.active, "ui-accordion-header-collapsed" ); + this._addClass( this.active.next(), "ui-accordion-content-active" ); + this.active.next().show(); + + this.headers + .attr( "role", "tab" ) + .each( function() { + var header = $( this ), + headerId = header.uniqueId().attr( "id" ), + panel = header.next(), + panelId = panel.uniqueId().attr( "id" ); + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + } ) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr( { + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + } ) + .next() + .attr( { + "aria-hidden": "true" + } ) + .hide(); + + // Make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr( { + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + } ) + .next() + .attr( { + "aria-hidden": "false" + } ); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each( function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + } ); + + this.headers.each( function() { + maxHeight -= $( this ).outerHeight( true ); + } ); + + this.headers.next() + .each( function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + } ) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each( function() { + var isVisible = $( this ).is( ":visible" ); + if ( !isVisible ) { + $( this ).show(); + } + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + if ( !isVisible ) { + $( this ).hide(); + } + } ) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // Trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // Trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler( { + target: active, + currentTarget: active, + preventDefault: $.noop + } ); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split( " " ), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + } ); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" } ); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var activeChildren, clickedChildren, + options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // When the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // Switch classes + // corner classes on the previously active header stay after the animation + this._removeClass( active, "ui-accordion-header-active", "ui-state-active" ); + if ( options.icons ) { + activeChildren = active.children( ".ui-accordion-header-icon" ); + this._removeClass( activeChildren, null, options.icons.activeHeader ) + ._addClass( activeChildren, null, options.icons.header ); + } + + if ( !clickedIsActive ) { + this._removeClass( clicked, "ui-accordion-header-collapsed" ) + ._addClass( clicked, "ui-accordion-header-active", "ui-state-active" ); + if ( options.icons ) { + clickedChildren = clicked.children( ".ui-accordion-header-icon" ); + this._removeClass( clickedChildren, null, options.icons.header ) + ._addClass( clickedChildren, null, options.icons.activeHeader ); + } + + this._addClass( clicked.next(), "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // Handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr( { + "aria-hidden": "true" + } ); + toHide.prev().attr( { + "aria-selected": "false", + "aria-expanded": "false" + } ); + + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr( { + "tabIndex": -1, + "aria-expanded": "false" + } ); + } else if ( toShow.length ) { + this.headers.filter( function() { + return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0; + } ) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr( { + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + } ); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + boxSizing = toShow.css( "box-sizing" ), + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( this.showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( this.hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( this.hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + } ); + toShow + .hide() + .animate( this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + if ( boxSizing === "content-box" ) { + adjust += fx.now; + } + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + } ); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel, + prev = toHide.prev(); + + this._removeClass( toHide, "ui-accordion-content-active" ); + this._removeClass( prev, "ui-accordion-header-active" ) + ._addClass( prev, "ui-accordion-header-collapsed" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; + } + this._trigger( "activate", null, data ); + } +} ); + + + +var safeActiveElement = $.ui.safeActiveElement = function( document ) { + var activeElement; + + // Support: IE 9 only + // IE9 throws an "Unspecified error" accessing document.activeElement from an