pax_global_header00006660000000000000000000000064131573717410014523gustar00rootroot0000000000000052 comment=9a83c3d6344d53d0da69cec0ea9b41ee858f9f75 pgcharts/000077500000000000000000000000001315737174100127025ustar00rootroot00000000000000pgcharts/.gitattributes000066400000000000000000000003161315737174100155750ustar00rootroot00000000000000web/bootstrap-3.1.1-dist/**/* linguist-vendored web/codemirror-4.5/**/* linguist-vendored web/font-awesome-4.2.0/**/* linguist-vendored web/hallo/**/* linguist-vendored web/highcharts/**/* linguist-vendoredpgcharts/Makefile000066400000000000000000000073621315737174100143520ustar00rootroot00000000000000# ql-to-deb build tool APP_NAME = pgcharts # use either sbcl or ccl CL = sbcl SRC = pgcharts.asd \ $(wildcard src/*lisp) \ $(wildcard src/utils/*lisp) \ $(wildcard src/sql/*lisp) \ $(wildcard src/sql/*sql) BUILDDIR = build LIBS = $(BUILDDIR)/libs.stamp QLDIR = $(BUILDDIR)/quicklisp QUICKLISP = $(BUILDDIR)/quicklisp.lisp MANIFEST = $(BUILDDIR)/manifest.ql PGCHARTS = $(BUILDDIR)/bin/$(APP_NAME) BUILDAPP_CCL = $(BUILDDIR)/bin/buildapp.ccl BUILDAPP_SBCL = $(BUILDDIR)/bin/buildapp.sbcl ifeq ($(CL),sbcl) BUILDAPP = $(BUILDAPP_SBCL) CL_OPTS = --no-sysinit --no-userinit else BUILDAPP = $(BUILDAPP_CCL) CL_OPTS = --no-init endif COMPRESS_CORE ?= yes ifeq ($(CL),sbcl) ifeq ($(COMPRESS_CORE),yes) COMPRESS_CORE_OPT = --compress-core else COMPRESS_CORE_OPT = endif endif # ifeq ($(CL),sbcl) # BUILDAPP_OPTS = --require sb-posix # endif DEBUILD_ROOT = /tmp/pgcharts all: $(PGCHARTS) docs: ronn -roff pgcharts.1.md clean: rm -rf $(LIBS) $(QUICKLISP) $(QLDIR) $(MANIFEST) $(BUILDAPP) $(PGCHARTS) $(QLDIR)/setup.lisp: mkdir -p $(BUILDDIR) curl -o $(QUICKLISP) http://beta.quicklisp.org/quicklisp.lisp $(CL) $(CL_OPTS) --load $(QUICKLISP) \ --eval '(quicklisp-quickstart:install :path "$(BUILDDIR)/quicklisp")' \ --eval '(quit)' quicklisp: $(QLDIR)/setup.lisp ; $(LIBS): $(QLDIR)/setup.lisp $(CL) $(CL_OPTS) --load $(QLDIR)/setup.lisp \ --eval '(push "$(CURDIR)/" asdf:*central-registry*)' \ --eval '(ql:quickload "pgcharts")' \ --eval '(quit)' touch $@ libs: $(LIBS) ; $(MANIFEST): $(LIBS) $(CL) $(CL_OPTS) --load $(QLDIR)/setup.lisp \ --eval '(ql:write-asdf-manifest-file "$(MANIFEST)")' \ --eval '(quit)' manifest: $(MANIFEST) ; $(BUILDAPP_CCL): $(QLDIR)/setup.lisp mkdir -p $(BUILDDIR)/bin $(CL) $(CL_OPTS) --load $(QLDIR)/setup.lisp \ --eval '(ql:quickload "buildapp")' \ --eval '(buildapp:build-buildapp "$@")' \ --eval '(quit)' $(BUILDAPP_SBCL): $(QLDIR)/setup.lisp mkdir -p $(BUILDDIR)/bin $(CL) $(CL_OPTS) --load $(QLDIR)/setup.lisp \ --eval '(ql:quickload "buildapp")' \ --eval '(buildapp:build-buildapp "$@")' \ --eval '(quit)' buildapp: $(BUILDAPP) ; $(PGCHARTS): $(MANIFEST) $(BUILDAPP) $(SRC) mkdir -p $(BUILDDIR)/bin $(BUILDAPP) --logfile /tmp/build.log \ $(BUILDAPP_OPTS) \ --sbcl $(CL) \ --require asdf \ --load-system asdf \ --asdf-tree $(QLDIR)/dists \ --asdf-path . \ --load-system $(APP_NAME) \ --load src/image.lisp \ --entry pgcharts:main \ --dynamic-space-size 4096 \ $(COMPRESS_CORE_OPT) \ --output $@ pgcharts: $(PGCHARTS) ; deb: # intended for use on a debian system mkdir -p $(DEBUILD_ROOT) && rm -rf $(DEBUILD_ROOT) rsync -Ca --exclude=build \ --exclude=.vagrant \ --exclude=web/*zip \ ./ $(DEBUILD_ROOT)/ cd $(DEBUILD_ROOT) && make -f debian/rules orig cd $(DEBUILD_ROOT) && debuild -us -uc -sa cp -a /tmp/pgcharts_* build/ pgcharts/README.md000066400000000000000000000075001315737174100141630ustar00rootroot00000000000000# PostgreSQL Charts ## Screen Shots It's intended as a visual project. Here's what it looks like. ### Query editing pane ![pgcharts-query](https://raw.github.com/dimitri/pgcharts/master/propaganda/pgcharts-query.png) ### Chart pane ![pgcharts-bar-chart](https://raw.github.com/dimitri/pgcharts/master/propaganda/pgcharts-bar-chart.png) ### Query listing pane ![pgcharts-query-list](https://raw.github.com/dimitri/pgcharts/master/propaganda/pgcharts-query-list.png) ### Chart only pane So that you can give an URL to just the chart for your coworkers to see (and download as a PDF, PNG, JPEG or SVG document): ![pgcharts-chart](https://raw.github.com/dimitri/pgcharts/master/propaganda/pgcharts-chart.png) ## Description The *pgcharts* projects is a little web application that takes as input an SQL query text and outputs its data in one of the following forms: - HTML table - Column Chart - Bar Chart - Pie Chart - Donut Chart With more to come (TODO): - Area Chart - Line Chart - Stacked Area Chart - Stacked Bar Chart - Grouped Bar Chart - CSV file # Initial Setup The *pgcharts* application needs its own PostgreSQL database to be able to register user queries and their charts setup: $ createdb pgcharts $ pgcharts setup pgsql://localhost/pgcharts Then you can start the service, which defaults to listening to [http://localhost:9042/](): $ pgcharts start $ open http://localhost:9042/ Now, you can use *pgcharts* from your browser. Issue new query, save them away, and see nice charts from their results! # Registering databases Once the *pgcharts* database has been created, it's necessary to ***register*** the database servers you want to run queries against: $ pgcharts register pgsql://user:pass@host/dbname $ pgcharts register pgsql://user:pass@host/seconddbname?sslmode=require The *sslmode* option accepts the following values: `disable`, `allow`, `prefer` and `require`. The `allow` and `prefer` options are implements in the same way, translating to the [Postmodern](https://marijnhaverbeke.nl/postmodern/postmodern.html) PostgreSQL driver's value `:try`, where `:try` means *if the server supports it*. # Implementation pgchart needs a database where to handle its own data, as it is storing a list of database connections (where to run the queries) and a list of queries (with a name and a tags list). TODO: see about storing query results on the *pgcharts* database so that it's possible to get back to them later. Maybe with some ways to run the query again and compare? # Security The *pgcharts* web service offers no security implementation, no user role management or privileges. To keep the service secure, users are only allowed to query against *registered* database servers. To register a database server to *pgcharts*, the command line interface must be used, so only the service administrator is in a position to register new database servers. # Usage pgcharts is a self-contained web application. As such, when you start the command line application, it starts its own web server that you can connect to. # Install The *pgcharts* application has been written in Common Lisp and uses a bunch of librairies that are available through the *Quicklisp* distribution system. The included `Makefile` cares about building a self-contained binary for you, and can be used as following: $ $ make $ ./build/bin/pgcharts --help Note that the self-contained binary also includes static web resources such as *jquery*, *bootstrap*, *Highcharts* and *codemirror*. ## Build Dependencies You need a recent enough [SBCL](http://sbcl.org/) Common Lisp compiler to be able to compile pgcharts. It's easy to install on Linux, MacOSX and Windows. debian$ sudo apt-get install sbcl centos$ sudo yum install sbcl macosx$ brew install sbcl pgcharts/TODO.md000066400000000000000000000006551315737174100137770ustar00rootroot00000000000000# Towards pgnotebook Review pgcharts to make it an SQL notebook allowing its users to compose "live" documents with SQL queries and their result, either plain tables or charts. Use [Hallo](http://hallojs.org/demo/markdown/) to allow editing text on the note book document, and provide ways to save and reload any page. A way to share a page *read-only* will then be needed, a simple HTML export might be all we need here tho. pgcharts/Vagrantfile000066400000000000000000000012371315737174100150720ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure("2") do |config| config.vm.box = "wheezy64" config.vm.provision :file do |file| file.source = 'vm-conf/devscripts' file.destination = '/home/vagrant/.devscripts' end config.vm.provision :file do |file| file.source = 'vm-conf/gpg.conf' file.destination = '/home/vagrant/.gnupg/gpg.conf' end config.vm.provision "shell" do |s| s.path = "vm-conf/bootstrap.sh" s.privileged = false end config.vm.network :forwarded_port, guest: 9042, host: 9042 end pgcharts/build/000077500000000000000000000000001315737174100140015ustar00rootroot00000000000000pgcharts/build/.gitignore000066400000000000000000000001131315737174100157640ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !bin !.gitignorepgcharts/build/bin/000077500000000000000000000000001315737174100145515ustar00rootroot00000000000000pgcharts/build/bin/.gitignore000066400000000000000000000001061315737174100165360ustar00rootroot00000000000000# Ignore everything in this directory * # Except this file !.gitignorepgcharts/debian/000077500000000000000000000000001315737174100141245ustar00rootroot00000000000000pgcharts/debian/changelog000066400000000000000000000004561315737174100160030ustar00rootroot00000000000000pgcharts (1.0-2) unstable; urgency=medium * Improve packaging with a system pgcharts user -- Dimitri Fontaine Thu, 03 Sep 2015 16:28:44 +0300 pgcharts (1.0-1) unstable; urgency=medium * First release. -- Dimitri Fontaine Wed, 10 Sep 2014 16:38:38 +0400 pgcharts/debian/compat000066400000000000000000000000021315737174100153220ustar00rootroot000000000000009 pgcharts/debian/control000066400000000000000000000017501315737174100155320ustar00rootroot00000000000000Source: pgcharts Priority: extra Maintainer: Dimitri Fontaine Build-Depends: debhelper (>= 9), sbcl (>= 1.2.0), buildapp (>= 1.5), cl-asdf (>= 3.0.3), cl-postmodern, cl-simple-date, cl-esrap, cl-py-configparser, cl-split-sequence, cl-ppcre, cl-alexandria, cl-hunchentoot, cl-yason, cl-closer-mop, cl-daemon, cl-who, cl-bordeaux-threads (>= 0.8.3), cl-curry-compose-reader-macros, cl-metabang-bind, cl-graph, cl-trivial-backtrace, cl-drakma, ruby-ronn Standards-Version: 3.9.6 Section: non-free/database Homepage: https://github.com/dimitri/pgcharts Vcs-Git: https://github.com/dimitri/pgcharts.git Vcs-Browser: https://github.com/dimitri/pgcharts Package: pgcharts Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, adduser Description: turn your PostgreSQL queries into charts pgcharts is a little web application that takes as input an SQL query text and outputs its data in one of the following forms: html table, column chart, bar chart, pie chart, donut chart. pgcharts/debian/copyright000066400000000000000000000573311315737174100160700ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: pgcharts Source: https://github.com/dimitri/pgcharts Files: * Copyright: 2014-2015 Dimitri Fontaine License: PostgreSQL Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. . IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. . THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. Files: lib/* Copyright: (c) 2014, vancan1ty License: BSD-2-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: . * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. . * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. . THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Files: web/bootstrap-3.1.1-dist/js/jquery-1.11.0.min.js Copyright: (c) 2005, 2014 jQuery Foundation, Inc. License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: web/bootstrap-3.1.1-dist/* Copyright: (c) 2011-2014 Twitter, Inc License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: web/codemirror-4.5/* Copyright: Copyright (C) 2014 by Marijn Haverbeke and others License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Files: web/highcharts/* Copyright: highslide-software License: CC-BY-NC Creative Commons Attribution-NonCommercial 3.0 License. . THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. . BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. . 1. Definitions . "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. . "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. . 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: . to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; . to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; . to Distribute and Publicly Perform the Work including as incorporated in Collections; and, . to Distribute and Publicly Perform Adaptations. . The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). . 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: . You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. . You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. . If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. . For the avoidance of doubt: . Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; . Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, . Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). . Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. . 5. Representations, Warranties and Disclaimer . UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. . 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. . 7. Termination . This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. . Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. . 8. Miscellaneous . Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. . Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. . If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. . No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. . This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. . The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. pgcharts/debian/pgcharts.dirs000066400000000000000000000000331315737174100166160ustar00rootroot00000000000000etc usr/bin var/log var/runpgcharts/debian/pgcharts.ini000066400000000000000000000002341315737174100164370ustar00rootroot00000000000000[pgcharts] dburi = postgresql:///pgcharts address = localhost port = 9042 logfile = /var/log/pgcharts/pgcharts.log pidfile = /var/run/pgcharts/pgcharts.pid pgcharts/debian/pgcharts.install000066400000000000000000000000651315737174100173300ustar00rootroot00000000000000debian/pgcharts.ini /etc build/bin/pgcharts /usr/bin pgcharts/debian/pgcharts.manpages000066400000000000000000000000131315737174100174460ustar00rootroot00000000000000pgcharts.1 pgcharts/debian/pgcharts.postinst000066400000000000000000000010361315737174100175440ustar00rootroot00000000000000#! /bin/sh set -e if [ "$1" = configure ]; then # Make sure the administrative user exists if ! getent passwd pgcharts > /dev/null; then adduser --system --no-create-home --home /var/log/pgcharts \ --shell /bin/bash --group --gecos "pgcharts" pgcharts fi # nicer log directory permissions install -d -g pgcharts -m 1775 /var/log/pgcharts /var/run/pgcharts # allow the pgcharts user to edit the setup using pgcharts commands chown root:pgcharts /etc/pgcharts.ini fi #DEBHELPER# exit 0 pgcharts/debian/rules000077500000000000000000000034611315737174100152100ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # This file was originally written by Joey Hess and Craig Small. # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 PKGVERS = $(shell dpkg-parsechangelog | awk -F '[:-]' '/^Version:/ { print substr($$2, 2) }') EXCLUDE = --exclude-vcs --exclude=debian --exclude=build --exclude=.vagrant BITS = $(shell dpkg-architecture -qDEB_BUILD_ARCH_BITS) ifeq ($(BITS),32) SIZE=1024 else SIZE=4096 endif # buildd provides a build environment where $HOME is not writable, but the # CL compilers here will need to fill-in a per-user cache export HOME = $(CURDIR)/debian/home orig: clean cd .. && tar czf pgcharts_$(PKGVERS).orig.tar.gz $(EXCLUDE) pgcharts override_dh_auto_build: mkdir -p build/bin mkdir -p $(HOME) buildapp --logfile /tmp/pgcharts-build.log \ --require sb-posix \ --load /usr/share/common-lisp/source/cl-asdf/build/asdf.lisp \ --asdf-path . \ --asdf-tree /usr/share/common-lisp/systems \ --load-system pgcharts \ --load src/image.lisp \ --load debian/settings.lisp \ --entry pgcharts:main \ --dynamic-space-size $(SIZE) \ --compress-core \ --output build/bin/pgcharts override_dh_auto_test: # no nothing override_dh_strip: # do nothing %: dh $@ pgcharts/debian/settings.lisp000066400000000000000000000002301315737174100166500ustar00rootroot00000000000000(in-package #:pgcharts) (setf *config-filename* "/etc/pgcharts.ini") (setf *pidfile* "/var/run/pgcharts.pid") (setf *logfile* "/var/log/pgcharts.log") pgcharts/debian/source/000077500000000000000000000000001315737174100154245ustar00rootroot00000000000000pgcharts/debian/source/format000066400000000000000000000000141315737174100166320ustar00rootroot000000000000003.0 (quilt) pgcharts/debian/source/lintian-overrides000066400000000000000000000131601315737174100210060ustar00rootroot00000000000000# # sbcl (common lisp compiler) isn't compatible with hardening of binary images # hardening-no-relro usr/bin/pgcharts # # the pgcharts sources embed javascript dependencies because of the way the # /usr/bin/pgcharts is built: all those static resources are then part of # the binary, and all you need to run the self-contained pgcharts web-server # is the binary itself. # source-is-missing web/hallo/rangy-core-1.2.3.js source-is-missing web/hallo/jquery-ui-1.10.2.min.js source-is-missing web/codemirror-4.5/codemirror-compressed.js source-is-missing web/highcharts/js/highcharts.js source-is-missing web/highcharts/js/highcharts-more.js source-is-missing web/highcharts/js/highcharts-all.js source-is-missing web/highcharts/js/highcharts-3d.js source-is-missing web/bootstrap-3.1.1-dist/js/jquery-1.11.0.min.js source-is-missing web/bootstrap-3.1.1-dist/js/docs.min.js source-is-missing web/highcharts/js/modules/solid-gauge.js source-is-missing web/highcharts/js/modules/no-data-to-display.js source-is-missing web/highcharts/js/modules/heatmap.js source-is-missing web/highcharts/js/modules/funnel.js source-is-missing web/highcharts/js/modules/exporting.js source-is-missing web/highcharts/js/modules/drilldown.js source-is-missing web/highcharts/js/modules/data.js source-is-missing web/highcharts/js/modules/canvas-tools.js source-is-missing web/highcharts/js/adapters/standalone-framework.js source-is-missing web/highcharts/exporting-server/phantomjs/solid-gauge.js source-is-missing web/highcharts/exporting-server/phantomjs/no-data-to-display.js source-is-missing web/highcharts/exporting-server/phantomjs/map.js source-is-missing web/highcharts/exporting-server/phantomjs/jquery.1.9.1.min.js source-is-missing web/highcharts/exporting-server/phantomjs/highcharts.js source-is-missing web/highcharts/exporting-server/phantomjs/highcharts-more.js source-is-missing web/highcharts/exporting-server/phantomjs/highcharts-3d.js source-is-missing web/highcharts/exporting-server/phantomjs/heatmap.js source-is-missing web/highcharts/exporting-server/phantomjs/funnel.js source-is-missing web/highcharts/exporting-server/phantomjs/drilldown.js source-is-missing web/highcharts/exporting-server/phantomjs/data.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/solid-gauge.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/no-data-to-display.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/map.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/jquery.1.9.1.min.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/highstock.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/highcharts.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/highcharts-more.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/highcharts-3d.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/heatmap.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/funnel.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/drilldown.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/target/classes/phantomjs/data.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/target/highcharts-export-web/resources/lib/jquery-1.11.0.min.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/solid-gauge.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/no-data-to-display.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/map.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/jquery.1.9.1.min.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/highcharts.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/highcharts-more.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/highcharts-3d.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/heatmap.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/funnel.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/drilldown.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-convert/src/main/resources/phantomjs/data.js source-is-missing web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/jquery-1.11.0.min.js pgcharts/lib/000077500000000000000000000000001315737174100134505ustar00rootroot00000000000000pgcharts/lib/simple-routes-demo.lisp000066400000000000000000000063561315737174100201050ustar00rootroot00000000000000;;; ;;; https://raw.github.com/vancan1ty/simple-routes/master/simpleroutes-demo.lisp ;;; ;;; As I couldn't make Quicklisp and ASDF to load the project once git ;;; cloned in ~/quicklisp/local-projects/, let's just add a copy here. (defpackage :simpleroutes-demo (:use :common-lisp :hunchentoot :cl-who :simple-routes)) (in-package :simpleroutes-demo) ;;this should point to your static files root (defvar *file-root* (cl-fad:merge-pathnames-as-directory *default-pathname-defaults* "web/")) (setf simple-routes:*routeslist* (compile-routes ;;html content uris (:GET "" 'home-handler) (:GET "/" 'home-handler) (:GET "/people" 'home-handler) (:GET "/people/:first/:last" 'get-people-handler) (:GET "/people/put/:first/:last/:description" 'put-people-handler) (:PUT "/people/:first/:last/:description" 'put-people-handler) )) ;all lat/long numbers are rounded to the hundredths place before insertion or checking... (defvar *people-hash* (make-hash-table :test #'equalp)) ;;add a couple of predefined peoples (setf (gethash (list "Nikola" "Tesla") *people-hash*) "AC induction motor FTW!") (setf (gethash (list "Thomas" "Edison") *people-hash*) "preferred DC") (defun home-handler () (with-html-output-to-string (*standard-output* nil :indent t) (:html (:h1 "Simple-Routes Demo") (:p "Look in simpleroutes-demo.lisp to see underlying code") (:table :border 3 (:tr (:th "Operation") (:th "Urlspec") (:th "Description")) (:tr (:td "GET") (:td "/people/:first/:last") (:td "retrieves matching person")) (:tr (:td "PUT") (:td "/people/:first/:last/:description") (:td "PUTs that name and description to the server")) (:tr (:td "GET") (:td "/people/put/:first/:last/:description") (:td "convenience accessor for PUT functionality using plain browser functionality")) ) (:h2 "Current Entries") (maphash (lambda (k v) (htm (:p (print k) ": " (fmt v)))) *people-hash*) ))) (defun get-people-handler (first last) (with-html-output-to-string (*standard-output* nil :indent t) (:html (let ((potentialout (gethash (list first last) *people-hash*))) (if potentialout (htm (:p (fmt "name: ~a ~a" first last)) (:p (fmt "description: ~a" potentialout))) (progn (setf (return-code*) +HTTP-NOT-FOUND+) (htm (:p "couldn't find that person!")))))))) (defun put-people-handler (first last description) (with-html-output-to-string (*standard-output* nil) (:html (:p (fmt "put: ~a " (setf (gethash (list first last) *people-hash*) (url-decode description))))))) (defvar *macceptor* (make-instance 'simple-routes:simpleroutes-acceptor :port 8080 :document-root *file-root* :access-log-destination *terminal-io* :message-log-destination *terminal-io*)) (setf *show-lisp-errors-p* t *show-lisp-backtraces-p* t) ;;code below restarts the acceptor every time this file is loaded (if (hunchentoot::acceptor-shutdown-p *macceptor*) (hunchentoot:start *macceptor*) (progn (hunchentoot:stop *macceptor*) (hunchentoot:start *macceptor*))) pgcharts/lib/simple-routes.lisp000066400000000000000000000123051315737174100171520ustar00rootroot00000000000000;;; ;;; https://raw.github.com/vancan1ty/simple-routes/master/simple-routes.lisp ;;; ;;; As I couldn't make Quicklisp and ASDF to load the project once git ;;; cloned in ~/quicklisp/local-projects/, let's just add a copy here. (defpackage :simple-routes (:use :common-lisp :cl-ppcre :hunchentoot) (:export :compile-routes :simpleroutes-acceptor :simpleroutes-ssl-acceptor :bind-alist-values :define-simple-handler)) (in-package :simple-routes) ;;Adds simple-router dispatching to the front of hunchentoot's dispatch table! (defvar *routeslist* () "should contain routes compiled with routespec-compile or manually entered in compiled form incoming requests are matched up against each item in *routeslist* successively, until (and if) a matching routespec is found.") (defclass simpleroutes-acceptor (acceptor) ((routes :initarg :routes :accessor routes :documentation "Routes list.")) (:documentation "This first tries to route requests using simple-router, then falls back to hunchentoot's default easy-acceptor.")) #-:hunchentoot-no-ssl (defclass simpleroutes-ssl-acceptor (simpleroutes-acceptor ssl-acceptor) () (:documentation "This is an acceptor that mixes the simpleroutes acceptor with SSL connections.")) (defun issymbolstring (str) (and (> (length str) 1) (eql (elt str 0) #\:))) (defun removelast (sequence) "removes the last item in sequence IF THE SEQUENCE HAS A LAST ITEM" (if (> (length sequence) 0) (subseq sequence 0 (1- (length sequence))) sequence)) (defun routespec-compile (httpmethod urldef fntocall) "httpmethod can be one of :GET :HEAD :POST :PUT :DELETE or :ALL urldef is a url definition string sharing *basic* syntax with Ruby on Rails fntocall is the function to call in case the this is found to be a match for the request this macro returns a list which is meant to be processed by cl-simple routehandler example call: =>(rtreg :GET ``/home/next/:number'' #'nxthandler) returns (:GET \"^/home/next/([^/]*)$\" (NUMBER) #) the output of this macro can in turn be processed by simple-processor" (declare (optimize (debug 3))) (let* ((thelist (remove "" (cl-ppcre:split "/" urldef) :test #'equalp)) (startswithslash (and (> (length urldef) 0) (eql (elt urldef 0) #\/))) (endswithslash (and (> (length urldef) 1) (eql (lastitem urldef) #\/))) (colonitems (reverse (reduce (lambda (accum nxt) (if (issymbolstring nxt) (cons nxt accum) accum)) thelist :initial-value ()))) (theregex (concatenate 'string "^" (when startswithslash "/") (removelast (apply #'concatenate 'string (loop for item in thelist collect (if (issymbolstring item) "([^/]*)/" (concatenate 'string item "/"))))) (when endswithslash "/") "$")) (symstobind (mapcar (lambda (item) (intern (string-upcase (subseq item 1)))) colonitems))) `(list ,httpmethod ,theregex (quote ,symstobind) ,fntocall))) (defmacro compile-routes (&rest routespecs) `(list ,@(loop for routespec in routespecs collect (apply #'routespec-compile routespec)))) (defun simple-router (request-uri request-type) "takes in a request uri and type (:GET, :POST, etc...) and loops through all compiled routes in *routeslist*. If it finds a route that matches ,it returns the associated handler and returns true. otherwise returns false" (register-groups-bind (processed-uri) ("^([^?]*)\\??.*" request-uri) (loop for compiled-route in *routeslist* do (destructuring-bind (treqtype tregexp tvars tfntocall) compiled-route (declare (ignore tvars)) (multiple-value-bind (regexmatch capturedstrings) (cl-ppcre:scan-to-strings tregexp processed-uri) (declare (ignore regexmatch)) (if (and (not (eql capturedstrings nil)) (eql treqtype request-type)) (progn (return-from simple-router (apply tfntocall (mapcar #'hunchentoot:url-decode (coerce capturedstrings 'list))))))))))) (defmethod acceptor-dispatch-request ((acceptor simpleroutes-acceptor) request) "The simple request dispatcher which tries to complete the request using simple, but otherwise falls back to the hunchentoot defaults *dispatch-table* and easy-acceptor" (let ((uri (request-uri request)) (request-type (hunchentoot:request-method request))) (let* ((*routeslist* (let ((routes (routes acceptor))) (typecase routes (symbol (symbol-value routes)) (t routes)))) (potentialout (simple-router uri request-type))) (or potentialout (call-next-method))))) (defmacro bind-alist-values (lambda-list alist-expression &rest body) "this is intended to be used to access get and post parameters. example usage (bind-alist-values (first second) (hunchentoot:get-parameters*) (list first second))" `(destructuring-bind ,lambda-list (mapcar (lambda (varname) (cdr (assoc (string varname) ,alist-expression :test #'equalp)) ) (quote ,lambda-list)) ,@body)) (defun lastitem (seq) (let ((lindex (- (length seq) 1))) (when (> lindex 0) (elt seq lindex)))) pgcharts/pgcharts.1000066400000000000000000000122201315737174100145740ustar00rootroot00000000000000.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "PGCHARTS" "1" "June 2015" "ff" "" . .SH "NAME" \fBpgcharts\fR \- PostgreSQL data loader . .SH "SYNOPSIS" \fBpgcharts\fR [\fIoptions\fR] [\fIcommand\-file\fR]\.\.\. . .SH "DESCRIPTION" pgcharts is The PostgreSQL Extension Installer server\. . .SH "OPTIONS" . .TP \fB\-h\fR, \fB\-\-help\fR Show command usage summary and exit\. . .TP \fB\-V\fR, \fB\-\-version\fR Show pgcharts version string and exit\. . .TP \fB\-c\fR, \fB\-\-config\fR Use the given configuration file (default to "~/\.pgcharts\.ini")\. . .SH "COMMANDS" The pgcharts binary allows running and controling the pgcharts embedded web server\. . .SS "CONFIGURATION CONTROL" While it\'s possible to ship a configuration file or to prepare it by hand, the following commands allow to control the setup from the command line\. . .IP "\(bu" 4 \fBconfig [ name ] [ value ]\fR . .IP Without arguments, print the whole configuration file content\. When given a variable \fIname\fR, print its current value\. When given both a \fIname\fR and a \fIvalue\fR, set the configuration variable to the given value\. . .IP "\(bu" 4 \fBconfig get \fR . .IP Print the current value of the configuration variable \fIname\fR\. . .IP "\(bu" 4 \fBconfig set \fR . .IP Set the variable \fIname\fR to the given \fIvalue\fR\. . .IP "" 0 . .SS "SERVER CONTROL" The PostgreSQL Extension Installer comes with a PostgreSQL plugin that downloads static files: that part doesn\'t need any server at all\. This server is meant to be used by maintainers of a set of extension archives, when they want to ease the maintenance and setup of the building\. . .IP "\(bu" 4 \fBstart\fR . .IP Start the embedded pgcharts HTTP server on the port it\'s been setup to listen to, which defaults to 8042\. The . .IP "\(bu" 4 \fBstop\fR . .IP Stops the server\. . .IP "\(bu" 4 \fBstatus\fR . .IP Print the result of querying the HTTP status API against the (hopefully) running server\. . .IP "\(bu" 4 \fBpid\fR . .IP Print the registered pid of the server process\. This information might be stale in case of unexpected termination of the server\. . .IP "\(bu" 4 \fBsetup \fR . .IP Connects to the PostgreSQL database specified with the \fIdburi\fR parameter and install the database model there\. . .IP "" 0 . .SS "REGISTERING DATABASES" Once pgcharts is properly setup (see the \fBsetup\fR command above) then it\'s necessary to add databases against which you want to run queries and draw charts\. . .IP "\(bu" 4 \fBregister \fR . .IP Register given \fIdburi\fR\. . .IP "" 0 . .SH "DATABASE URI" The \fIdburi\fR connection string is expected to be given as a \fIConnection URI\fR as documented in the PostgreSQL documentation at http://www\.postgresql\.org/docs/9\.3/static/libpq\-connect\.html#LIBPQ\-CONNSTRING\. . .IP "" 4 . .nf postgresql://[user[:password]@][netloc][:port][/dbname][?sslmode=\.\.\.] . .fi . .IP "" 0 . .P Where: . .IP "\(bu" 4 \fIuser\fR . .IP Can contain any character, including colon (\fB:\fR) which must then be doubled (\fB::\fR) and at\-sign (\fB@\fR) which must then be doubled (\fB@@\fR)\. . .IP When omitted, the \fIuser\fR name defaults to the value of the \fBPGUSER\fR environment variable, and if it is unset, the value of the \fBUSER\fR environment variable\. . .IP "\(bu" 4 \fIpassword\fR . .IP Can contain any character, including that at sign (\fB@\fR) which must then be doubled (\fB@@\fR)\. To leave the password empty, when the \fIuser\fR name ends with at at sign, you then have to use the syntax user:@\. . .IP When omitted, the \fIpassword\fR defaults to the value of the \fBPGPASSWORD\fR environment variable if it is set, otherwise the password is left unset\. . .IP "\(bu" 4 \fInetloc\fR . .IP Can be either a hostname in dotted notation, or an ipv4, or an Unix domain socket path\. Empty is the default network location, under a system providing \fIunix domain socket\fR that method is preferred, otherwise the \fInetloc\fR default to \fBlocalhost\fR\. . .IP It\'s possible to force the \fIunix domain socket\fR path by using the syntax \fBunix:/path/to/where/the/socket/file/is\fR, so to force a non default socket path and a non default port, you would have: . .IP "" 4 . .nf postgresql://unix:/tmp:54321/dbname . .fi . .IP "" 0 . .IP The \fInetloc\fR defaults to the value of the \fBPGHOST\fR environment variable, and if it is unset, to either the default \fBunix\fR socket path when running on a Unix system, and \fBlocalhost\fR otherwise\. . .IP "\(bu" 4 \fIdbname\fR . .IP Should be a proper identifier (letter followed by a mix of letters, digits and the punctuation signs comma (\fB,\fR), dash (\fB\-\fR) and underscore (\fB_\fR)\. . .IP When omitted, the \fIdbname\fR defaults to the value of the environment variable \fBPGDATABASE\fR, and if that is unset, to the \fIuser\fR value as determined above\. . .IP "\(bu" 4 The only optional parameter supported is \fBsslmode\fR and it accepts the values \fBdisable\fR, \fBallow\fR, \fBprefer\fR and \fBrequire\fR\. . .IP "" 0 . .SH "AUTHOR" Dimitri Fontaine \fIdimitri@2ndQuadrant\.fr\fR . .SH "SEE ALSO" The pgcharts source code and all documentation may be downloaded from \fIhttps://github\.com/dimitri/pgcharts/\fR\. pgcharts/pgcharts.1.md000066400000000000000000000110441315737174100151760ustar00rootroot00000000000000# pgcharts(1) -- PostgreSQL data loader ## SYNOPSIS `pgcharts` [] []... ## DESCRIPTION pgcharts is The PostgreSQL Extension Installer server. ## OPTIONS * `-h`, `--help`: Show command usage summary and exit. * `-V`, `--version`: Show pgcharts version string and exit. * `-c`, `--config`: Use the given configuration file (default to "~/.pgcharts.ini"). ## COMMANDS The pgcharts binary allows running and controling the pgcharts embedded web server. ### CONFIGURATION CONTROL While it's possible to ship a configuration file or to prepare it by hand, the following commands allow to control the setup from the command line. - `config [ name ] [ value ]` Without arguments, print the whole configuration file content. When given a variable *name*, print its current value. When given both a *name* and a *value*, set the configuration variable to the given value. - `config get ` Print the current value of the configuration variable *name*. - `config set ` Set the variable *name* to the given *value*. ### SERVER CONTROL The PostgreSQL Extension Installer comes with a PostgreSQL plugin that downloads static files: that part doesn't need any server at all. This server is meant to be used by maintainers of a set of extension archives, when they want to ease the maintenance and setup of the building. - `start` Start the embedded pgcharts HTTP server on the port it's been setup to listen to, which defaults to 8042. The - `stop` Stops the server. - `status` Print the result of querying the HTTP status API against the (hopefully) running server. - `pid` Print the registered pid of the server process. This information might be stale in case of unexpected termination of the server. - `setup ` Connects to the PostgreSQL database specified with the *dburi* parameter and install the database model there. ### REGISTERING DATABASES Once pgcharts is properly setup (see the `setup` command above) then it's necessary to add databases against which you want to run queries and draw charts. - `register ` Register given *dburi*. ## DATABASE URI The *dburi* connection string is expected to be given as a *Connection URI* as documented in the PostgreSQL documentation at http://www.postgresql.org/docs/9.3/static/libpq-connect.html#LIBPQ-CONNSTRING. postgresql://[user[:password]@][netloc][:port][/dbname][?sslmode=...] Where: - *user* Can contain any character, including colon (`:`) which must then be doubled (`::`) and at-sign (`@`) which must then be doubled (`@@`). When omitted, the *user* name defaults to the value of the `PGUSER` environment variable, and if it is unset, the value of the `USER` environment variable. - *password* Can contain any character, including that at sign (`@`) which must then be doubled (`@@`). To leave the password empty, when the *user* name ends with at at sign, you then have to use the syntax user:@. When omitted, the *password* defaults to the value of the `PGPASSWORD` environment variable if it is set, otherwise the password is left unset. - *netloc* Can be either a hostname in dotted notation, or an ipv4, or an Unix domain socket path. Empty is the default network location, under a system providing *unix domain socket* that method is preferred, otherwise the *netloc* default to `localhost`. It's possible to force the *unix domain socket* path by using the syntax `unix:/path/to/where/the/socket/file/is`, so to force a non default socket path and a non default port, you would have: postgresql://unix:/tmp:54321/dbname The *netloc* defaults to the value of the `PGHOST` environment variable, and if it is unset, to either the default `unix` socket path when running on a Unix system, and `localhost` otherwise. - *dbname* Should be a proper identifier (letter followed by a mix of letters, digits and the punctuation signs comma (`,`), dash (`-`) and underscore (`_`). When omitted, the *dbname* defaults to the value of the environment variable `PGDATABASE`, and if that is unset, to the *user* value as determined above. - The only optional parameter supported is `sslmode` and it accepts the values `disable`, `allow`, `prefer` and `require`. ## AUTHOR Dimitri Fontaine ## SEE ALSO The pgcharts source code and all documentation may be downloaded from . pgcharts/pgcharts.asd000066400000000000000000000064421315737174100152140ustar00rootroot00000000000000;;;; pgcharts.asd (asdf:defsystem #:pgcharts :serial t :description "Repository of PostgreSQL Extensions" :author "Dimitri Fontaine " :license "The PostgreSQL Licence" :depends-on (#:uiop ; host system integration #:postmodern ; PostgreSQL protocol implementation #:simple-date ; Handling of pgsql date formats #:esrap ; parser generator #:py-configparser ; Read old-style INI config files #:split-sequence ; split strings #:cl-ppcre ; Regular Expressions #:alexandria ; Some utilities #:hunchentoot ; http server #:yason ; JSON routines #:closer-mop ; introspection #:daemon ; run the repo server in the background #:cl-who ; HTML production from lisp code #:trivial-backtrace ; Produces backtraces #:drakma ; HTTP client, to check server status #:graph ; Find SQL model upgrade paths ) :components ((:module "lib" :components ((:file "simple-routes"))) (:module "src" :depends-on ("lib") :components ((:file "package") (:module utils :depends-on ("package") :components ((:file "dburi") (:file "cache") (:file "cli-parser") (:file "read-sql-files"))) (:module sql :depends-on ("package" "utils") :components ((:file "model-update"))) (:file "config" :depends-on ("package" "utils")) (:file "model" :depends-on ("package" "utils" "sql")) ;; frontend (:file "resources" :depends-on ("package" "utils")) (:file "front-tools" :depends-on ("package" "utils")) (:file "front-db" :depends-on ("package" "utils" "front-tools")) (:file "front-main" :depends-on ("package" "utils" "front-tools")) (:file "front-query" :depends-on ("package" "utils" "front-tools")) (:file "front-notebook" :depends-on ("package" "utils" "front-tools")) (:file "front-raw-query" :depends-on ("package" "utils" "front-tools" "front-query")) ;; http server control and main routing (:file "server" :depends-on ("package" "utils" "front-tools" "front-main" "front-db" "front-query" "front-notebook")) ;; main entry point for the binary (command line) (:file "pgcharts" :depends-on ("package" "utils")))))) pgcharts/propaganda/000077500000000000000000000000001315737174100150165ustar00rootroot00000000000000pgcharts/propaganda/pgcharts-bar-chart.png000066400000000000000000005014661315737174100212140ustar00rootroot00000000000000PNG  IHDRԨ iCCPICC ProfileH wTSI{H ҫ@A`#$! % bW\ *"芈kd-(EYTu`C{η}sޝ;w̻ @{3QU,T$=/3T!͋UJtv<^hś@@"$ ِ R`B!8/)%Ma:;8PVk,rZ<.O\ mp)27Xl8őI h Xb~ $ OvV@F  ~8G NYW n~x CF!!t b8"D"1H"C#@v#/ ,r F!PTG#8t.Gs]A=^Ao=Kt8*N gŹqQd\N[+ƕq\7'x&9R:|~?ߎ= "" E2>qy-B?=H"Z݈a$b:qqqJ&I$ɆM"IRRi; :L%!d\F>@>MN~FQRU2STR*-TڠWEREbAQ)+(zyC[*jLΤ ˩ԋ^':͚HCjh{t:ݜGOKs e;e2WyrruW*J*f**T TT\STUR5W Te.UT=zGuXN%$us`uzs} Ä0V1235,tCCΚ 4{pZZ,L ZGnk}?oIO=YO]ݠ}KS'X'CgN#]L;uN֘53xP=kEz{ 423H7bp`ac(4bxSd3ۙCFzFaF2FF#+PLML N7]lZgzLL`ͬ샹yj&,:tK_j˛VD+w V]֨ jj#a=0chJ;4[<:^;-HvMvNMijo.{8;;thqxhqtDw qZƙ ej6nz7S*;/z<qcfǪ37" M=I'OxךF'+Oipr虂3í}muf/^pÿE'/y^:qr+W]㝮ܮ5wyttO>}A7.dݼrkƭޙs.{^ϻ?`CG=מSAW>y{G_ ҟ=3|VɁ_,SϪWաYC%G߬{ޏ|(q'O??YזofX-F4- M = (u2^c|rx--_j_ fӰY^2DrӜI[}R WȎѯ{z@kx}.&Zh:/Rc iTXtXML:com.adobe.xmp 1205 966 ,@IDATx u[[!$$!$! 8ޒg-Nqdbo덗kg2eƎ 06K6/ҭ^Owu,pvU:uSwB.#d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d~: 1{v\vF #d2@F #dNqzNRM d2@F #d2@F pspy@F #d2@F #dDd@rl&>jC%D2@F #d2@F # Cu85TrMxh=O4ߠ2Fxs|e2-#d2@F #d2`Q-,=uyXSKكjҫы2j+@F #d2@F #d^zSietʟUOO8\ &Zz^Xb<-^Sy hd洌@F #d2@F #d?N1`q#tho4ʹ22>ۯ'?.d}7ZH?U [o Ӳd2@F #d2@FV}hU yS>Ҫū-,ӊy;ÚTTMn"]\YH4)Ͳ7Iõ9d2@F #d2@F EAP52"Z'JwCdi),oLOyVFKWFsZ3@F #d2@F # @PV#34t)id2@F #d2@F7oҴZ f>4L]uա<yBKӠh?l]iIK.p1*cG> ^׽j̙/1bĬPWg~L/:4^_-nωq|tk^;?R\͓7Ynwz5~4,`e>2]+/p'*V]7}xsc\smkWE0O#hEx0W2.郕tח|r.>w~yc\s_l6+U2y.?:Å;Q=UsNw| ߼uؾ?>e0َpZ[[l߾7tGS81| /KKiRDŽ?G ^^5^YJ(_i5>ce^{ퟏ3"ejhh RV|bRWWL#4 ]ᱲl,8z/2Usg^|cj̋?Zƻ2fE St㿂VKS)KYǠUsg^<21+bhb?9N_A+ %ԇ18p{-^]>l(4DӴb,^}PW9 *Cَ8a8^7ON8R9e*ơM'?ӦM{ E*[I(E6~J'Lyq9-]h[KyȑoC7ͲIR7ݲMs^|Ã4|By|Ҋq-.}64)0w}9lYc~NiӸYM3}cZ$;?E'~J' jl5MK2#/H\4_Kq샙æf?ܒ>8henZ[W8s?7M+ qǿu)ՓTG<Mc۴Էqẋ<迩wvv&M:/~qHHg+q%@xOvz>$g#,o>+'2nٲMMM3=HQzo 8q4+[&te|i{6 :'4LzGO,:a1υ3byҸ-m'/b:"y OZomZYkY#噏tS߲oiLs>qŶiS030~<1F)i8ԼdMyow#8F%o_ckp3OPj7~1JqL)%oCB4Lzy[Oqn~A'lOu~ߏi1JqL)%kCB4L{SO?}fPD: ^TȓI+Op-qxuQ3(1 e4#p1^'yNï2Uܶm/`"HoS:4jyvďץӰќF48n^Cgt|\]W]Z7w~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ' ʓ.7T ^Ǚ/zqhic•9<(oxVѪxaL'@ᔿPVLҝmea+iq0C>iHp.e໎) Z>ZǬO!|I:c\v+iL}u{˲#eÓ֕TX?i4X7wYv5|.-+r)e໎) :g+W>bVlHI.E LsgK;_UVRP̗ ;-a(@>$#^o͛ofyGx:`;-S:a84yeE?g9$;_jd[@9:V*|1 >OcLC~."G8MB/5i^!Xv~g;i8d\\&Ǽg(R3N\(;|\cgsTq ~.tHw4-? b|1߿2)FaEcltg\㛷XeYiΗ.0."~-S~Qqq.?q߼粣Ky/taXnZGS>=siY?]siZ$&,|y?zzf$ XMCq2wyy eEbYNi<t4?o]|\?c:Hw4-? |s9?z@7ap~:srbbo:lp"?.2zZ.qxp|)Keu*++crMLp,VR*iiTVAw?KNe^7Cˆq |oYN'a!Y'(8ק&nyi,恎C>4iruvM4i+rfiy:;u%Jt|EurZdCy08m.e9/4.x1&e:e;ekRTr]iry7t򡙎_Ls]4O#+4=VB+"Cʳlǹlv-yq,NjF/m7,y- .^r\gO-/3ytb\Y.~ZNw]_wzPe; ?e[%nY e9^L-6zigkYNw𚆰7:\ׇx&nyi\|h\W:ruvJt^wˀ4>0qKo8C3"iG8]Wiz@W]'E?gÏsٖr[BrY{^nYZ]!,M.![^Z/g~@!4N\˷L|.rRʜi-<.ZZ|t|IhE,$# iL7FN#_JK_O~g;l팑浟~mL#ivゖiHii>—h0A3΄ ' gzO]Qĥach=e;k3=-WL'n'%a+cL0OiC&|1iwy:2Hq?E]8@gҰA_cxS\Y|3˄VLO%lYqr+LLKt:W):ax_OTFJK!DLሧ29}Wp>DŹ/vΝ;bOyabt|RWiDŽ !iMs/-;t2heuvvtPb𝧣oc^C>a@ B^;q>"|L >G2눏\9/wkw;͟r͏Fȋs[/Ms(8ѨQ´i¸q"HYO|t )Fe1^q[Cز]󻾎;(y]g|iEyrS9EKeZz\&rݻzzX?ySt;#?iOi)S\׃1}xpcƌ 'OGc}B(c޽}c {Mzѹ|Mww^7)OpZw1/eg&Lp y!]#l3<Ӡ.;fП>!-as_Sېew? yv絉'es>O<m6z9O=br(Dz\ 9x*'A32G#Gs?8<#,uio~n\ǩ3pn}ionnM:5GɖIY<\#6iLQ5m?2]C9NrRt;]ZVy;fY&MDRl/ȴFR[6w}?eu~.uMiqEyrأ#FN;-;6;82pm<֐q37 Y8c7@K WkG?Ӎqi젹#l6=XAA7ae.e_>a9j˪(#:w]H]kiHX5(hu7R"vpIu7neG)yݪ3嫌.M9%R QOYY!Θ.cTਯ7mG:+֫6l˞wּ0j(jJ}`$ V-q= 7n 2͋k8IEC;g6W#گ b9z lFQ!ea|oܸ1.d9'9Bx7|נ(؁փaӦ#؎y͛{VhւO ?i)ZێƬ QiӦjD8gaԘ^۩n9dƌkv 쪂I?e/cXzÜrA'߅l F즦0ykч6w #7h1B:NqA=#F 3q33>6mkQ @R6iXs֏FFHjC5iM/vH=&=f\;׮]7GhxaO ߡhż8{:{4uk^gyfylXk^h֐#5wE]Ij-d [n mmm}zd\RU״Ξ{f1|Nפ=ZnxXXKG`bۍ.qK+xieß{.ԇ￿ol@5y U v>7*ȓZ,h/\8IKÎ'k~gCw7 vzUu"w>r ;pY' w.<:Ue$VBk8zP+- 0EC>ٜO5H'9 z5W':A8%Ra{1=h&!1k\\t-Ļ;EtCDHo<’_qXSX ݔ8N?Q$6m߾=Ɲ5o/5ި?z{M~݆qO'./XhN-z Z#4I֯>@8̘1# 8ǝ5)nLw }oxkjhsYZ y d;o(0-Qe}8pa֐3eeáGct~qkn~f'~OltɨЊC±st; /}SZ'#g.C+uV| +Iۇ0~v웝^feqhXPQ".:>uo[*ׇ?QΙ~Z>PkY#Ԥ`2A^;C|]?R|ǍajpἩa퉭aw'F+%U&1^9n[n%ԍMf 螰maa҄)\nٮ].>C$=|M:,C;&pgM6MmDcZ\1a&&'#jlG>YLXD:풱 ԡWl, a up,Z UI/~ߣN8%]&c X's㈌%5 ~^:'Oatm;d:Z1*bN\6mFҡV6MYQTu+i4agy2[yT5y^cx_idsWu<'fhu@LAT O}zdOY"J'_֜Ј-DŠ+"EF0ְQ!VZ۫.8ybX/{+_o=: ,[}bjP_S>L8>l\:3pZxcllGk??oG{"ś}%_! 5U:N)VȊڹQ ҈։ZgkHC'l6cCn(? s=ȯ{NKqbyG6JgWnuyryDzt J)?zKiCL<Ьq=y<8[V9+ԉ9r$t}:. c':ӡ.Űگ^Wj+ C3ݾé<)4ŽM~{f}hꂅTq(~"B;p;$,/ü%otnX4.<}a̳c][TLٻ;|O׾M=I7^8~N=;9sa|/K9>Nyv FtԘڛμ"vBMkuP6<@aOThXa7JİHnj(*إ4l/qg]*ZGĻ<:|aS#vG $X'Ĩ )BŦ:j;bgT6~ȉÇ N3A>3VFa?!$U܁ԴY~5G,#aWdC̴"|ӎb #5CO(MMbu1~ukUqaHAm2!QyrNwMfMi![)9yŭdeaUnSOrΠxu \X b_[x:6|Ŏ$| `oT(=tP튛>sհ<)6Lп=OzDmCF4%{ R5ШE|ᄑ;[`dXybjP[TuZH7G6k l3/Fpk!BƍƎU9MuJMQ wXCi pB*k GkҡSe;XӿC1ø!M:x`=ڄ ڇv@: Z? #E!G؋膖ES'9_l6&Un}#c~vi;~8vOǿ\e;ߚ٫%/F^7p^!t؟Pa(^L,*״'{`XI*=ΕK4L'CLsǡ]2D(<6Uw}, g\hBX蟦7/w[oݘtdV(h`{^8L\0<+=5Qh Ɵ{W+M aq}#wW+_{aXpƼcKxJZg%~U«^Aj,=hAK+?h\|%h5JGzz?sv̷~cW_#UQ¢-"sH zpxݿ|1\ۿoPt,y-a/q'ًWفŻSOQ+5hc`"AQyIȭUbSHzB6n*QO詃ɒ-n'.Ҋ,,H.<])6`j?dlxQ]Oo+PQD}5&\Nǻaj,cuK=y԰0&bv#'b D[v { K#¬Ma,Z_7Pwj L:%$􈋱/z&<aݶPL[CS 3'ÚT?Dgokr&NF;naX 4Vx}}8E׆~{Ԋm854Wpp2`$ 0Q:ְG_p>o )LmcI+GX/=W=ѤIl*}0WyKF<]f"ɾ@< ,l07) *L]o8VJrhХ!XP,>Y;1I{`Ke=]iC ҝ֥4ak#F= H5;E?iZݻwhؿS6}c6UwsÓ'-?T]h8yRx]mǎXc޿"5`[u ؠ@qGC{[\vѝnY,J^~7hOS&5_sx FE]翢?k\TGc _pBƎv X12~'L)Z=gSk)Z=6D^s .ҚYk"맊 egb#]a”I+?XCa^"laĜ??>9Co1Z?Z?Ob )=Bp^KB+?!pgyGgDx(ײZ_G# ΏUs/9;/rAG^rxE tK?2|zײʕ+W򕱏^GG?"lhrT PJ4N<2ˇ|Ms~n>JpYVC|S>#Lw8j2CǦMƴíO?2,ևu*OGCoi=tk٩,SuXHݳrE:YAVʧIaȖйy]h%y*Zgbnfgw~uꫯ?eNs:'xןRO@ga:x= a&[=c#@2ijx2ܱ*0+UN MS'kiÀj߭ףm|Hk=:*d޶|S#>jk#t&W356 Qy|>>S5UÓ}7jX 6;nǏЪGtqE8?|^Oel9Kaxˈxa<F=5>tqG^O0e)i5ϬOWhiL{ߺ<,9wVgפ54j복Z4c{D_3q)w%Z}u_د_8̰jVM{w_f? Ae_ hR:٧YgSm0nXٜ~lR®aXch;yM2w \/i ks_>%??i6\c)G5ȡ9 Y8E` R;aeեXH'?t-7}s!+"\ysΉBU}k,q:~9(%ވ-Z)evp Nzǖm-ad[kht?C -p 7h-;Y+$r,7N;}DZkqMUD4nXGdrQ7zd^a-;:n9BkPuϚ sd34|.9ݑ3frt_Dq Cnc$7pm7fjbB;8Nmi 窺mv< [wp{tǫ^ vua+.V;uksg4$%"Ey-tN)ܼ]Z9pVB|g$.5zMlcL ؾqg'ѓԯU=aݚ5VÖm?? ʓqkn?O_?t6G ˢwj;<-d5/Z:yzA R'M OH8>}A_}$2U>Da.z%Z<WAViuxƸ0ƀ_mR9DȜ&;dhoj"Vӄ2-eogp@-[nDhN>.ӣ- +z(.QkmkΣ1?{@#V<7`:ґ+o~2lDW_n#?Y>1L ~b_C5inMٳgǾa g88F wB܍kauû\7M{2wi#n0>S:&I<5> pZSgS35tk&BSGnOZ2wΕMټaaьMmkvIW/M>@&[op_?zlG뮻.s]]J'+5D_-ݩ5G'"gi uƺU˾'7-#ŋ,W\[E֣d?dw6OOax25Op=%KqOC5_Bgع3lv=u^oDcͣqGKo)<"n#s" S7x?.>4X+5x}ױO} >O}ߎf$xٳ]bq;t||3&T"DqԨx!~ZN,ivqx3 sĴE'= ;xFHKbzΦsq `N<(BNI:KɊ&ºq\hSt-zy4n1IߤjԓT\#Mtx+D%eRa- z~d9|Dғc- m䈑a葡Yi׎0[~}l]cPk*M&wvoEk' ꣡Ǎ c zRgPK 8FM ƲGOZ0uy$U:H@jQw⁔6=)̼ЩZ&6L<ڳꎢI<]n-Hd2}<.QŬ@SdشB*'>1gCFQ|ŋ O~-!;mƌx׾}a9#'? w^xW=ihБ;ZV_3`|GݨHBx-S{=O ;aJa~Ƀu۷zZDo۾Vi(?htG13nB#tqݲ={h(T#O8g~2a5bYD9s'.;ͅ.;$D%c۱sz[ Mz҄s|+Y߄QDNF 1ۘJ n׫LA1wwŤJ=zWun-4u+* 7&ႏ/L^`-Jh#OVhU6{6T 8'w|i?5ټ㿚+:G|黟1Q~?v3XkY?ި8g3Vs"kp">At53ף{$+^xDȃ('Qm{^?|?ZFGSժVHo߻OzDxAk;5թamIsU>Z˰ŭ.c\ .k_VaߡGKԃcaq!xeرsy!;'TX `U p4 ~C/bbozU rU$ld/ ~q-vyߗϊn@H} x[u A4:=9P郗p4wNTV*5iv߭;N#FUB~鐫^z=2rd@b^qO0+tkM0,V='[&)ç(=ެnmh:~c$ ̞=jk`WIw{`ia6v m֝Vhk}j^ɑe޳(,:{aXpQX@עgEVxj+f:0R\2 O]9#'WuӟG= ^A]WO-lپ+~^b+keŁY\@PW wd:GlZPmÝE:zIƿonpӍ?|ɰ͉vkXy^Ԇ_:5vϬ.,X% 9`m?XWHm0Qfm[I?~XCTl3"63Θ-tEʊ9{[#'U7Un+(JF.w:˞--/n{[ŀ#۪E׆'߱*kMyw+,.z_kcͺuzC*jfX_Cgh,H!𞭧_=6UlIoT݊WH^99!^IVb7([>nTKx3CIo;Z YЁ o]P_^?Ё~[lȈWU-JQe1W 5V]we1^fL g9=`aW[ ̜?7G4?]K. o㗆/H?ҭ'ZXp‹_p酋—㾯PW&oO+F/>l.j?OhعMaJ;/O yYԞo7JkYcEV_).0gNz;0.Cw;2^a7KX1ftUF^.ձӆ4߷{bR*2U-b`;f<#nek]W|C/#]e!yӦVIȞmЩ0Vj~[acs]Tޣ^͎GlMaꔉ«_@h|-W_.Z47_ptakeo>xa>nYaXWicGaj׶]jQW3fa&{s*2EO½82 ynMo=H¨w'kt\bk-rX>lϏ.l=Z5tak8OWˌ?~p׹ORa/.{ixɋ. _}/{?OytNsG;t==G6{8ĶuOs cw0=^t汯g~T۶?p% g/~_x_+Zkq"YOAmҤ ;l|أ9V>pk7T_m_Å8W/ ,ZС.+ 53| qsc֥ׄ1_?3oݶ] ?ۿn':3lOEH~Q/y>R߯íjo_^8,abAL*'yF׀FXdsflX޼a͢H2䫏:yn qN;VY쁢$X70ŋfR']q ˇ*U8½1orL+7}9^ONrEȧ}:vVVh(J?mYnhak6V]hxbry;d6p<98i?ҪӲٸ1M7ezT;哔 7:' & L)o5G'M?%g0vv a}Gکno7Fj)^UyT^6~|n1-!\?lޛ/n}sh.oU2)3c#x#ga{4rwM? m>u櫾NrVë_wLhk 6nݼTzt'="< ?Qzc8T)CwnE_SuXiulh,?B&L'NW;oY1Y;"^GG7l lܯ_\7O@bKW?@aڰ[$~-+]z =}SwcW|Nƿcm_~7*|_0oѬ>^Z۵/|?*|mᶇ?ޚ~ L7O]Gƒ, ;}nOke/~1?Zt=aC嶛il]7ư}V1Fmx*o>>F_3;wdM!OEi^Ok/El>eG9l߯ ׽,4~ת8ʏ,՗PM BY*`|JY#YO)N LUhطjsWƫ$+ G~)9/oo-[7Wvi)WqSBlTCүTm N8o9D6t>'{Ó+oKe_៯ѯ*w3W_nM8?܆ Rw>oTyr٣V}VACocS.C"_q[}A Cx#185>k_e_0A8XeޕV!/y"x ql w র}֨Zr0186yzgoǫ~Z@|<W߷{7i}+]AG6/=_-UOܥrp"(;@>ci>I翴Ӷ;Z|:ְ8a:|?&|maG:<֟|0&Z{+6=eM.GU-C:Ne[0uryMOyi͢A8C#/Ys}7īnˏYv=$>ְaa݇CWaOϟ>OG#/uaK੬Tߴp/~so<`_vXw+?֊kcӦѭٸ"9z}UaOk]O} ǯ {y?t=?]3swD7]ҥޥXpw-U0]+Fkhdڏ ]WPdž/<~@_wgtY7^7lj?_ˆQZKo%{ݺIL {uh{M?;oZGcifpDi +/6Sxe>þnЖXk1-%^Vp;(њ?Hv̓M{R2q_Pد^O{ _94##8' qb'Szp@#\>l1/<[s 8YΠPguHyh|i/ҝ1kRV V(b^g j9Cv=Zޭs@h.4%? ił6}qvxxeg9ho|2gƼuDJk غaۣz=Kkh6*܁力Hx/SrEVu¾`56 tWZc;4'g߼!s]?k÷oab0W'2LlDxg>^ʰ~}~'esp״[lʆ 2a~[X*ܰ;n=m~򳟇w|LDiZLcd0Q|# +X֬z4}>5Z,^uUagh.Md8:/냞:`/G{[]|H>T6o`񝯇=Ԏq#C÷%ztgXI1y4=ƒ!-~gA4~m@co ZQ>ᆛo ZtNxW-/dW]ַǟݖ] 9v*u]1rhᢳ}DV?^~Z$CO~Za] d&(kp2; e[|h~o3gL x~]wo]6O'uZhdžvX# ~8_| c5N8M}o^aɕH}>ra˖⢠n?67ƻY𽃾1z]WK*ŕ>оbm|\4xʸE-ϭ{EG^LyOWZݾiGF;n8v!;6mStdS!\SHgV?Z]V1Θ?Osv|~ceԥim:jXbs)wq@Kd=LyQ颧a +w9" m]>?kzEazm5!˃_^x+?]E$۲iMM !D4AAP@Qi"(TJ`@H{^ܝݻ/o7+Ν;w̙̙g!NVؒWة,ypN@UF$)/|e ([l{3ly ɡw~=(+'PxZ5ƐZ?qdGVi1_S6m; ;wY?r)f+XM^Wr^\]-Le홟>DžL[,\p֬O<5H(KGnus?~KMV5aQ},o$&8ou - f)oiə68HK }u6>o wi\.[grœ\gwb>wO&f>9%9hnGjK 0Xj]cy'#l̊4nyDžOjYZٷKQOY-S캳΀6_.?e KV؝eSgbW`TX{?eQty}qcm6 Cb`tq-0=ބivo_0~_s0s[Rr#YjtSv],{eVYs 78k?I_D8M^ۯ(?֜ .fh>SnQG}bHs}/{?Ǵ +Op%}'5)e InI~zG5V/Ayj/y+!\ BH=H ᣪl|*e܆0zXIIGðPu*GuR_*U^ؘ띚Cg]3]{.ݵÇ{7Zp#z W^ȳPdig!:+Bt4!G] R0t9~m6զZiVnh׶eJ@8zq8[rAIUGimKmۊ7mֱ^k̺];֍;l]MB@ ST!2}_3Xj:w;۴Y+X7U/oz{GmQxJ!  @%gI[t;1v~ֺluL$5֭S ֵ؆ftEqoC!d*a^!oOL9}N~{w,[6y]WlEm#oKys>_C@y1D{lfH1QYưjʩ@RA3s 6lm(- A3ۿz^v#̮7x#e g:]q/ .2l`vhhjQ^x9)ʗjf{`a|iͶtWraF8vS|tWl߭ŧ +`;e1[l 40*6g \f*;z(ѵ7VИ_3mZ1{lJr^j{zn _z>T[4%_gW?}a֩M l0ڹ]Kk`뀼`*֞mI)z;0b= f"?<}6K,Z"0$U&AQơ_sm5ѾQFƕ, ? fi 1j$m@5W-bf stWj]|4Z`أkrp]ݰ#1"/oe<y6K/=vޟO{_Y:8QJMHla;ydKPu4Gڂs䈑,fT{ >⽦dL@Ќn0ѵ( \ʐЍo-6婥]$9TāCW߂XeRc'Y~.PYQ,Xk7v{) O[ػ3lclΣa5SUi/MbKkBF\OC-AY?Qpmx49ʘl 9ΫɐU 9O|y(vYC{p2t?ǿ?cފ߶o{n+svC_q٣QOEM#Gc}{ hECc9Vl8KnЅjZ?X2-<3s"XIF_ݭi6vׇ- lӬg슴5>QKjhs tuO}, :THrx@`n,VKՆ]Z }҅.#m6>|۳e[yzR3Zf$! Tf"Ho(}6. [ymF"+Z^FZn~/R1]2uJViƶ_DBVy߼, ۀ`;vZ%6ߜڴ%˭9;`'NY=Vo ޕ[K]Ԏ u2^4CsEW=ߝhn-R֩/j.x7_] MQ֙ͪfZ5Jع45M0Vx9{PKP+ڷ~z!y50-G!DKJWG͚kk \R O~y=>Z{SX*Ȏ鮼B9p!.~~qn[pq26q"d6íyU@&)yT0#]2|T?p87so xb> ,M;qDwKگrTlf5[ۂ;0hՐ/X FaI,1!.Ye?B(fop }rk;P_q?fY=˟! x$&&WbvyR:"`گڰyÆ 6q$^uZ_cr & ay}N;n+yh gj7NU]ra8/ /0q?/kp0aВ#AK_}8%Q_0bƖp:C|e( ͇i֭<iї)&j5Rfn-vltȮn nMYJWgf d/=s1_nWnڂ)C߾h_~,g_J>/&aZ^jx%]9: zW`0QMsiϲJZj'n(`9G{uvb ߽ `w1J8}'`[{]^xBdDJ g9`R,8ao`*G!d4o|aKY>Vcjb;y6/]l^}r:\axmm_ 9`^(Csz3֛l!E5?~Tnk` xڅ mdH_hJ*KH:ay^%l쫣ZIAW*8` - %bKm&oZ޵wY^Qfc~imLyƷ?09I;XjWbX"F- //(@k()Kb}3;DNa?e\`RC%V=S>y΅R*(Rŗ!β[Qߴ^~ǎ;~:wiv?/~~NmD".|we8/OS`f۶p$ alh;L>ygRzt?':n=:iw%CkY90EkB)2d4[ H$ ˡ]m7n&9y:F;r%nGv:wdhQg?/]VbEm^v+)9= Ap wgLll_6WֵoXBΑ|(=~V>}AAN#:޻zY-12f0JȥgYzG4ӡo뙖%K$>dgR/Ͽr꧲#N3w0ɥ/O%X[Lnϣwdܹ3TAx ZU-kab袞8zy*A`ߞl`l{xVbzuܫ\SI:fD2 :Y;:J£j~``@Y,WYKJ ٍiok}L`e )XPa~k8 R2#Q_yQ~뷟Jڽ{;bg?佃;*nMґZw {ͨ7:gaGAw+Ae7[9ay-"MWeiW>aGN/gUW~[lO?;M77{ٶr*Be:GGÇ )~& pNN;%-rcɨJAH4/20)22ln14JcTcpymw K.e\upRN \S?Ѩ _tX^T@Jy /K򅆀%0fV##y4##M}o-Z8ߎ34Φ?J &SA_U-2+mX?xDZP4/I'm/-M7ߟc?Dr ՒbXw-vۄclb? >\oc֗1(*,ZFM})CO*Km+Y;S왧&Fa EOC? ɫvՊДjht |$/nRcmCޅ&%%~m g3j::^-|:O䋾pcNdZW}=7q#ZT 8"XhF`DwBqܿfz;KS>ka>ڝK$(pz4zAܱ"& _˳-b, ʲ[inYnO Z=CR >~=c7t{eɹvWJ[kOy~A YcqX1Le<?-_H?xppH<,n -?1bعݺY*x;yx$HL݅Uv9vË]Z8/X1.\46Sl]u؅JdgD--w+9|p(V_XfϜk׬F0*VT*95_4_lBGn;vo__ªGuɿ{KLJ^]z1o}˳;d:h(zŽǸ4/XyNPv_>)^B5FkH'8zR l'm_sNvK ~ߓb<!}{ː9Nп6Y6O&m]L5R f-j'!CMh|ygݹkeOU\XKƣ?WJB-3 j҇7ZرcG{7\4#e+#<{'ؗ;';(* &4yx[lPSD-O}ɐE[R.C&Q?[DEsr^ݐ}+{˖M7A aӊQonp0~ZVX\%OUq"MQ^ hedA%$!Ke8pT;Z?MnN^oWtʶo WG5\E:Ā(]k}qfgsFz_#ܸ߉Jgk$,*Lpo';]h3 T}*%Qs,diE3'|?-N\{,5K Ɣ,ڿl2[d[W4tH[J5kAQMˣ#Z++J,`$4@IOEgt+<Ϯ['/Xr:M iV./o=ڳKcB(̪s HsHYoUj=4۹c֌5""DE%t't&.R^aC]Lx%ʈLI-2'/Kwbl࿄zOj`tJ[Koη9Õx@Izi F(}st~C|mJ:Fym۱^+F~5jr<5#^P>\%5kVh/G혨X24 n;I  ៛M噖#>r7=Wn{v`_mwE =Xc r_H+EKoZbX-}ܸ[ڵi/֌0ǔdm1ʁC%*'P"xlc#v3c/9j<`RYh_qy۹6ůE=0:֖\z{kG`CL0ed ]%/:,A^=! Y3h |6iKVp?}T@m"NOZip23 Zq9u@+:xb)Vuj~>l_Ro6~GbDiɑٶe tt 4{$ۺ:n1(jǿhJk[Q*ɳ͝ff?␅dގ=^]=IƁ+B:'c`xfuðG[<O(Eo@aIi@Adh__ОCG[oA)1kkO>e_^O_G8N_ZD҄f 5D-ey4>GG{M9QvKď.4SyCx _kG!9<Db`nZx*-<ggrK ek^ݱO<-m[1^"p=R|9?+k=~g哺҇pixoF?"__ 9cQo(a*#'0~Q/9;W/m*.)]OҲr;+޸yzXnٖݺe[8KnLѬ=$C`ܔ%\ޗ6 r)Ѻu+ # "/)%ҧ m]gQ ,έ`XcB &q1VhY Mjp+p8{Mj Djդz_}>zS#4@N _Wg4]|A(4^g"ܧZe)_AWi26|ס+GLLoas_7>]۷)|R:LRYޗ2H&Pc w=*ClkS6G{megve=kq'UId0r@3pAS1r[/)'=yv q}\oSЫ}錳!*ЉۇyB q=XV~puδvmA= J>U\Pb)xk% LD1K6, +֙8q{],\Z b;GeZ g;*FV־M{+^b@0p#" JZk OhjvTv-۝`w>7 &y@?7mm837k+(EXE.Ks"}o&n|v ̍]0 hV vvZr =Q2X:cnuēk:Fsp_W/)WQt<憎.h'0PWH] '4wsڎQ+zg?Qהk,گ  |I 3\ey-ݗkwxwF2TjJJIUW -kq4V̸ڹ'? _4S%jތ%1ʨfdPtρ?\6vQFu)և3wA+]-In0)^_~s=pWP|x{ӬE:]zwV,z xF݈ݝ*;2<*#>[0~-*$%&s!rB0*򮓇D%tIp>Qqny{={0ΑO<\L-ԡ1͓=NO2 Q8ixqߓZZW}ɐҙl2uP.钏 =¸w2G' hfU.^scֳjKJv@٥՚}8⻒8Ef3L{=r v"^([+_n/wˆb|:ͤ]3϶?B/(z4rs! Xθ7qSkي"iǕ%gıE%&v A:/3Rt)?m2:okP=y)gumcԎpM GK)yQq#1< HejXsu!`I|+72_nXr1Pc 4pR:7vٻz0"? xߞ##Ӻtf+pF׵Fڳ3r6p֔]LEP|:ӿ@S;>_bt89Yأl&敖 h{.>V60^.1n#gx'Z_. t<^v)_01lG2&ZIl )o601yCZIuwuVz8N 3mڴG ?Fأ:ֽyddV:+ C4VgzGg_Ἶ}GyϯTY//G)BNP[r!t_+@.%(غu+.3ԭwe֬qe_Mì4h ؤ4UV_(DJYQn$JIB, АOSAmZij&6Hj A<)f%P7䐊4~)GۼctAh=DJ}xplC۪5kWf]bdQ>[/ZfeZ%w+0Fסʊ;|fۡ 0 J 7>V归c+UP''y|n5މl ~fUnn<4#%}'Woa=w`xK6iv~v۳aZ|'z(:`l_7m6Nn{kpw7K&F 0.͐(RI9ڱ`۸ct h{ꟛ0rxܝw|'t3Ե?G_omGU5#Kje۟KP76 "^@mИι]-~D~u-[h=諶jFG_V *#!*SO8<|5kI neI-[yS݈Vֱ3yeѸ0$# w JAez~&pFlޅTR{r'&MPhql`Z_ >c rRY6x|+6t'Dad 43_~t{|@C;Z^T{hQtP"|͒R[~eodnƒ6:QyIm˖m`Bnxɣf\8?6vZL{878ENp`LƐ$?i m0E_鿛vrfW^xvCKQݛJv:.(βCZ+o_f?[gH5h4 J$^ג$d2/i\DzD| eM$hQmٲhTw˔p/Zv/lc#@Vq؍_ObbKS1Ғ52egC7R%?l%Za4[4Fk忆ƿ`tx;6mN#oA.CͣP"//f#Iy^++ kkBkdHN%H!BWh5gDLOQ^wkAXZ.H't]r n9bmF..q&7y76u{Y$bF9+cb<~mFR'sShٷIxp?p 'W .f}g^G?wg+bڀqV ap &G5ickeX>aqJ_m^:d(Kbi r,\('PMWÌFw6yS7 [W-{9]h֥KZ\x:Hu$_ŧQ?jȣJ9}~yUzIt(]5xG(PzYk?g_kP Q!$Î!?77T)]ϽqH+HiСo물>{+ݧxS^*ק>< L^A>w_dḚA7Q2X+\WݮIӬBO]]t)f uζx6_p !(e@j3K,4JClJD$(OW7%͸*,l _s %; JDucz?OAU,2F`V^TB(o,ҵ?\͜ 4oF12\?zϗtC|ݫ,۠{\Sd͔Q\`v"QIr,gfƪ؆fFk[vujkMzwJ<#vO:n(З$ pWۇ+Pq;_A]'(/6Hъc;=XL ;%cF)D͗icXh׮X<( (S;| }>7.m'c(ε#7hu͋Q[>8O .~I"nlޮ B Ƽ/ơ^Zڷ غ Dufv[dY\l][ [YvA?૿-q;ߔ_.IDoN{pd^L*{k~Td`eFڄY% a <`t \*a7eK$.yAfsFKϼBG՟zz'{i?hF}'};AO1L!HlX4][UB"InggNu] j`lRY('Cg#A+% 7Kjo{ݚ= ?)#Wv魖͎2bXLu(GO|T*X2$q vz,'Z`LBjZ6ȵ<*ܮD&Th:%h KKf %%Fege&-- ^f5%5e7'(c@'bftZ\B.2)CcMk4eBYf4<muY`kmdOc?3udwng9UpOء/j8>_ 4CV۳{1eT6(Զ5Gư'Ok»ZYk;cc,۳o7c-Kyx]cOP=oG׉#{wv5EҿQFӐۊ] 3YƫThߔ7i~v?ރSBmPd+5\6t?HC=sͻirS?boW_2ڤ ۩֭#N" 1ӊdEƤx}%z\ INA*3.6(YF2ޗKޟjB~.i|6DpV}p|uvC gYڗ-?k\E\Z8o仺V{ BB2C#R^ xdʧk=STBZ4HI*O^ eRJϾ<}9>F=J =Sۥ{=ӽ7>Qk ˘Mdy.ҝV̟ 3h {w #l3}DzXƘOU63+Q'ECrD*8*ء Tn`{Z jAM8R19?_g1a/O-JS|9O??R_)F-m6w\KKO0m//_B|3b uf)CzVBеף}^1''G'>M:t|J_>uNyu8]ךiV~Qp*DaG:g|9B0=|~/-G<&*z25`yko{oCwtxx/(`WMqcILvx1d$(rpB(+C̉AKQ@Uqu_X3JSb`jk%:2PJ w}2:wzfy=R\+BAw?KǦx߲ x(=_MiS?-5fLFlRLH)?E H'f=K^%vbiS2b@GE8NqM<n:Ő3K\徯Ь$,@jh+_X@$cX09 :8Yny uLa Rr-ELtO4]7y8%E߄0 (DJ^sę\KEj( @hjaX/zEڵ3˚|XE/5m*X?q \R3LxKcT<2s8o2fXSR3a$uoJz͘6Ӳ!#<"ӴG2?~J)OGɵ ~M2Y ΔwȐlҡ^ ֭?/[N0OS;v~FHI[?4iw~~Se[|{?`WKpZd^gw{PǗN>_VpZZu#}^<| 6B:nt@(佢LH&ա#O,z!UrtUGbϿ=Oi׻>^{_o4 2rƍlw}+˘"QIC {W^b E+jTmySE܃5"ÓvR)'n7 IP1JHy.ORš2`"s+Aŗ K  W5ߖm!vKFd|}ij* 2VUBœ41Bq!LF4x19R!F\Y/V¨ѕcְ&xMO@IDAT6@Bw+%mFf*($ڢ% n elh;*O~vZf(}6WeX2.#h|lCo|B po[^tZ0Ղ]5\Β."D^=o_^:nN]xg)ZoW, O?:K[Kg>OoWFxL ~zS<-d!M?MC8t?i?uDtL?߇=iGTCFskgP=??j>Mgk=̿GwcG 1 @ hK|<ѽ0*N# q0ga`7ÁEQ>$b$N;$J< 2iNgRnYo衤"-S$o"JŐq ULJMbm%2 CB%UaJ2١܎|-7%4%Kf/Q/K0Q#E¨KP׮^kW,l\;bA bA &\~-?覟qsdI OY:;J s>Mg(Oa<>|u^JV#2Bޟ_:}p~Y‚;GSH__HwNW6='r=x_T'Cy.,$ӷk'èS=%.ImwֳR uٵ4swR(BrLYI#Qcxk1zTCg7]L"ӉVVZf% =<³0ZV$QDQWO"m*-z BkFjIĴRy-ӓS Gb* -` >:Sym̽<x􊇉aH |ʵ?T!^WƼ hH}7^%`$6u bM F12-i@Pb00b0!ğNp>?5-HտkԒgҽOY3suD+߇ϺwZ<4]92?釜 @~%i< Z,>ý{hm-vҎ?U̵ U\+) %EBB';@y(- /v3iv@4+hf)CutJ \prXx }Ki'?'-ŀR[%X(NfᵓTT[W f\ʮ1bxk1zَzM9\ ~"Qd_#M|M!l7hɡQxx]qXUkpٍk,0Q&URzI^R0-7Q:F9( Zj良Q7qJOv|-v_&DV&Vw%I[5fDbd/V7#xiqix?111}-z?~O NudgG~ =Y? 2FaJ* ;{$#,@%AFҏ#A2pIGw1Z`Ջw]pZUyÉ2],28!)!J"(ΐnvn;|r/eDg)R!{vJmVAi;e%&J>A݁ߋ(ZUhvx?rKL>G12>i{_ /~:?GEWpAJ]y =F~4%s8OkY:tֵdzk9ާY{}wyk%IZPUGc1hV[Sɭ;V%f+j5A-Q1iI[M*<6VhVh[V TI N*W'_%a..fDDŒw<4SN1N=&+uha%w_E08Cߓ csX9/0 b5kZJr`X+ݮAwQ7 `D5v閨`xTah'v% `D=U7=j ;&Qޯ]@ F%Fr=#OVmX^zDo2 :oeTɸ;kOQ}xh'/UJy\K="bxk1z$ٰ_|,%6&䣘| UHB_=#P!TI!&JKF#u?]Ģɇ>7 @|JS^ֵtSY?7v2@inD;K|{e{7|{A6x(  QSjgR*-իIfҧdnL΋ l ec.xv aq>2x]*\gX~Q)c!\rsNc]ѲDE~ހv"`WJdAާk`ՏP 윷ߖ'J=0*.lݦ-VYVBɁ;hc.خp#L=eY̵O<=T`SrsPbh(Ying->|rKYM ~/xA;l>2l-5T:C'> jخ@'܊f@bx$k1z1 bQLG1(&EYvvзЬbz3l"JPZ8tȡrC 8 Qpul,t ~_4XRx[ 6Zn'O)rr"ŀʋ (0!QJ^C <+,NP-|?ѣC>ʡ+7jΤI?Je=  V\F%侭X|I孥`Q>%K(hQ/ ŲO՗E9wP.f q*O\ØyӕJ)^2C[c0F-^vgG>hd?kmAZl'CۨQ $" " " " " " GWCϸve9#)5kmnoqZ3kT~>vG\tU>LqdyoRԊH5G}K^^(gTgOVT RB(1()K>h.e& Vu]]2&+T)-|-XYANeN&bZ쬩(njYJ51db;AX>dy[-}Q3N(3ac]e*e*-Ĭmf>±_vdb&ZeI%5ً#YnlʋU,,08ba-hWD@D@D@D@D@D@ `ٳ_ʕ+ѣGLz9p;0̓m6v睷s8ş}wށ{Up1ډmkR%+k['T95Qb3EB:v#knnlECj:%ܡc0!тV3 bdŕQZncOnZot\c*Jy &Q DZ]^nSVk/btv"iCQ%E`ӦMq-7㥗^ƪU0t:!'缴wu?y2F;{] ({OnN˻~{gy1;n-lP0sUaf1mqgjǻ>;ԫkW|XD-ox2GoCE;i9@5(DϠ6݉Lʹk=\r%6m*ųgyӁM$3AYEu64nrZ>u&DXDZZ,.;ώF+,|ecm֥;;S$s&L>)Pe⛍+6M:N Ğw|W&|GtRe˖]0//7N8ʫYʨY1ecgPS ed*,,3<7x'7Ò N@RdG`(k)>+g]sz#A7Y{7ܾ=c`< ڷ]"f*~O :Z ]zDN0x`|Ѱq ''wN Z{pyԪ%zLo[&ro [f v/_;޼Cu4>1ݠd2F{vjFfLsp),^T.•GET;wDH ?cڶmst',?J(pY-MTVP:"(3ZlEo s?4YsLDIԲ!&:+}hwLr [}J^}+IN@)˯m\QjD [g}xԌcBc×/xKτFm34#ޜ|o`$?-}ZhlceFOj#CIrB}(ٳkvJI؍eAo`fA{<~()f@eiRczEVV\xôn^f T?:kӌy ZhMw1{͕0Aksai;$wo51Xkѩ",lso!KK9w*[<N(8w5,w;MgDdYUנ ,6:ʋ.8JBR2aod됖W!8o-WGD̘1(Oщ) v[.HC =]B_vC!_ jSlϹxR\2KoN~NԪC>Ŝpͭpo`12VG:e+oxk9a<1]pG6 =M [/Oqy?(:Z-ف~g RNqOWikKwSo -N=Yxn9gT"ߜ NXDd-ؼٮ;% SXTL!?P\-#Ś[l;#<p05꿬):+\tي2>*2Ԁ j7FN|)$@hQ&h>+;-[tQ"(Z)5),8!3UT ъg(O<Rcx̿,6aE5u neԹr銸z뀖^#9f:خi~a)Qj2pBm֍IК Iqt4F@ -I{yׂݹ,!# -y_Z>ET/sS?s;d9Z|Ofv.מV~\<]kqW7{xUV?hݫ4ؑ[i?uUy<_/+&v_~Y9ӧߊ~nذT>2Yh!6ﯘӖǛ*ͶyT8m) 3?GaڛbQ)c\8].=ռ-[f}5+H،c+k{ij㲩q|-%a 3WIst0[L~yPi.g5%Dd=xɂ[9S6-w&/f?>2k*e?݂? Jua#?.i;3 T71J5-o`t7ܓx 7÷?e^x0ut~m򊈡U.ְF2Ń]{)ju YodҢs51xo0uXO#00bLkfcS"mXz796Jcԏdo߅]rT[{oe`Evu2lYźqxtW~N sOǝ)gUSτw*8J `G:?_\84b?ř/U6cŕv EW TEӟaش[CS% i |ʻgpNT'W-Pu pd7b+V}5 iLD@D@D@D@D@ K.믿 'u/`%.aKΨ2k2wm֪ycy͢ר3 lKFs(kƌT5g&gd؜.a tx 1qNsO7cZԝo?>hʄ6r!L2mY V,_ͺ̘DI^2k̒u;nkW"X̬(0:fF!Ȅ'{?78=:b8c΄!Fog^c+6փuLb{p& =ھ/j{k?WAL`eӦz%!gR]47ٿ\dۖp+E\r:k~w<۲*oH{<)#Nwę׳vðQ.ܳ ;ĮTZЧo?T1pCjY0cB7̚z8k T9֐& ċ/ ED, φ+_ _M62)3!s0Z5ap o]y z̚k_8{aȧ'/(ixs\jKXuD,j89ϘTBĎz :ox#evsoՈlS*DqnxT/nyxܯqŢ=Z28# C[~{hel_93~c3c3gNEzt\54}Ϳcs21g+0JFv` SV*Ĭ_<2h`KF񽉕G~A՛qC{uj[y" " " " " C /R|.:V?ЫW/L81U6YC59m,Ǧ6WG{F-4WV&X˼ߦ\缻EC X3f 16frb3u)fY\@\. Ƽ*q^`Az5d8M>CIᆊiԧŭ eS]6CGwcǸZCkygPTi{732D! KgE+P\"V*@ V!gvAjrh6]HeƂ0@-G3./"o'Lۛ㮛/)UNKcNS|h51۲v?x3_(/{n0u')[˗xs[S2Q͒Ԫ>. =zFOX!h=\m!4BLE5`8kP8OyI;v٭xl#nc֯Oy .u%_.4t8i-@&+1/&137k)|0܄#|#X73?(E&AbjFJtd;6B_ aNiQ:WְP&^EN> | ʹHôS@D@D@D@D@D07BgT҄}4FAZsw9]Q|O+S7ƒBWX铿[VgR-~2OLl3bQ[5Õ gE\ݍ99.8|nC!7mo26Q4,jL@QX)Cgb!C(lqE6m`ᢅ_‰4|<\GOIN cWY! Wt{qaBX} &o+&Z&0fc2 %5 :ݻtR l_ÂsiE)g7T$=t4K2/6lXXp tay(%Λ3/RNCfe/'E1n);̬jBUZjeOd9ۯ-U1>4ӧ0;)?ө̼g b%amp܏ؙs\!"-囐z\ٻc(` ;WxusYŕ-wE[Pm8v.f/" eZywvMG҈+1\2≿w2]ExH;}P̴rׄ† hG 0opΔ>x ,ؐgO f_=Ah*c 2Wa?j[D~HAZ_ZD 5&cw«>E؍%յyq]k3" " " " " J`ٲei!eHzP-YaYfaOskw ĿuرjUE?%%XJA롯`W[:yܛnggXztY31C$}:;C;.ǣyyYmqD' T\Jil5U[9و"97:~L3w>Qܹ˝XEnݜIdRhIT?mZH(fپ[D +O;ָ⁷JQh[vh\޽ѾCGmJ;ս+|[WPk1 x71ɔ)bcx5Z2K3B}{ _'xD)Vt6:$b;k2m.2\ݾ MԲ1Z*߸X?rE%"A+=qpvnڷo8e&?sGa[1\-ф4ck2q2&0ڔhwVu'd7p"m * s^71( {3ჅpN>yx7B{1JԑRbx4g1YJ;eۏâGYPa!U-4C%2.Ӆ+Wt?[ǻol[njBmM_پW&z9vӆ-w%P8 0c̈́(Sq+$dNdYg~1cNNG\Z!1{[f͢\4I>r9 eԅ_KhT\@qܪf/aloJw2[̱6eAx>v&Y處mpQ1M\;)L%?$sf]e" P&jN(`D%=˘Zƥ;O2uLaV <{lkq|6.h[h\>)o4u]+Q3-KSk4OfeҲV\SFS 2ڶdZp-GE@D@D@D@D@D@/>C :i?cnNnls<ڢpwsg%TGVC,ė,e(pśPR\2!+>Gk'b-$=O+ˡYFR7+#Q%lO%uyq4-İR0ncD 5E׾YOQh&6bYX1B͊TF*j9IҌg_! \~{h,P)Q@+}ڢItKjT),՜Y=02?4X*T(OD@D@D@D@D@DP3vΑ9=y܅PIx<6W7FΩټPX6:&q4(SnL YfdrL,Wj Kff;2Q'iYt'1Z1Yʄ"blP9 0Y3a~f16WY e&z2muۙdTkjݦ 6ff:m;F$" " " " " " Kb1怒 ۶檀)l@IDAT%acҩѕoN2?WsP ђ* YYM e],+ ZQSO'fP`etktM 2Ɉ\~ Z^X 2HKxG!Zj-Z RK9&Ũ[fEQmMDAT+ŕ ҦY|/:+HeՍ7 -jZַY933"kU2* 1 w`.L(Q31`]{'ERZQG^E,BN3F8F,k3Fd; s $9T22x^x(\]2- o xx(B.ÌB,lwLBvyyYU>G]A!{ط=GC\81sw-#6;0~w>ߐRgk.bsښ>%Ni _輜4^ gP 2,KpbsWA ~ƭ PaBC< [q0.! YsVg7G+a&̸?DhnԠ(rpBG8 2H%nl,C*ι&X Nc)4A*L[YT/UR0hB bw0xAgI՚X2ca3O=1*M(iqT.'Ϯ_DvLsML2F5z$=&[1:ro"sǔ>Kicdvm1weL&s&$[~ n@*])qcY fsClpL踵5+YJk!FEk>w6_YͨkoA#  _˚Tqnp|fzjVȂKsEBYq),Fn疧M๰.tU?/)BX8jEN-6IV5d䬝LVF2k!/uNF6+ZLPe)6pi9E|$MhUiuK9)™Evڮn).7##')gh‘g‹}U_LL Oюb?̍QDdnGP13Ff_VG$ ru̚-{h6WD$2p(TAX&g#H+㗝JwxW$ٲx##{,F㊣օL2/']/Ź6̒8cdf_e),Й&9һ#}g~#}!w"iNk%Ā Qlwv4L+sJA ex*@T+Qb&롹gX"v2_ q߬}L 7PY1y>e&;QP d;g9D+:Q -9E-G1+seb؇͗\Kǐ✍՚779`a7~i9һ#}g~#}!w"iNtM\q,,?7{kfCYZ/bPhasFhN$j5k&B@V hN$j5k&B@V hN$j5k&B@V hNbu" " " " " " ͗@N{FΝ/]y%7;v`P&Q CD@D@D@D@D@D0A롇Bݑ-Z԰*^zc[oUV %jHE@D@D@D@D@D@?+=zpZ>jӻ$j ^glzYW$Qa)I`h߾2@I*{>۶m R@ nf{F[lop%j$hE mu`TJD@D@D@D@D@D@D@DՀn"" " " " " " " "p`$j'h@$j5Z)8M7#=6ڣ+$Ծ>7Nc]N '?/Լ42W"c]&k= ʌt0i2Lz HoA-ߥP-TQ SQQ>S" " " " " "r xKakٴiup znՏ48%8sѡ` ҳqҰHM"`97"u8c tHITUxEOo>Q!ጱ,?+**U ըbЏ'F lArsǠ[J2!Ց;Jp|kz2H: NH*o {ޙ=<$" " " " " M@pNjy)hmYxcS"[} h\]@! Q{Ra8&,/lFMt LMO?VӮe#"ZenCqvpVnنT]Y.RR1`d! ^FR_9!|H=]͞1mZ=^q#*sD?=+˂L )%L\9k>RP~:p?7 Í;+mm&nLl" " " " " "뮨CÂx`#9jix_)7lѕe9"X9]k`[Jhc9X /ȱG#9ꅩW>Ķ}Ů03;BD^1//ǟqF(P޿6"T HԪ;$"[Ɵ_<~%oRO'!8 Z;gŕϘ+,0 Tô3  KNGzE<>=Yf? O u<'拰`ifs}rޏpTv0+,ZƒU+m^+dLe;PCzex/`&.O/~TD@D@D@D@D@"V=z`ۇ/u0xңziWR~Yxy;a˶xV{ߵ-fbӶmX+t B|ga.m fً:[_i0SO*f0m122y13+7{kH"iԱrAl+O\?A< B]V.hAƠAc1%///Bв9*Pd)\ ּl3:sYĬZ-VZI*2z0* Z_qƨ͘b 2/bH$l^D@D@D@D@D@DIh5矑y @N&|̏KC"kb'h xO7 $/՝)^,*h+`}7#T9'E21ٌu*.b,:2~՜6AjoI5O懙}غ~[PbVEID@D@D@D@D@ֽG+F! [nWEƇd 6r&bPa8o]f>9L\5 mYѰ-LeHϞQQaԵ\|4-SflA4iJMQTy-Ձ$\RbV]HRƊQ26Yܗ;PazՊ+adV<#Hl蚖x^)6`.gĜ?N" " " " " @1?-οx9Z0Kв3@ Ċ^dS9S*\#!M@WI_a_\1|i.5m 6/P%w_Bޗ 1gJfoa9FGT|'QRmUjM=ƌ Zkns_T6`Ĩ{ I}yxS+Cq湓X6hx_ZF&@ l߻RLB۶BΑmo= vՅYй2#ֶ =LUm C)s0v5^]mEo~&˓'M9#,&E:aaCƅ8'36 >Vc,VY:Rjֲ])hI傖-x)o=GǥT/!eG $o WOh<r e;^_k7nڕK*et=Fs/<_e"x Zqq%D_>[IůK1.jӴU+[ ٩kb0s]GZ<4lwR^[^^7ԡS0}hg?-zFaǎ\ŧuZJx@;6E@D@D@D@D@Dh=3@!χOa1 Ţ?q"X"l[>?<٢Ŷ-x]>&:èZa2vxZ/'w,P>GU5_;d~@S'P\/ /i5t@zuХ"d̟+J(NgXi=8p4fЫ«&lNBsPm%2ry\%ۼ7Ѡ+0.&:us>d|]G e~J\] /9ΏD~1eOPPrp)" " " " " M@+jߟ$fV*[+ [N h} οW6][Vyr~05ᢑ?;>WrlUkǼ~^~Hث42q02~scȏG{yc2m)C9Do2;8?leG_CmluAZ.*:cԩÐg4 SA:N])ZʃqlDM1j_b2STı問y˶mOQA. UPU=8i||M8A/pEBpǽ/15|k3xޱW֫oۚ>elXyo2˵c[˳sm&R˱ FmVD?b83slλ ZB*ߊLYCȲf@GID@D@D@D@D@D@D@Zu#/Lj-^w2);~ n_s4N%" Q.|hY:=pF Ts(V-YB}4w|,Y kRƏ!`ԕD@D@D@D@D@D@D@D@DQըn+" " " " " " " "`$j9h {0lש lv4.^D#WM4 +WH0nFqvލ7@]DVzhylذ۷oY(@C$`֭[ݳjϬRa|tVD@D@D@D@D@D 0W[oW\qzN:5%45 Zr?JԪJ4&ZݎvR$:pW\" Q+ s\|1[ bV=V_ߖ@&u)Gꫛj Kv^" " " " " " " "uuj "(TI>w,q6܃+ONޭ1%xm.{/ tD*cԖ~'hU4Cd?nVj=[dR1iH A/Su]((a ȡڋ?0,_iu?a]) ܾ@O.ގ\ZYUE[$" " " " " " " E@V=KaR+Z}˫vgR+%f#he.[;iUVfMkSNnqn SwtٳKw! [qpVnŖ}+T[ ?8o /쎞1lӎ1%:zh-^FLۯϔ_bguHF!̢-]kKvyx8&+ZVV,4wh_^B1wO({f[$" " " " " " " A@*C}Pdh>fTLkX+)eJk):%}Xc<0 f>mb6UWGBI٬8ok3 .sXhf"fvrJ h߼҅І9ƶ b}]8{.Z&T{yy}ѝk_ /%*@}۴zj&.%딄~Fw׬Ũ$^|mv,VHr+:)f]0<.tC;`󵥺{Axco|i>XSҨ$" " " " " " " A@ZA ~.T=6,. ˂TlmpL/'vr]ڊɉ>YvO+sB˟WKf]ܮ5UĶGlņ"B)uhֽmb -*[D@D@D@D@D@D@D@,YqqN:RH[0o)jK_/Ưʧ53K\K_?؎wVDL; ݸMwlŻlVU8X?yquй%smҬ¾ͱMk3%/'Um=,,?c^mkm q9Do2rM&+bt+aW G}]mB/ {,VǔqJBeؼ;Z@/8UWA ?.@ @vQ&"(-afeeo߾_WwGD@D@D@DǦ om?cq2޾w۶Aپv",=Ih~uk_ v:Q뗓z{DL8t ||qU.)%FU׶KpTHWz! Q^0,g|v\d .v*oۊ͍u $]4;F4%;`B Z{ Nкꔣpv%+" " " " " " " FR9UN Zвltޱ_lϿӽڬq6܃+ONޭ1%uxm.{/ tDV퉀43$h{+DzP {XY+xCsI<* k`qq\Sd~2;^^.I>(?,r:WJ#he.[*VI2x ۔[۵8fy&wi,rO*vYs %5M툀4 >~7L2k*‡ 0ᘶ0+Ǥl5 Zbd1{d2dU-HE8;v9.!9,EW]k8DK1GA>wVNk+" " " " " " "D0n;lC/HT.^V@[]?{Uu%B L$ImchmTk{߃{T8AA jZ&jbűE L@&\2I3;k2$.^{?{H26eE N#~vR(Vj.^ мb%H˲KSۧ$iT*+=TPOc<V_v]ۇk@?mP,>V"-9q7šuB P(@ P@`Of>5\O?s c܁қeu2'V5AἪ.*`?TrɤzeuQXָbry;Z;xEBkڐ;xOJi\LL K f,;(@ P(@ PO.3[|E_|[x6oA3 dbtI->A UQWz@|.I0k-F轡R&HOK2ܰ E!C;|d>-U &'+ UWRO:TAiSO<5t_&\K~")kz/Pq20Az(@ P(@ POxOOݻRA͟X(%O_ NCړ꿹kJ2I+Nʩ*{j̳P4-|^'4IKPK T35=9T˕'4~)~Y! AZ&]K17J)s*| P(@ PڟD]F__=TKoyj Ժ^[UU/Z%V'M9e*`H_wOq 2,2YRo!>@ j6]\Zn6Z,2Qs;?nĵ9N'4@+W\Vl6 6캞'(@ Ph.VH-GiKReu}[/^j~!}Z_*O_חUK;O+=EVC"=؇V7: ғz:ojKCI>;<MgM-y9g(@ P(@ PS@fb@w!GIgċ(@ P(@ P {jwan;o><M(@ P(@ PT1(@ P(@ P j[P(@ P(@ 4UA<(@ P(@ P `P6(@ P(@ P(b,O P=zg6lu=OF P(@pS+\)(@ P(@ P"V!(@ P(@ P 0Q(@ P(@ DZs+ P(@ P(@p W(@ P(@ P"FAl(@ P(@ P@ j+r(@ P(@ P#V 6(@ P(@ P \•b9 P(@ P(@`P+bnB P(@ P(ZJ(@ P(@ P@01 (@ P(@ PWApX(@ P(@ P bԊ[P(@ P(@ +=܂,G P@d:o.|FF:`+ðи00v`B^(КNOٳܚmQW~Iux0ĩ &-ۀQ0(!.%3zz/RzZzuSKuSǩ|_eVUUK9& tKSBBB^( hoFmZDuBS[\z+d`-Y':3gp)`ItttDK:m_Fuu5\.|LIIA޽[VZs\ݺukZ^Du?ҥ :(,պƫ~Zz]ڧ*KQK;O+=EM P`zDVvz]2WǸ0^(Ъꏍ*5dC LV=+k=k׮A2bbbPZZ1cܰ Us C] kj $wt< xq^;TQBl #{cw9t1+(@@t qo q.k:Y(qԐgϞZpȿݻwG׮]VVV$oD? Hu#ϩ_P'15Q`>;.W_n~97Vk¯2a(@ TR%P8wY^,I&Њc@xxTi@䍜y?#}zkqNMl{j5L鎋0ӆg.toՎi4R(@ PQ@ͣZΩ2Q[Afܿia٫G7p+zu*Q;>VQsԢGTduz V8q^zE#\!q=ۯ좙G P(@v V;IAYhg j5ㆥ RVRDcZx'#г8YVl~d o|`KsT|ZU.: MMƐ=pR ~/t$JGG/׀ZfZa=(@ P(@ @}tj_9g_#ݩ⥷ H$^Ys wSKic7VcImhzIoJ+e|+ogp#Zm&̊)@ P(@ P#V3E|T@]t4 nIlj*286j$ TCq*ˆҋqFm{Ԙ2J+95 H5'9\ş>=" |g XeF'ׯ҂@˵Va6X̹u6\QMJДY3ޔx55+(@ P(@ t(q;Gт?Kke:olwNZA>Z/˄U/t Um {d j׎!3I+[ OZkp Ԟ]17c[*+=z`x.w mZ CcpU}u.:xsROw NJ\ȀvR~(@ P:@eeT@ trc+@sjPCy7QVrr&ޅ[x6g6yMj/J`k gZG^泺(HTtHE&{uTYGV21`U63ݣKͳe9Њa%+9.cKTPKOwJ/Wb$hռ]L(-0s݉pygz5z g[}s~<ODnr 8rtV?+[at)ޘD4uM͊evD&mҺӆʀ8+u[-XJP&6f6#59}u7: JLj{ \OI)^'UU$*!q7"y?mvЖ'0L)ӽ=qq-OH1xh`L828ixe`ݭ&/lZ)vD Pa$Hw0g~L$K0.$#㟋es&b( Z+6?l+̒m 0gygw.v|:2xӺ pՋv ~^*S- aye 5{9yXc}cFM]3쩲bZSg0W%w:tVcǎ`=b伛1!0ipOc!f~7a$ .`H^2.m5ƺ(#Íj_DJ*3U/_:O!aS2G:g;!mRAKTғ pB"R+~YVʚ"*JDKPk[57 %κyp>'ȐD=yUu[(IRvtF}SȒNODHO8 ?6CrݸCZ;O@qK/c<6)2vR9}5N:(% J jd +5 KUłYN!&7A݉QeenQ@Kk$xlr.F4 |W(\ZJlסH{ L[Dy[OnXge x,EpǷR ؼwۮP]prxrx̓xoصa׻`re曘7o kOkxC"cs FHPi'#}ֆ ֩xǰW6V4o>mCp-V3.U!} HK~tUӔd~__V6 > \uQ\]8'=.ƫURy.^ >=n҃+ځa|QDs>:pR]#5>o7 i_H8i"(@ @u Vrx*WI@x|p>2H᷃ `'e=`J~HZcMZ}3oɿ]g}Ɯ7soRſ݁(w(!J-*m˩3Ќ>s腸,{p {<.:"qX 1kV]xlM!v̆An[,ZPdE¹HbU(J$ ;Ջ U;&.nr,LX@EP!,MX^PQ/A^dT./9Q`r`ysb;_Z+gO*9~XYMR;Ƌ늴Z\8m7f܏&;V.^kcƢ3elh-2;>˥=%2Ǥi `u#g2d&v:(*տI& aɚVQ{hp݌H۳|bFeއ%ukT;MB͙x1J>ZNo9WbpUA,oI&!--Mjˁosrw@K]͑o`,}˸Z*-?=]WرCuĈUTOλSc]u{D1B克x% ~iau S6_W`~x߷;:v[|E;.j5M l9JV4U_Ubiʿ*j5-[;?ywiǽ6d@RP]/6ЧiͤT?Zz(7,*zs>ІŗnEk{glwp*]IL5 :*V,'g`_c(Sj*aPN$ > PU@_đO#芊}mյͅ$g)\<+b1&z-oOp?Mw&\}G*U1eT~n{R؜.ƌ#O`%Jޭ2I@K~TN⼌jKGQ? % k/`ep{EOl,!J* +"%%/K:̛%N', R]l;1ubȾ8LqveU5ga)(H=Y\b˂=v\r>sXPtX?c}25,S S<[nwfJȓJ /5 v۷| hezo~Z%FVl)BN;۶˷{ E[k^`b0{ pнrh_ϞLy3'sz|) fgWOU00#a]<#=T: m?)-[nkLӧaZ1f޽{"~K#_aՌ^ػӟ|"#4Ъ[%\Ato&clGx8\XFLɿݸ o:gU QDo`2XZN]}늾圽 YFw.v>wAiВVV]9Vm-:Κ꺀ˎ) wjs)Uv%" %RxPP#枛j VSUR(~L&VI_T3gi25I=),2D1IUls`y[;WzG P e쌀;YM1!,/vv=JgH<WwiP;㒑2p">n?t|,/9U4Wz]kfȏ=BNO~kJـPo객y~G 4J.X`{:5c!PM9ӰNTa;j.3`Yh4d+gJ/" dߋyk4V7+Z@"9R+\J HLw͘aE par}d").2QX}iC.㑵0 뤻pN]ynI/۰s2r毑a6kFN+fB=Rv{#ozcXg3V{= yhK)3?Ծԛ rءӑoGa Z+Og1o1FQi>cjG eSpR0axyؑS4^`.=f1^qlu=.sb0\:8^5xzKxṃlO:[zM/eۨq麞[a\vL}-2 'z'jGḄUϥ`OTCt`n-%O&, dd.-5$Q祧ݱѱT:ӓӇ]"Jy2kګIW0Ìzv@TLpRtswL?)T},cܳ_ !a\ZR ~V.HH-Nv1x~M.(f;-|.[#1Ecp`/z9؀$߈Vv4[7NyһHCj0ZéYU5]\ Z͊C/AL-832$U fl|^`2}cO2yrRdRX[l!n*>!]CS"GZ*sYZ U̫{eREtRӢ?s'J̿ '܉Kϫ7aKs;xcd|{/}g@+v6= tԡ1\6ww7sj-qϑ<o-/)OIq8$I}:졪C5 eHܟn3J˷5/XGں c4-6=>;~RQf5QN6<򎜏S0o z.OM8Zexw_VW(@ P ҂_e|Νχ^kˡU>NurIpFcܷ??ϭ䯳%W9.I)(< )-Xrg?#Ю8V u1?rɓ^wS ݦXM!-zAertDGҳ)ò Ss11#w k&R]nB]fJ6 H IϬ߱8T71pIL(aݜQp)_C@C+ix$/c5AfCP90 5pcƽ ZtC3iРsFE_c_?UN=Ǐ+)WC}xo a& ٯ!s_Ǐ%SO0IrQ;у; ?y s$ޜ7zHJ(&2ߕ&y&Wa[>O.HZiڵ8We'`ONpy(@&MQJ_>p?ţ Jw`Nwo`Țsڂ#N(fH.]ߪsvt%K?)#iLSժJV]3qԙ1 m hdNG؞?'wy e&#<F ؋.(О,ٜ >ʁ5y< %PKŘs|(7>a RU$ꩌZ!KŽ drvイL}[oj{a/i9+sرlddP03d4^nAsؾ+G/Au_bמ ܴUyL G?Ν;란8}CuOK'{zFLHśGLK@/鮄0<:T S4LV} |_QK/迨 %q[zhK)OeՊ~~m'z!Gzd.>CUM҃Kh[=v.jȈ!xrӕozS7zZu_*C' u-ޝK3 V P@/{%d1rarQz D%#4M^OU 8"A+xG؈wbZת>/Aszl:yDgL4GpȺo?$׮֎sR ~F.lvlȁz!q26f̧R]YV>1uBP(8'1wڥJĆP}Lk~Ge KZ}@+WKj½R#/Ev/k!eLc8&Pw/o~o _UV(@] oQ8(I@Kz5 ;MuQpwy:Wvaj"1a@h|n9sD9O w'$ZgKuL5ĭ<].5rnW5)U wP {JGyzpL{T^jb$O-U2}Z/2c:S&vd:;}z6H`8^C"=>pܑ2FBU)><3&H@ʺ4~!?ݫ-?Α$N/jl@c?m gFp:Lb@`0.K+xCNRaO>`ϫM]`G|W`=AZ^x vj+vY"w[榻knYdveؽa& qmMWӚyyhѽh:%C% JYg0)˖-~vm!_|Ymvܺo>ovF1XY򐰣GxdM2vs.i}i_߽TM}0<*^uQyBc 7[5hf:{'n\{*ХKރR~TA R8eu}[/^zQW[嫤Uҷ_Z;ܦ(@ P] ت?KԸ 3T굑> 4hyU,`34Z^Oym_7k_}5Υ_gd`iNzN i, ?eEKKdʀVO<k#$A!U2vtfkhMiJyUe}{̟:0iQkc=Qx<- f`P+[G P@szk-Wu) 8 P3WbEL&TcԐlƊҙ ȩ/5 4].A0Di- Pڭ/Ͼlg)СMfdB\R|*SCd6(@{;{ {:w(@ P(@ PJAvuX P(@ P(@%(@ P(@ PNAvw` P(@ P jjj"9lKNɛag1 P Ԋ{QB tAڐ^Eb֯5RB_~.HJJa3+^ajg^ ͭbC)@ P@zt8vSQI`8y$S;}[lPACs^~Ǎ!VOl%(@ P@xxz+T_Avܙ(@ 0 馛p!;wL)rQIݯDEEݰ-> qU{ϨBL_@;WSFK=8_*[SPn}jkZ/U*otΗ%:aaB 4MT)%|s_)o,rzh؁aǂ@P==p ЎZRod@K:Yqk>e8}=uTCU-sN{ӥKrRQS5Z{2׏WP/5VߧdieR уSeu _*[SP/@* -Vz P(@ P t 1Q(@ P(@ P] 0ծnK P(@ P((@ P(@ P 0nL P(@ P((@ P(@ PNAvw` P(@ P(@(@ P(@ Phw j[S(@ P(@ 0(@ P(@ P@`P26(@ P(@ PA-(@ P(@ PڝZ(@ P(@ P j=@ P(@ P(jw (@ P(@ P`P P(@ P(@v'Vel0(@ P(@ P@@t:;e)@ P(@ P@A-in(/s0P93(@ PB pah(@ P(@ PP"ưY(@ P(@ P m=(@ P(@ P*V6(@ P(@ P Zm(@ P(@ P BԊfQ(@ P(@ `P+ P(@ P(@ DZzc, P(@ P(@ j P(@ P(@`P+Bo E P(@ P(ZA6C P(@ P( jEa(@ P(@ PB 0چ{(@ P(@ P"TA1l(@ P(@ P@hBp(@ P(@ P@ 07͢(@ P(@ P-Vh(@ P(@ PP"ưY(@ P(@ P m=(@ P(@ P*V6(@ P(@ P Zm(@ P(@ P BԊfQ(@ P(@ `P+ P(@ P(@ DZzc, P(@ P(@ j P(@ P(@`P+Bo E P(@ P(ZA6C P(@ P( jEa(@ P(@ PB 0چ{(@ P(@ P"TA1l(@ P(@ P@hBp(@ P(@ P@ 07͢(@ P(@ P-=.iLSS\][WtX\ P(@ P(@`PO}k׮+8uSsNTTнOx"k0f˨q`?r (@ P(@ P j5-^ }RGНOm uv=zWi . P(@ P(йjNKEnaХ)Tݺ VަY(@ P(@N!hI3osߞݱ|F \WRV-']+;;bΝc۝{1խ;>wq7TA@ɮjQݺb0k|_Kܮ*|rwѽN P(@ P(j-512oVP75=}P vj]bhxąg.'FjO4Wv={`Vxzpl P!l.eë39Y}S S(@ P(~jƽj7'5_$Vz:4OwqַN`MMCeǫ Z:} ||~ 肧r̺A3P(@ P(@$V3Kk89s}Y%NT_,t]'Gd<<OAȑ6,s'by)94(@ P(@ P@`P5kL*.ࣣ|t}"Xzfy*7}tq+>wCӌј=;w 1ޕp(@ P(@ t0qC䩄_VHo*M"[bp(r<8^&'ҡ˲+6/}2Pb(@ P(@ PYAfݚkx&٭kLOs?0܃DǎUbhX>}ɛ8:1dVxqCཏ*UU|eNZKe0Q 2ʭ%XQl}@obr*F`Μ s |/_tfL]p'&LJ}Tg)-o';uR(@ Z0-æ){[O鱕o|++*FzXrϘ6 \d_t;](ځ-Ư&`lQl޲RXPPF+yH`m[e.)mA)<2S̽wEyQ87<(@ P[ qjeueW~|m=O-CTHGSKuuR/3*_ʵZz/М>}PjHeTJ -gOٶ(. ,ù^&\(@ P0ŷ(plX}oVƌ<̘8މ*%H͟v =\,uѲ~EP9ȌLfz`Pa(@ P&( P$aZKr\2!5݌<Ü +a2bF ,܈-8=5E7/Y!E P(@ P |5(@n'ڹbJw3 H^xgz֋j A2m/d@Є9N){mefJE9Mz5\ACmXP\VP)3$HAqIa\-܈'.Q,){_~yD`lr[q2r~c2NҔ)i CZr]K-?ldL#?}k=)(@ P( jE=b )~o/wde.Ĕ\ jHcS Oe&s\(E.%rz%Nl=;,-9!%X:) eJB\2A ƅwcъsCۇַvlȼTBLY+l|#h*P-\ú-vb],䩌M rZ$9c޵dzo`w_WU6P(@ PpaWl)ڝpquc.J #4rmYPf{~S<᭺gڄue%l[-{5RU(ǷF0K%R'ޑ9J_bŦo]ZLȻFz=1uV8-uv2NYZ]|So ῗ3.C|˩h­ýgb(@ P"[AȾ?lڵmq@3 ; (]aȩ~U[t^Su])VЉS<``e<;gB;^ڱfq>MzmWXa{˱E, 2,[^9 يs6Sb~PqPquCfmv;(@ P\A6' (Y8+p@U9y &: Gcq杭(UIx-olݱw֍bFJ! lݻI u1Ō FMAM8``cnϼc{eJX@׳= P'&fo @t6KƵyHO\Jw%(XU\elW{d_raY"e WږrF+Teavb<jԫ/xE障j'3n2/WuL fo$Q!md>/~g S}_s fS(@ P  j5E)@ )[Rg<)Ёɉ>ђTsmi-ܸ'U@6i`9"ќ# k9A cO* ۼh ('J'dcid=WenSjL/=_*o2f^ ,ʉPwpk#[SJ<=0A/nَsaa#83^s6(@ P: u(Йҳr}.^V$w%`:6ov`O=jØ5^N!`O`+3rGH& ”P:badM 3zԒuj0 |@S&nP[&fcea6Dcg -hߧYaY3S0?YlwknFVI P(j7M@{0̘! aSql{Vcr+Ƭ)VlxgL+ ls3%Ԃ8Gwe0?P/<(ۻu[72:ky3+B$i4#;qI)(*Tamoh9SfbJHaao)"?/iQ]ےm ϝ|}g(@ P@hBp(bd̕n~Թ}rܱ!N[!}Ř?;PCZ3e*dVmT?h+a)rثF,=9 P3gT^y~=7 Nr$RػNoV:a),MeZ8 Q>seⓑjVL̟gxmH3|-wE+"ٽZտeg ` ǁ~mƳb@]Y1*! Y"N.|OWU?)KH'`<Q&fM̉ͺ[ꆺal<˽\䂳VS @Kl,b[k? ԛݺ`hB^= ܢ(@ P@ pȿGl!ڷ!VHp?D糦635|LObC)yXm4$.'c~OQnbəS}{΀"jZ2WnNħ63Z|~uts*ZrR-NO1#Iõ{ɧmMݰXP/9mby P(@ D{jEM`(aE%Lэga 0̘IzeY8\oVҊBMw:YZ>ʰfT[e-.wM9kh y^wJs?=/Q7,DP2XٍE٦ lB dʜHANkvӊ8Qd^UZ ly9ehFފ ZCkI~DLG-AW}ּfM P(tB|P^WUYuWW}x O/U^_חգ*O%wV 85K@RI{T^,UNZ1%L[zعz6b {*ho;m,;oMoJxnQ(@ PK3T@;0 s*OS=:crXv5S(@ PS 0ՂթKxy)\V=iXdrh}?@K *[`)TY-(^,3@ P(@ P 0ՌtѷvS=sx9~Ή#4OD`t ̮/k !`i퓲> PUvx]`0},,2)Y(@ P(@ V3PO_jZD`VT+.L Jkv.?Ç X~rX9:@#%-2WM P(@ ttZpӒc'F_^r={i&uSֽگaOj~Z@t43bJdZ+`,̤(@ P(lgu+ꉗv 1 ]8 ̌@`6yP]ú`P=M>$ p8y>-r3)խ;>wq}g}#1:^NJ]1xE;RTNTgPT[B '%;[LgT)& Pl:.F#j!-(@ PڹZͼ&&"Zzj޽ &ЧO4Wv={`PQϤ{MNwvIi5g}e_?QF>Wy G\ JTK  -+vd58wҒcxm-O1]ާɒj 2Jv_]^Oݘ(@ ɦ)@ P(@ t<qOF!D hc)peǫ ֧O7UOj-s!,=~is̙50G58Pϵ 移CM7UTK .b1wO,ϱ"&7 F5j7[CӓۗZ}7i=ǦO9^=&(@ P(@ P j5M掠f ̔yi͞xx@:][Q?(}lgWDW xJd¶ T8g ?$(qZ9 cxXPaAu+f v^O*u:q &C#Gd/-?FnR(@ P(Њ j53kL*dGG/6>2#zW暏V3wEvwxCd a]r/XX 6;y_1}I?@zrݞ5AW]{%zPl{WN/O|{nIy&(@ P(@ Phx-&C/Bz;5}]z0Dw^^P%%3FܪOty+U~whc2 =XHLU9+'<{(5zR]AO\ѐyLxI >VuJ9T-T:".Ej嗽}\lJ?b\O P(@ PZ&Z-ϩ61M F߱ІFSK.oe5 J z_/LV9<%O#LC5d1q0~g +=_p 'uS߄8o|jdw}r) H/- _;WSO|o`?.ǝIxs`>b㣱q(w7Q]wFE X5QW&Ҋ5hEjc$ƗX5mdB{ci [+К`̢)h@+$TDP@;wf`xMf澜{sgd~sι(@ P@ 3ecvX^=TFmSuMil_4J6^x 䮇`FIjJ}!7n\Oox~y?`|+ (y|y]Et-Z/WåCMܨVa2GL[ `~mw[wնʊP(@ Pp9WN֣GMvZjoLjZiycHk^=M65o<:cxUZZ֩rmEX~MSm2KCZu@u0S]x}łGﵛt/怖jH3'na^̊XG(@ P( CtfIpz8A5<\ޜuiC;.`{agǦ(@ P(@ P) ҙEF C卦F P(@ P(нԸS(@ P(@ P(V jUu(@ P(@ PJA-^(@ P(@ Pn'U L P(@ P( P(@ P(@`P(@ P(@ P`P(@ P(@ P 0vUS(@ P(@ 0k(@ P(@ Pr*c)@ P(@ P5@ P(@ P(v j](@ P(@ P j(@ P(@ Pp;ܮX` P(@ P(@x P(@ P(@ ZnWe,0(@ P(@ PZ(@ P(@ PNە(@ PEyy9nݺo{2iG {<==;<(@ Pn&UK P*UZZ ___w}ٳ;3e ܹstVH Pp/v?tbi)@ PhjZw}7Zp묤*jZ*K P{0RR(ǧ{rPu(@ PhLAt(@PchˡU3~S:ZA(@ P(@ PZ-V (@ P(@ P@G 0<(@ P(@ P@j5!3(@ P(@ Ph:Zǣ(@ P(@ PhZ&d(@ P(@ P-VGx(@ P(@ P`PՄ̀(@ P(@ Pzuy< P(@ toeJ+jpW ޘ<|GOY%jSe8U\Qݤ׫K(@`Pl3( UqWj%餁 ܓj;0=g:Zek;rl1eOˠox>;G0u] VaZdo9rzN;m:kV>cو |Zrꇓߴ5WOF5Xu/ 68rp)wQyܒ4߃VˡBKiIӻaxp8z*{^Zm|Wݠ;R5FhE[iT"Ϳa鯐=}k]PaOٹsKmeWt^']mf.T`` u\?МVͨ i B2uv=0$$ӥSi(m]j^hM~n#f6/k?GppT HLަW҇%Mt/ّZkɣ-Y=oƅ+z_.qX7A4@kUXQtRcP+3\a+Ob/SZx%Aj 5Z-٬&٬\jRw*w+FZsYM N~̨Rs|wׯՎmgg@Wp?20ύhFUqS"Ms' 4GZ _؇G;J1bsV` x8;J ?z.ᅱ/絊x~֕|J/١ޏ_H@< @|zP"HWHK.`PX>sOnov{%bcF jB>\WAg[Ҳ*qN y49U&-ƾb=0}@,|x %ok=z/f>)ۜ<馘͇p[P{ JvvP_HߒZ?d|p??Eԯ╅c0q,I˳#ԘZ|#_~ez-&oX)AKafc7Ijxg0L ZZj"nYw}a , i7ll3F?z7d85`)PpN:T@ ߽ȯ姴ao jw&{i~֙v)յߠB~WWr9o|o~ëoJ_Č"$f3Oaj^9|׳/'{q=KÝXWOKSViۯH 5?|Zln:|N\Ѿ˘&jr^5ЊvrY_7}MKoV=&RlxK A}Ap-m>VB;ԊGeU{WqCVi "~bw<ܘ>·x%T/JuB@_,ƃE2&Ps2zc'$w޾ hT/PSm+K@KȀNSmJZS~}::os}!'y~k'j f/Xy*&-TWu %%GJ<0rT=_+L{b4wֿ5~[pYX0w*+>e/[CzybԨ{*ĕäI+å⼌רW6FMۧ^6B_s;̽Oeu`_ sϾ||6jh곎׀Z: PR˱ P(ƍ2&5_~Բ:ydUgIGu[Q Jw%u,Pxy?I';c[6^OUO L֓rnS|Y3>PZ܅ >3HjMYtrf,ƙ*_Ȁc/h7o4_ڮ+MPAx}~/-)7?bOY4Bncd$mwzPQx}SΔ~b@cp 19%voЕi ? X-sWYƎƫw_>zG:|H쏗g):uϞ=mV RKrmńQi+.] l]D\˞]gck3aߥ*lw]~b^3J[= g'qv,?7'E9lιjRCe1 PS'?B[xR>K "@!^W3@.U/xIk9Imro#߃._ Kiw3^~P}Q `i;Uu?vMr4V;vlcIcbӼQkplNW!y;l&#eN~vPT\>&i hd}gr YsUI+* BntCR6dkʷ,Uz+/5* MqN>?j|UQEYU5oӷ6mեXzrwPc81F~`QrdPG[{А rXW._T5}5I 5o3j*靏/cXkMd`Y~~~ءE-8߽FEEYov=w;Fa!8zsoo FJn?=0q8=uS%*..n227! h3d(}39">r=i}䄩c8{(2Byyޑ*0%H?|I<*&CT}e(lb.T'L|n=GmAS]g>& csE!k~xZc6 =P|;ntqWw9TZ3eh5-J&Os/e,-}Ҵ?};q{:^d}p-(X=Uҁvg=zXݑFcQc>]TK$i <ԣ]ST~n j[Kd ez դ՝T,<-_\!ʚ*bReGW[/i) 9*G ]6HWDlӡy>)gU/]em1mn)_? ef s%ey|[L|?? Ď%a.7pt? $+6t຅ }qG!':*պD(REe~$6n=i߮P~4}>` j}Mzs1(_bV]-]JoWoic iتϹ9UA~iy5uB8٢{`(6_ ;w{!FC#] 7w|D#P-\~O-S8P[>^RNk?tܷGTsqy0sALmd0sGb3װ`,񵊲b;}%jҏG` q\Z?-V«.Ri>1&K6 3Uꬱ+ewsgF} h[$.S#`*Ն}>mPM*8SZ?GuCT ?b/Qѷz> qڧe92J0o@ܐ_5Һ`XP_~_񯳆k 5ltT/|N qثqTF55==0*5郤[oOa;ױUO,$Մ%YXUn+&{ 2'2;SZ٩4H6Peӌ3R|ꏈ|'! <}OK Y_{~ -<~]#xkg]w݅6 =GOGhFZ 9`<Ԛ :4>|6 h6E-S뱱nļwX|zSG˜Bzi5ֲE69" | tq^ R-l6V[=ѵX"q7jꉗbZ|Zj>jƟ Ϋ[OAem`CnM|fV4 7Yk^9G P)g3X1m_NzˇZolSuMΫ?ߍmjHcjUUUVq@/N~'́SC$ch_U@IQ߂1گyB$I$@ӚiY_YN~)~2ܙgXUjpq5Z;Rkӆh\kg-r&3 fq^&_d`x5i95> ة.jJ__sR]jUXZNĎZ ݓ`WTrk\)vΘ{cƬjܸ|7N2h{_o;i+kȹ-i6VIv%w5:?zmͮW:wNVηV#4_k28ݦs֩=8ui-mD9>I՟m=_U|4N̨?U]53\;Zj.j̶y|Gu2D&IfjjaiycHo^=TKc7j1o*-zUdjNK`dl[.[1m_UIMjC]6֩WG@Jg_Ʋ7۾i$N]K;\ƾ_U5{jҖX$c@i; c^q*el..Z.T 5r?S+0frV$iH P!?EuO t@1n 21cMߑqOz{8N]~j,T(@ P(r՚(@ P(@ PJA-.(@ P(@ P@ 0(@ P(@ Pr*c)@ P(@ P5@ P(@ P(v j](@ P(@ P j(@ P(@ Pp;ܮX` P(@ P(@x P(@ P(@ ZnWe,0(@ P(@ PZ(@ P(@ PNA-2(@ P(@ P (@ #[I PY}mVz&vש 2JP:@|k)(@߿?ԃ(@ Pp$d(@ P(@ Per٪a(@ P(@ P 0H)@ P(@ P\VA-(@ P(@ PZd(@ P(@ Per٪a(@ P(@ P 0H)@ P(@ P\VA-(@ P(@ PZd(@ P(@ PezlX0 P(bE=x/btTZ EA1ˊ P\]8:Ę%2pn:4 2Zbq<5`T^e>/]Kbq팑2䧯&.]>,c\k{TzTDM~}zP]e-\kϢ~ #?ȹɢִs\E @yy9֬%ʃ 0~uS(lD.Ya,*/2Wxa2l ZoѺ3rS0 SZrгHSזE)q ##>Ng]?KG??~(ϕPT[.*[ 6JdnNsG@LqxjU(@f2Hն7Tyrȝq2#60<6X|$-F-ROK'4qW&KKSSb$SeQq! KL}}b̐u`czkm6v[K_ i;CsfŔ)sY)#'!&XZS-yDB'S)3 -MYW=`(3];.'ut8! 2싑k~_WL[r.Ga̵,Zw+(Еrss[R-'`P%(@ P>헏"r 2˵ cHG;#9o5HH!7㣜ӾH}b>ji~c33.RҐk2-aux7G.bUR+i d1X;v =#"KOboZ˘/cY$ *H`MI's?Ž;&NU-d1iD9>9L.YG6E W1z8Tq͛\érE8o0T2{ak(GQ9c ߌr#z˻X?=rQ+7Dn} 2iӺywզ*ҙɵ~ֻ1 Ms HyzuX9 N^UIZ\ ͦ@Qީ"m]Hd*No&1Zccv868C-CHHc9EwJWZb{2uVczIzj:_.Q-燄$''Uypr?~uS(?C7Sk \F5 W_%D=0 # y^0?bVD#maK<>W/A yg`'Ii(5gO' !ZZ2K^pI~ ooG'{Et)Q}<%v 7'P >IB-s,916׆j>ܘmuH& ~ ^"Tph<`OfJ0sm/v;;Fn+)FZz:2im[.Z}ѦNW]Gn`DF*>(@ PMrӊc)@ Ph@I!KǮwhNwTW#D %55KHzI 8,_HgaYQoc2Y% 0Vczam{h d4mӮׯͱH @[ ?}t9iTZ(@ PR_+>j `l^8A?_<Ϯ,.:&W _B&hC vͲaԠ>J(]Fk 6yZL>_- dLxR%sRmgWs[⑙n={t7T1-@DJܟkuFa0(5. y<3)u)V9lJYh 6˝1Dv2$Izrk$`/q0ug9 {eT L ^@i=@F/"mTSr0FXo(:5o2/>N(](+K{(S'4ȡ= Pm8PTU-ڜR(zk|,U]&r4v{!ju B̘%Yi,Z }.-W N^8`R&%2fgQlɛH7(s5g|I0+v2pw 5qhxJ*MH9e($/yqI2^ˆ #3-)Yװڵi0%MuQ*P@IDATu4 #YE۞T+:qZeQPiyzزP_00THQ.iJ`(҃ٓm}J0Rr[5c"ǏGQ13ؙS(A+n>Vp2|x?)gX!X8|\%v<Pmb ψ*K8׈hIf{v"`BL.(c/yL_؝xC qOe6]_Gz P],` 0̐(@2]^l7N_xi41Qr=ۂɀYoa_J̔;#SȯA>V|_L[΄-#,qJ$!?SO) ŮX"68v-6VB#yf%rXkp:Īk; ّȘZUnQ`?җXCH;ݑS8\"O!S![_pQ;piyWZoPmuѣizW8Z4FQUUUk%' td]|x"\A%OIsU)+xIr:oHTSZZ+(DdizOgR4!H O;߸}ԓ1H=9/(UW@ۉ:<9Ix3g>[#ER vmVS5*($ynz#D6ys6I9ʤ|T:iWD501.M"gc=پosʴ@ px=z$[N<1ym4Ƽ>[mjxƼ*|ԫZ&WuZ'Բ2(@ PR@}AWL>*Ѻ,/ s~mϩ <8W#=TH|9 d׶O,}-W8o+ hR 1[8۝9}Z@ ҚZr^gH~)B}=/'Jnq$%xсn]&@ wj2զ̌(@ P V~+:{qYp;vK rizy=~5MZ Pjxغr&<8э[1m_UW?5vX^=ltFBv? N[w)@ PM T @ N3\t` [S(8["xr' o&fxJ<(@`C(@ PhBݦՁk%S@P-8Q(@ P(@ Prba)@ P(@ PZ(@ P(@ PNA-2(@ P(@ PA-^(@ P(@ Pn'U L P(@ P( P(@ P(@`P(@ P(@ P`P(@ P(@ P 0vUS(@ P(@ 0k(@ P(@ Pr*c)@ P(@ P5@ P(@ P(v j](@ P(@ P j(@ P(@ Pp;^nWb@8ISg7yLS阈(@ P@W`KZVľȡQ A8C P(@ Ph1(Ru]U0*2r lu8>i ~͝+K}"#1%4]~! (AAY0f6g-pڠim30SV JIAJVD]GZ;R(@ Pl:x| PUB&g+8XBSҁ3'8Z`Zi<[(8P 5N&&Zb܈>R N֚2q_ P(@ P!V{2O P<̭Z|aؖ{csW$q,Vݬn?W1snbۥ d۝ s(@ P(XA-6B tq qj|RTͯɖJE͟d_ D.Z ]/XE,Dg aϞ=ؼb.dj<.O\m B\ ϣcQ(܋3bш2gpN["M G0<3eeeWkS P(@ Pm$VA2 PnY) ] w\`C#F$ T_7R8Y3 5 zc;tvmՈ*lH2||UMbYb8}ZZ3iXPIn"v^PzJ>S(@ Pp ܢXH P5fb ^Vw9lm7,ӡT̝TQ}-b=|mu. ^Ϩ@.̬d|0.jbJ P(@ P..WG ^ LƗG릡Xhœ<`n,6LCux{4V* gK(@ P s@VTIS(@ PUAZzNj(Amya>8u S8t" ˣ莓\NޢuYؼuRRRڳ(0.+s}i}͘=Boy7tغ'E[#z.)@ P( joݱ@쏧L$+q;nb8עXu|-aKZ}U`Ӭjy΍\H!~8v G9C'Vh-Mۼ%0iTTH\(@ P\_N;/4KH PBlÞu(+q~C6,ƑCt닰ئ_&qatD;woct/! B-.T/Jsv7I\wJ/f,5A-kX.Q(@ PR˭Z#ՎjEcXZH]%lMy2yB-exhhD@9Θ<L̜5cQh{Xp]įSO{zY0k4 s'pPq(@ Pp#ܨXT P-1T_ApZ@IO_/z KlAG5?ҧ u8sua M!PԦKwaQ7"_Dq|m}[߶)]K3LX4™P).b\4ATԬ$hX-j* Nx;=9srpn(FxTm7*2xk-N kuؐv?ye-bj"6 )GoX = Iq_/MD B%a5nxFRL|z3B2)(@ P/!πhB `LE!JVA5T0˸}Upw*N;Ymroh$Ţ!,mQ] jes^~KO-h;oݝY*n|o[]'E P(@n%Vn,@@ .MC`Y+wM ZW{4VёTށgO'0 sN.V vv* P(@ P-rjc)@ -u^m@t/(@ Ph~4B P(@ P(й ju?N P(@ P(Z](@ P(@ P:WA)@ P(@ PZ V и (@ P(@ P@ 0չ<:(@ P(@ P@ z`B P$pvʙR(@ PZ juPn.0yLpgWDL@ P(@ tv?S(@ P(@ P]M-Z|(@ P(@ 8ԶTWWØw[C}5wO}8G04B P(@ P]~hE?{BaP;`@@@9G 0B8F P(@ P]yw-:۶m_|Y$1\6X P(@ P(@r(@ P&OjEBC%ؑյw9 P(Ё~؁<(@xHy[e|(@ J`4Vϝ)@ P@KRr܏(@ P(@ P4z(@ P(@ P~R9G @ىLw|0wV<e|e듩Fii5|mfeeՀ/}UMLu(,ňsm"n(@ P*a-]S jY`prǽ1vZ`!6%ΛO?b_J@P=Tw!ϯKMm{oCdPÀչE.c2R՝;P?Uq*PV!@xˏV[ԯ6oqvSiQ"PSl(]Oe%;ce225l2"B߯]RV"?#%CD1)'V󼘚pS^cb,GO)<+'JW-GZ1Dm.-+Pؿ ;ֽewK~,OJñHD@ Vc+$) +yc=V`z>|(u2jc ضhSCUH؜?ټ S䳴u,N:nާxE~$5w,} } 'IZ@K-I:jf` hh`ny0t" iޕ3\ h~)))~<',?"+;&j<5E´Aבz{,l޺GgSQ`cĔy'K#qɂ(5V`˦MX4=5 ^Hi*"L ^.x P#xj|@ 0uP%PĜ>qT]dэE %Suob&)+qtWC5x>y>.X i#[jϋsB-ФCM-Vm4jNGqFϿs x1q@:t=mI~:sglb|nLLjZ\}Gez٣b祎`Y&kL_/TYqq+gsNKcL(g٤"WAe T5Et5|3ܪWK ,"<°-elǬuH^|7+LjݼN }r̟>ŋS5W/1vP+I*L?pp1ZH!1=;>Rm7!'= kk T8HWZJ ⥭2wS9NoiP$5g!!- GMQ&vJ~ ׏-X<%G<={vj)b"B򘠝tuix?#g~| 0caD5PJv˴eZ"!mttsMv4kF] BK@4_Ojoν.tֆ4չeL cfL>y|&!yjk:FF^<^Eůh-O_>dbSL`Nz'-mzc=٧;Z_**(#{R_ʜY6Z=@` tjoOKUP `b9 n?EձLrrLO%>]?7'F+NU/^OWD+N'Uej, @Z ^VJhzZ۞|Ru2sd4v;2ϡ dղ 4#sk1kLعz8OAC mY,L|):5V ɞ@*| Kt{Җ_}DB[kcC&م VHw^Sz*a|V6:LKW>5zrKTDYu)L%qQ߱^pS4H8*[r3,oD b2۸ASuW?\iVռU/#܃ܑLRD}J%-#P{ Lϫ\fXJ3OV4odؠr+c'{]*V"k^yՍ]z襵*Më%sgUjb3敪 [Rm;칷)UkvڛUs eE V@"NŧE;kW+ *-S}o?SCLEeWR3Ҫ /chw$UZ:WJ'w>N㝩7NܙVXӽdZ='ιGf۰ND;u:1.%Ɗ1YZd`j7NcsүE>\5~^R}^si w4}̞9of˚kz{ ] ifz#oyeN,V띚֥v:3־_Gwui7LlfR2zVA1%k7Ṣa>W*|gEv˽DW:r'ݪzVޡe @ |eU_? p}> ۧջze{VjOYPA Rem\!ը(/$05>t퍚 =BkViN$V@ҳfRt3z뼙} j%Q%bhx)L=rLƄ"{Vh}3.˒}VKoLU.o<[V-Wcho?Pr _3-W}KZnf߰"a2󍿊ǼG_<25_/Ul0eoGfg7^O_6sc={Y?OTo=?=5}Q7}g!}j4x@xo˟6`&зokRܜ.kA`&w:ݏփ&GYV κ:nm]|ܹsoұ 6xn!mCE'pZû  .^kkPNm?jQ0 ZhdI,"-Y}ՓO>9>yM9ꢙQYh7x >ՅDkXdU^^>O<>>t91i$.կy]/3o[Cv>:f-}}S )!Np wxZ =e/Wse &FZ3$2pM  gcM\=X(u~ Hf]z]AJaFEĂ    @J J械    A-    )'@P+嚌#   0Q<@@@ б .@P+[#  ?3?>L_ hbtAtoa)%p)U^  )xO:5 ?CQ|cո 7jn\]`f_5@ `fΜ)k w RGV%E@@F$0}tz˥2LqH4  RGN[QR@@@@A-     )'@P+嚌#   =    rP4Xp:ݏփ&GYuqk;:3Ν{pnᆴá<%qx@@]$>|X-a)&M-ůy]4Įփ>J:gm^VvlmXk똵]'S@@+ Tͼr"p7     )%@P+"   Xx @ ZPW6  kB<Xs P`د@@@)Z#9@f:R~C/x5fT벏׭R͑|UY cZVs,JeeZ>sC]؜kjoۥl   0fh?ɭͺ>ӭ3njL>r*zg,{=8sXFAjOjd嗫 jZYKA5zJZU0reHH0GWnV)ۡzjgbc[M@+[+vnWmZlz=}ZYҦ5 *7gA@@`,:ui.o1]/}SgFRG97M%5i\lM-u jҭY /t}k۾[^AZ~xr\% hYwkAߥV\d{c+;~weGL//wTЩM-Pܒ*}H͝ ;@@JZEdwU?{JJsnfTPw:>e_?4st3]zĦ#*ݴ >8 Sܸ AP[tkn^S9CY{_ ^ުN{GOlS MbO ځ3Le b̈5  Xܬx\7Mӹ7CI~ oλIo쩰n9G;+8Wva<0{ߏuο4 git35mF_}^|vvr=F &U<v@?][>jhjuSS[Oɲ8ϼXvOޫYfN ,|V~k^WLytt\xwA`C ˎ&\|dfnUzjicX΅ڹBjxrL *̘g*D~59pȧGMժ9b"̅Ҟ^Vicڴ>Wő!~dY25@@VY2O+q;f2ʚФTvٺf)ɈtX.*{ճ+lYd:_W/[i]";'^ZNPXAQ$+=tP*YSm} uvfw3\Wo*OŷKGa[eA,$*\W7WȄUإ^ZkȂ   \<yyZGnn-f^ڡ߽e&'" /ҙGA}_N>93!z߳'5}_?֍Vp`fw΍_)@Pk45 &gAա?d>c+=Nu ;^G˭FS!KܪzVD@@})tkɖA4^Mn]w4>r<͸QTIku|O$]r+v{Ϻcc ԺV9C̤5%W#9G9؅E3c@@eNv #g?C/5%9J6U!bӺT@ >vu a!‚D݀E ,H>-K hM=zF2s"N@@@@ H@@@@L N@@@@ H@@@@L N@@@@ H@@@@LJSg@` ~D-B@@&A 2]`f_UH   hd   AtkQ   dA hd   AtkQ   dA hd   !T(9Ml:'}cǬ`sֺF:븵KwKsIǂ@\pA7pCԇ OzP8\I  .^kzj,֢ERW)Ieڼ.IJ{Mzk=룤svem搝YKu1;A/VP@ 8b%  (P]43MIĂLX߿DKAzi:7-1C@@Z=@m\[v+ݦ#NuH/͵U   i!@P+-J f4wohyݠ/l;O9JZPW6~B >/4y|B\'u$WGUsu ;    0.E QL(Սuó~R);}O7vm֡c.y5!=LGeJ7lQa w\m\$}k}1T[V0[t^9]Zkjo3l   0"?e3o;ntk'>g:>s_:۩}.Z5& (@Pk1 F[`/땦c*BZa|G5e嗫 jI_R'j߮*9cd6yְJ;~+_\%z~[,riӚyw+4)[   KSvbr雚>3x|=Hiī@IDATr/Y韌|$qW8 1= tR;tB4:a-u jҭY ͖}T֘9TFzڼCߨEC 'fVdrGK7>= ~O?NrT)>z/kZ'M@}t.]gZfy h}Fԩpμ5͜egwcb] Mwު썇@xܓ{ C8n~vC`3_]&g6X=;[UwUwBm+ e Ur?Ε Y eVvv=bD:o/P݌y*_YXˣ0ysu @@LYϹ9 0C92ԏuO;-y4:= 7~\zW*uR3ʚvsxw;32LgifZtXo&oqxO/ߣ}0C@PwOd"Y7{O癩JJUR/gmoHJvN:4CU\Rۜ:cL~l۠N~`ݠ-ѵ{9  pT8y^SKY]>o6h湺]r82{l"k3疕w]SΝrWr^>8Jzﲇ 7jnNOm|Je'42zdt2ajHg+b3pBn9zStٲ>r ';'OUJ3Zڭ\b֝c4Uk+|=  H|M3;c=,18y}kJ 2;_SŷłD 5Z2 YN:c'KavAͿۜ%,?| |ReYv*PsMlH/}Mffy vVS߾i8m&U+2䘥à*y\  @L?]gϝ;>ifTDؔ,ɈʌWt!0~pLխ3mԻN/);MՇW^ 0¶\2n8X[nlGߴ?0ղΧ 8;;M?_}G++c6:T醵 ~59p ]yT#V(+\*jӲcSWD<DVN<O  C0O& jMJݠ?pU$- g 53ksM߉u4ߗOu8$+c)@Pk,uFEyJgATh͔6 vYdr/QyA:˭~ɢ]XFnU=W+o"6@@ydˠMy#nӃ[]o&5;z)7kuٌVȺ>kЬ"]:wVM6{i|tX#0VJ|@`h7Q-Ya|=2I;PBy|2-\>9}5HE3G# d@~Dre˕~T\YePkf_UUH   @P+*"lcFV#  u%9"$QLV`Zt A@@HMzjfQj2D`'56Vk_wӳZGC y#PM@@@A~$@ #ng͍YrF#l#  dA jl@ 8zh>w8`@@@ S+Z"&x:5m*ֆ2#  =F l@`l~G;.#vtlnNZ`ѢE|Y8,"8$u"t\S&'   p@`<~W#?<:5{V7C+JF8= =@Q.9y! d3ݩ5!}F4M:=]iyzuZ:x/5@)@@@D֘)@Qwm-:IglX:q IdA@@TZTpܡYjo@{j<~^ο{m-jS]S[I@@@0?!s :WGW~ [   `NaSz!~ï>mQYc֍W:ڬC\/!=LG̼\eJ7lQam[#?aS:O;kSղI|%s{H+!V]Z +!-R˓Yzep(,+WPP`X^Æi6_Y@@ jz R~X l 54oSw荗_ЫR ߐk_+%o|I&j߮ªh^aӓ"mX^`10=WG{CY10]VV(ڴjmojeO+\ڴA]X* @ odZE>&Vkf5y[=YڶJɟ7mV́KryNjPMիt'N=|0-W ]Do!ʇ@F tw^PsYYz@zm7GsS$:eVd|Nr'Ree*',P{jUT4OZb^Z'B^;[*:bSe-m6Le_@ :}IU ְJ;^ܮ'#gJ\a5TV*}n s] j9o6m{s{VM/V AthE@ tFݫui6CST)-#{kwhsCᆱVpUTdi}Z^^00PԘ?žأwHB۝X_&4q'Zkϵܿ ^6@wZ|++PTt á wͤf@ 2pAeb:t[2Aܞec@&AFql=S{ߍ=z Ët#ǧl;mo*ڒH`[Y=a:sx,OyB3WPms>3/w]̩NiЇO'@pde`zQY3zbc=%Ln=0Tdled>0kBmRɂ +S(9+`ۧ[gΘK~ҙőV2ܾ[Kk=[UP~uVzn>3eC| yg 4wu3V]OVsz @A.噱o=/xA$3W=WW=fKR@&A. p̏#JGbfBgkt&6=|Y4RÓdbPe|=S#(Wc h2#Y y W1mZZap+UȸDKN'vUmEsad@L>ɓwm6=f.Qf yBdfȢ!Ram:جrfhxg|r;|2ԸYeK WO1s9 -@P+ۏ#[2ui߯&󤬒^Q04A('kwv${+;7GQoa.oҒ\\`^|L.=^Om@ (ؽtMg"=_L<]Q W1(}R/F?Pj,p =Yef(bUI3O# R)?\UXP ;zU9?wvdJ`V@yT{ _F;;ڃ vҭj}W k@  {͓d C*sd^~`~>|8efz̄  BR(*\g&}7-\޿ְth^"hfl5 R2O>P0Z фulObc )(S(2 =0"=1ZWj020 ᕐ8 @ ئ    @ Jݶ    @ ئ    @ Jݶ    @ ئ    @ dn)9 ~:~F   TDU`f_R_W%"  d3"    nҭE    2"    nҭE    2"    nҭE    2" -UKA@@JQ;@ =8Afj.E@@TVE@@@A-    )'@P+嚌#pm-jS]SC8$?А#QدQu )   >ҧ-  "uYtVVAkO]-zb}i-xL-]VUɆD,ܦU&_+1ot4?@(P /dCr*\`s`?tJrfl#  (~Ąd _o69dñhtjTXU[*X[N\kZ9۝<"Hъ *pS>,riӚyw>I1Puŋz; > sejig5T kjER+ݠ9&   =@`WVyB&HCEﴂN%Ѣr8򕗛_hG,E4atjS͡Lq*'7Gx)JuRsgfo4Z W}67qV֊&':총L2P/Yl{B喬ն=VzԼ7$z x'"  h -IAh[C|./ێ-EVl"& Q8zefeoT^LA::{N3Am=ҭ03,+nEL!xf(h`xf;p mNܠN:;ˆ@@F"@Oq-#,S6kͺf;d&w8n:~c#M-nK Ml5k9vlmNdu稰Ҥ{WIћx|X@IϾ*+mug۹s4DηU*z5&&2ooΗvgvomJz z+N   (SkRG lV#Kڣr*\c_hǤR׬ 7j]Ln߭5Ҟ-^:V/H@ DR^Nlrr<;dzac B7uߊm0A+<$jA͜B_`ssSz5Hn'W~-UAJD  Aѳ$'‰tɲB|TmڤF2NnX+oOد#LPwo;,Ś@~YͱƼg Z-u:>=Nm5-3P;0Dne 5WgWv*>y¡50dBXyfk阷v1\lں1GbNѫ9!  @@O~5J{*R}- ɕm&5d.6V~o,+Vb+,nC/I\y>ԎR8BU)W pJӦvAJU8 yؖH)?AeVP2uȚb+,|yٝbX#  3Z2F"YP|u(`&rr\ΎI;^+_=r'WU\C"~(`bX[;hϩ_ҡ{U Pi._ f5;HdRzXט7VfFl   X +YE #ʼFry^ZL*>@GaeK\]43:*xI)1pr`29w!d   p< @8|p =e]f)˔u++v@@@ j@#QD@@@@z{    R("    @oZ=C@@@HZ)H@@@@@V]@>No8oϽ@@@ 2MEA@ }nUID$@@@ `a42UD@@@MV(A@@@2@V42UD@@@MV(A@@@2@V42UD@@@MV(A]   @ d! ~kRE3= @@@ ]評.-I=@@@@  AMU@@@@t .-I=@@@@  AMUT@[TԦ8"~ut%'ΌV(Pi< ƥb@@2R3٩4%uY_UP{;UuVHbjwmZt)zt.- ejzQ:QвskA(Ė=ўmLϥN~:RLplŜh$A/PG*}U%+02j]~=\@@@Q 5*d"(TZn5'Y]f br") ]ҫ\i5h>Awg\'[ߔ斪8ϡ@ `ln3CWPU {L/pE/   ,@Pcnn$0p@{B-IJV L2Td1_T.lj>rLj봬X44<%<Z! WUA0`dIXsS5v顗֚gbX[\W!]:XG@@H-Lςbi25h`Vvda4r/QyҼR.w`V+wZyGSu7K ]$הIGD@@OV)5B>ݼFr'ww(kdEi@@H ~H%@@@@ YMm@@@@ H%@@@@ YMm@@@@ H%@@@@ YMm@@@@JZP @ Mu2MjB5@@@ 5 K`f_5=@@2@T@@@H7Z֢@@@ZT@@@H7Z֢@@@ZT@@@H7Z֢2B tRFԓJ"   L pMYs||]GuKE^uTst@Y pW\ߨn{ϩ *q7mZt8]Z0A5zJigm\kjo3FcC/xV3T *̍h_   0jMt 0JY*6n+҆R(,tjTXU[*X[VT`T&yzj^h0O+\ڴA]Vk4?B+ &H0q_  ^Y*B@@Jc%K 0‰VVvr=ɑhq9U ~/#qmJ9k7yxLX+Ts(y&╸>JuRsgX⪑lyT`Ǚ p8UT< V.'N^\ < R =V&ϕjӚ#bJ|WM >y&mAm=ҭ۽[k/"  (@PkL oe٣W+Z3`^=N4C kh϶ *+7Na١3΅f.;h@ u%߳w# u4W1C(WƆUZ9^#9"  (@PkL[|N{k9,W~c#M-ӖvŜw稰 S|W&p?4mڼf70[=¬GrrGCo6{NXVïWJ    5qۆ! s\u<0Ϛ\ 5 )0ҋc_hF]-u揖*lŦ\]˼ݫ]M|R>ͥS[_|S[<ܕ5e /@@@`xYs'8⽭Bjxr̔Se|=S JئMh9UaA|a3Ny<&_Vs,z4) ;`V/KNdFu `F=.)BUiiWר@@@ 5~ >Fj:(,vfnطǔ#P{ LO\fXZŷKGa.ovn+5|tѵ~ot'ܮ.=Z|Q^\_f:h    5ۇ!(x ڭSSpw|KT^Or'GVs&R+ ]$הWL@ꟊ#   @*JV 0"Lo^#[rU|;r5-@@PL?     EPH    0jM0    C 5%    L(Z9(     Pj E4    J kB .p.@@@@ @qXW@@2@T@@@H7Z֢@@@ZT@@@H7Z֢@@@ZT@@@H7Z֢@@@ZT@@@H7Z֢@@@ZT@@@H7Z֢@@@ZTLNuMm a:Bc\[1#  1k@ ]61vVxu?P{;Uu:g۴j%rqѝJ:9_W|I刎zGi`Db@@@`j:)"D/WUI$-u[6,/0ѫnO"ڴ%ohE|ZYҦ5 *WRr^#Djl)     ?L& ` $0UVvr=ɑǝ ai V]iq*'\o% |.JuRss]:YQ@<C@@4 J@C=ءGUɳ\׭ѡpjmǝ^u[^VGܪ>se ~LHk|}ݎ+@@@ jZQ^V{+Juil3smQ~yvz@GGWjh϶ *+7#vJ4&Ng    5;jӲc >c?:ps:WU%r# _yV{7   0BZ#rH j:(,v7åA{LT>Q93OVQodؠ[J21/Wv+xsvU7v顗֎z?*R"F@@^V71Dςbi<Nu ;rfOϹU\,/a@@@`ERHMLo^#[rU|;r5p5   x!o@@@@ rMF@@@@j@@@@H9Z)d@@@@@@@@ rMF@@@@& 9Ml:'}cǬ`sֺvV9k;:sY 6.\ 7ܐ6" oL\akf_,@@@ &M-ckd^kk')Ml5`Y۱>[Cv>:f-}}XA!@ "@j4@@@ /`fbA@@@@ jTsQX@@@@K@@@@ rMF@@@@j@@@@H9Z)d@@@@@@@@ rMF@@@@j@@@@H9Z)dH(|H~44+`Zk@UVwmִOW)+Lzd{G,3 ~FZ.PB|X??O̹@[Zkc@L!H~[d{"l?#mgAYE c=Y]=j@EOoT]EJ7Ԫ0a~IRzDn:,&-t Q̖ʳ۪CoJe NHP-ۡzMsWANfHۛz5 ]3wjMř(Č|=_[%O,?}zGݦ LiBYj۬#o'+_Vv6UkӁt3ꅕr#]:~T%9)qDn-9+vk${e޴Y5NH4 sg{"wvuq9'C\ !d%&@EM싒)* CЋ * BĤ}Q1 HIp&a0-{s{ӵ_4k>zZguYkSfo+qo{~ׂgU Z'_G,׉]O|=+[(^Gn|^)jϱfE)uuN^[]Ӈ {wa}=sU\O[+J,-j_eeol)6BGo_ͬO5 )fۻ}{/wxq}13yZ}=ژ垛xEUYȵ:>gW5T>rU1]'}bՙ.UgwχV]+E%wΟ6v:R".Aǁ՟rlyduT~Vω緽kW]0YI͗q8'ʙw>DY?"^ f_M{k]׹UWGŶӇjp\^uiRG:X-k-ȯB 333q W,o_&{^x{B=~]|x5'x{^ph0_~8//|{+,z;6{w*}8ac{{}8c_5[nn?,4>5IDATؙEԸGZ0{Br^#kug^ydCwz&O.Xʣ -5ȍc~V8?+Gboظ*xHUǦ{1Nn_ yfkAy6{r[4Wo4@pd*'˧ClcޕqWl~; m|O+r\5[)o۾xg5ЍS;ꘕfn?/ԥWQ̙Co0 [zh;έ{c=eraǩpW+K| ?V~IUsg;Wnhw}|nQ(@?ac<o dhܽ%xP)8};#w//w\oZӳ_2v?+S^?Q~>W-;;8Z$phQZPvI#KޢVذκ:( (jQeMԟۮo,*]{C{czD okU? {;d{w:6S(rGl[m'cxD=${Hpw >t |zC>ޤobW|hqUw+VoQQW>-Ė[nhע|xJųwxʬω7˃SSGu~ltbyY^'Ǖ[ӻ{Pxq7etqߵ!&ضSGڮ^~>-+1W7꒢֨a$WHƿ>-\LoVZ9HLyCkĦ3#j{CoN7|5lAO;'Vĭgv7>w_yq4䊫==P5C7}mVǞ߈UsbtWv>qqoctNɥo\rri!#v-謪~993__Cr(Gr},la]L z;OX߹SF|_=sbշƏʵ~TťˏĵG1Ggsj ۣ1b+b#osBJO=~wGZ>ce*nݐ^u9?# +g?~uC-ѿ˷c]7~~B.ذrnt:V1d떩cn͛7m~9^rfޞG94Ogon6[G3vl>>πlv~A)u891o]Q/~] A1qe;Qt{޴16pWY\_Jmq͛;G;_ֻ~3O,(wLM?/D^Q$)ϮTd~Vω\uk|{o,?37cM|)rNbεW~(_A?aEtqL_Im'bW?;?\hO8P~ N>|hb/@7g}fwa]Ǣ=:yrٻKkC\#G0e!pܵWAęM_},{חf!|X)nj\#k"0 #QC֘~WTbJNէ~tnܽӝ^};lkߌks[I|8t1ZlˌN9/.PK.yG{-;|u\&@ @KO*ŪJ٨މu77[{?Ͻq%sJ|5뮉KΝjw?}j|Cw+_zSк[?XyV_"ڻR9YW]ֳb}hVzk8p1Rкna]ܳ=;T)nÆ䂉ҷy9Oc:V]q~=2w^Co iz֟S/ Vǟ^m<[N)hn%j}~sfwl)-g>2׻;qLq|p @  ;UPތwfƎ宪sVDžgL)^XG*ԹbL2.^*Κjϝ12nҋ'VK٪C{߽g\tq.VXsE))ZS/y}*֜:~=H3S>|]l]u~Lxω5fx>J켸黛c5Kה"vMBz)'}k⢳ΊU|\^O=]SΪt{Uek'cyOnf:^(W~Krk:;{흷~ϸ(.]sl1M D @ @`[>|XV_j[{Tz񝯗OLﵩNP[)&[sUU*5ۦVu+^<?35;*c{RY}N~A: W_8xPf٤BvqӺqgo̭gjM~$+ˣ*~>=nPߜOI2@oN8]eKړM79Ǻm线d_)&ݛ[WgIj}EE! @ @NJTPi|rg,Aw0HeAԾ[yy<{\Lϻ@'t7  @ @CEP.& @ @ 8 @ @E;dL @ @ @ @5t C @ P @ @:1a@ @ Z @ @CG2& @ @ @Qs @ @`PCƄ!@ @(jq@ @  ZCwȘ0 @ @E-@ @ #@Qk @ @9@ @ 0t(j !c @ @8 @ @E;dL @ @ @ @5t C @ P @ @:1a@ @ Z @ @CG2& @ @ 0E0C @ 1#0a(jcH@ @ 0Nr}ĺo[rPVÆ @ @L䗯nkչjE-C L/E @ @XK[qն&8 0gG @ @85zϲa9ZmnZb 履\ @ @N_ı\Ƭr'kYj_[? @ @Q5 E_%kKUZIy񃎛r_N9o,1 @ @1O}M;M1 @ @| 䚂,m-h)_i<-#[Ͷdng:w.K"E5<馸AtooYRٮ~:!H@ @ PPMzu| Z&Xt~?_Yok|Zb EB @ 0^\kЪg)]u'ۛ%tퟏ,w]x7/UQiǚ`.('%\\I\ye~"Hj,os_G~%=Qh @ дBܜ/Y:׾<,e[,CjY69!iwQr)ZZ\hScX~KŭɜBUW>5lkڔ&iju_q @ :\ zڧ|g;tɦ}' G[T+?s5|KiR"Vx9WVi]5K鞛t @ @G [6%#[G/C̎~jnYLbZ|.hٗzQĔ7}Y.D)G VjmbZm+1Iݲn @ !Z[]oc%׹"='ɦ1ZeM>5"'Xγ.úbjv7ҍe9YX.eQ+TTA1ۖgd&.J%\“}Vے쳝%|Ds' @ @cC@u'7V ym˗m|}u}Y/)WͲkk㋒Uj<^Pn4f׶Rt7 Vy.)_>5bj9fݲqom? @ ຂWmySm/$̺|7I+ޏ|%ղXScd߲ )jir. :)e?/s_t`4]-lei $k=f_w@ @ 0VT[pk]p̶ Q8;O:ٗuh۶T_˦6ŏ/u ɡ N u(&#OysL.NSs󘖹<ż5ܷMc @ @`NfIMeؖtm~ɬ;g㹟_Kɯ~Ryڿ {E-M_fиd@*mqlb}9G>mmXTe+ @ @P}A-K7]K=$˲m;ce~Wski;DZZ.6^wآ$]Ա^:7SYl)~:/]-^O9O97muLr,k @ "ZuK{m%sIϛeecs?YJWxj̾NB_5 GEYi rm+Jrdb|n꫘Yw~ZwN=Ni @ @ToPkeIwssc1}m9RyǤ"P F9-ߤ %]rJ舘l5E+X9Wy~ciZw=B @ 0NTSpkz:Gn)_zky6 7;mM-r=«/KMyHeuImjsr)7ujK[ Yt@rEd_ӖmC[~mP'/]M15ˮukؑX @  jαTtֳTٗ6]I6Ω_<wnib9UOQK;[LQ&OVx߹jkśt @ ܲ.lt$]?M>Žy uߒ:[Xպ|jesz9{Χ5`%A;Vp!o龂Zη_R}Og Wr)?rǛ|ukW,^V$4ywT^qDzOuUs˶|C1j[-'f]m{\'!@ @aۗ6ۅ%aݹٖ϶u[1gmʳnf-bZ|6,쓮&*4Ieݶ㚛s4tKl+numKYج @ "B̺?R~ɶ=ZϱNR/ ? E'%w,a]BZ=|j|-]xߵ1W,Oec4+];-Yw @ @5mɬ+zGm<뒹tKQx\n隸W{ͷUIkg]2ΓO]-~娏lS}]rmKm[ u$1Zmw~@ @pp߬']pl\4g鶝+t&Ε]~1ܘoQkcO\ɺ/9.]c8.&.ZBT+WS\,Q窏7nYz'  @ @(rúٖ7du}a=ˬw?M-KH5˺vIГu{Š[n``e]R[/la>'7o_+iʱO:  @ T=CM~om R9o.='eKwS[[\ꢖ&Tܱ?KMqvE%_jYxuuAi9_S>6cĔk @ @xp«ζ&}mkۃHϺdx_yzskҗ Гwn-Ӵ dSaˀOae筘Gm19nIʧ\ @ @ ԵM>!ݶZ<\7ɶuI%ylK-wO]W{-ηpdmZ!*fe}TEy,yw\ks̅'edgQפ~Ssܺn-Ϻ @ @& 8-+vss-Ŝe]rҝ{/Amʅb>ۖڮR9MŬ.1~jgNB/'֦7CB @ 0>bV}M}|Zypզ{ ߺZαt5խWao?;Ǥ۶j]rNg-xr6}l@ @F@Sնhg^•cXq,d-'Kts}e]\־l[Tn4ua* Y~9Oz9.@ @ȅ&ݾZjLE:78/K=sy]FŚΦٗu gM:'ǥ-d[5oY!c:H@ @ Poݦb׺oZO퓭f:r>gY5|W.X\rZ6xꗛm.Dz}x廹m$ @ @~:\ɬ+O-quueE.jՓb\ɺl[rz=fm|/c:\>j~I @ !Pڟmu%wܾlS=~/Bbv4Fg+֛dmGqxYw[~bu.6 @ @G_-k)RO}qM汥9km7q߁R]Ʃ}lrm;:.}sn1G @ @` ԅ6]:yn5śr/x'iϱ 9%Ijg_Α^e9ٯ>u89Yֺ-~s @ %Яx3hy4췮uIα&%rN1}ԗ6N9d7p$7kdz @ @M)䜬k<۵oei屲qϺ\qy,Bƪ9mgi]Sn˱xI[6H@ @Ɠ@[!/J9fm2w>YZwNP-yɥ.4XjQ^ig0αtߜSr|!!@ @\r!ɹٗ~:϶JmYmK92: P%(oX˶uK/,k[yYWkʫ%B 9( @  NrrM[oo[1KdWw x]K1b&=v-X/; @ ESj[cf_s~KŶezM9r@re_ٶڧ\,cվs>HNG @ @@]819'myn7>ɺcm~-(6|umK/ͮϾ6Z~>ǐ @ @`PM&˱6ym~ױ\~$5 \ckmkWYzsk}8گߘ @ @mVPx9/Mqc))m_\\ś|b5:Ov[_1h^ @ 0hA-o:9u%Y9McQtkM~ ׶Ʌ71@ @FB =uڮIOScsscYk_m TAs$ @ @@O헓cYw_ɥ{̶_y 3-g~vArٷ @ @hXlguNmgm3,~⒌2A)Yhm[>mc @ @m~d4 y~dr! +gq8b @ @KM__,cƵY2.gsAr._X @ @\Z(\9s瓛-Z?^5 ҧ @ ,73H6\YRy<r3 |`/8m @ @`,Uh'>~|6baC @ |79|ԘRY<(P-e!@ @]0Z w0ejK51;X @ 4XR0ťwBaXXg2#B @ 0LUqXgY؏jfT׵,'B @ 0ttƱ3kn: @ @-#Wwx(Y3 @ ,X @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ^ JPO-IENDB`pgcharts/propaganda/pgcharts-chart.png000066400000000000000000004660551315737174100204560ustar00rootroot00000000000000PNG  IHDRԨ iCCPICC ProfileH wTSI{H ҫ@A`#$! % bW\ *"芈kd-(EYTu`C{η}sޝ;w̻ @{3QU,T$=/3T!͋UJtv<^hś@@"$ ِ R`B!8/)%Ma:;8PVk,rZ<.O\ mp)27Xl8őI h Xb~ $ OvV@F  ~8G NYW n~x CF!!t b8"D"1H"C#@v#/ ,r F!PTG#8t.Gs]A=^Ao=Kt8*N gŹqQd\N[+ƕq\7'x&9R:|~?ߎ= "" E2>qy-B?=H"Z݈a$b:qqqJ&I$ɆM"IRRi; :L%!d\F>@>MN~FQRU2STR*-TڠWEREbAQ)+(zyC[*jLΤ ˩ԋ^':͚HCjh{t:ݜGOKs e;e2WyrruW*J*f**T TT\STUR5W Te.UT=zGuXN%$us`uzs} Ä0V1235,tCCΚ 4{pZZ,L ZGnk}?oIO=YO]ݠ}KS'X'CgN#]L;uN֘53xP=kEz{ 423H7bp`ac(4bxSd3ۙCFzFaF2FF#+PLML N7]lZgzLL`ͬ샹yj&,:tK_j˛VD+w V]֨ jj#a=0chJ;4[<:^;-HvMvNMijo.{8;;thqxhqtDw qZƙ ej6nz7S*;/z<qcfǪ37" M=I'OxךF'+Oipr虂3í}muf/^pÿE'/y^:qr+W]㝮ܮ5wyttO>}A7.dݼrkƭޙs.{^ϻ?`CG=מSAW>y{G_ ҟ=3|VɁ_,SϪWաYC%G߬{ޏ|(q'O??YזofX-F4- M = (u2^c|rx--_j_ fӰY^2DrӜI[}R WȎѯ{z@kx}.&Zh:/Rc iTXtXML:com.adobe.xmp 1205 966 ,@IDATx u[[!$$!$! 8ޒg-Nqdbo덗kg2eƎ 06K6/ҭ^Owu,pvU:uSwB.#d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d~: 1{v\vF #d2@F #dNqzNRM d2@F #d2@F pspy@F #d2@F #dDd@rl&>jC%D2@F #d2@F # Cu85TrMxh=O4ߠ2Fxs|e2-#d2@F #d2`Q-,=uyXSKكjҫы2j+@F #d2@F #d^zSietʟUOO8\ &Zz^Xb<-^Sy hd洌@F #d2@F #d?N1`q#tho4ʹ22>ۯ'?.d}7ZH?U [o Ӳd2@F #d2@FV}hU yS>Ҫū-,ӊy;ÚTTMn"]\YH4)Ͳ7Iõ9d2@F #d2@F EAP52"Z'JwCdi),oLOyVFKWFsZ3@F #d2@F # @PV#34t)id2@F #d2@F7oҴZ f>4L]uա<yBKӠh?l]iIK.p1*cG> ^׽j̙/1bĬPWg~L/:4^_-nωq|tk^;?R\͓7Ynwz5~4,`e>2]+/p'*V]7}xsc\smkWE0O#hEx0W2.郕tח|r.>w~yc\s_l6+U2y.?:Å;Q=UsNw| ߼uؾ?>e0َpZ[[l߾7tGS81| /KKiRDŽ?G ^^5^YJ(_i5>ce^{ퟏ3"ejhh RV|bRWWL#4 ]ᱲl,8z/2Usg^|cj̋?Zƻ2fE St㿂VKS)KYǠUsg^<21+bhb?9N_A+ %ԇ18p{-^]>l(4DӴb,^}PW9 *Cَ8a8^7ON8R9e*ơM'?ӦM{ E*[I(E6~J'Lyq9-]h[KyȑoC7ͲIR7ݲMs^|Ã4|By|Ҋq-.}64)0w}9lYc~NiӸYM3}cZ$;?E'~J' jl5MK2#/H\4_Kq샙æf?ܒ>8henZ[W8s?7M+ qǿu)ՓTG<Mc۴Էqẋ<迩wvv&M:/~qHHg+q%@xOvz>$g#,o>+'2nٲMMM3=HQzo 8q4+[&te|i{6 :'4LzGO,:a1υ3byҸ-m'/b:"y OZomZYkY#噏tS߲oiLs>qŶiS030~<1F)i8ԼdMyow#8F%o_ckp3OPj7~1JqL)%oCB4Lzy[Oqn~A'lOu~ߏi1JqL)%kCB4L{SO?}fPD: ^TȓI+Op-qxuQ3(1 e4#p1^'yNï2Uܶm/`"HoS:4jyvďץӰќF48n^Cgt|\]W]Z7w~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ' ʓ.7T ^Ǚ/zqhic•9<(oxVѪxaL'@ᔿPVLҝmea+iq0C>iHp.e໎) Z>ZǬO!|I:c\v+iL}u{˲#eÓ֕TX?i4X7wYv5|.-+r)e໎) :g+W>bVlHI.E LsgK;_UVRP̗ ;-a(@>$#^o͛ofyGx:`;-S:a84yeE?g9$;_jd[@9:V*|1 >OcLC~."G8MB/5i^!Xv~g;i8d\\&Ǽg(R3N\(;|\cgsTq ~.tHw4-? b|1߿2)FaEcltg\㛷XeYiΗ.0."~-S~Qqq.?q߼粣Ky/taXnZGS>=siY?]siZ$&,|y?zzf$ XMCq2wyy eEbYNi<t4?o]|\?c:Hw4-? |s9?z@7ap~:srbbo:lp"?.2zZ.qxp|)Keu*++crMLp,VR*iiTVAw?KNe^7Cˆq |oYN'a!Y'(8ק&nyi,恎C>4iruvM4i+rfiy:;u%Jt|EurZdCy08m.e9/4.x1&e:e;ekRTr]iry7t򡙎_Ls]4O#+4=VB+"Cʳlǹlv-yq,NjF/m7,y- .^r\gO-/3ytb\Y.~ZNw]_wzPe; ?e[%nY e9^L-6zigkYNw𚆰7:\ׇx&nyi\|h\W:ruvJt^wˀ4>0qKo8C3"iG8]Wiz@W]'E?gÏsٖr[BrY{^nYZ]!,M.![^Z/g~@!4N\˷L|.rRʜi-<.ZZ|t|IhE,$# iL7FN#_JK_O~g;l팑浟~mL#ivゖiHii>—h0A3΄ ' gzO]Qĥach=e;k3=-WL'n'%a+cL0OiC&|1iwy:2Hq?E]8@gҰA_cxS\Y|3˄VLO%lYqr+LLKt:W):ax_OTFJK!DLሧ29}Wp>DŹ/vΝ;bOyabt|RWiDŽ !iMs/-;t2heuvvtPb𝧣oc^C>a@ B^;q>"|L >G2눏\9/wkw;͟r͏Fȋs[/Ms(8ѨQ´i¸q"HYO|t )Fe1^q[Cز]󻾎;(y]g|iEyrS9EKeZz\&rݻzzX?ySt;#?iOi)S\׃1}xpcƌ 'OGc}B(c޽}c {Mzѹ|Mww^7)OpZw1/eg&Lp y!]#l3<Ӡ.;fП>!-as_Sېew? yv絉'es>O<m6z9O=br(Dz\ 9x*'A32G#Gs?8<#,uio~n\ǩ3pn}ionnM:5GɖIY<\#6iLQ5m?2]C9NrRt;]ZVy;fY&MDRl/ȴFR[6w}?eu~.uMiqEyrأ#FN;-;6;82pm<֐q37 Y8c7@K WkG?Ӎqi젹#l6=XAA7ae.e_>a9j˪(#:w]H]kiHX5(hu7R"vpIu7neG)yݪ3嫌.M9%R QOYY!Θ.cTਯ7mG:+֫6l˞wּ0j(jJ}`$ V-q= 7n 2͋k8IEC;g6W#گ b9z lFQ!ea|oܸ1.d9'9Bx7|נ(؁փaӦ#؎y͛{VhւO ?i)ZێƬ QiӦjD8gaԘ^۩n9dƌkv 쪂I?e/cXzÜrA'߅l F즦0ykч6w #7h1B:NqA=#F 3q33>6mkQ @R6iXs֏FFHjC5iM/vH=&=f\;׮]7GhxaO ߡhż8{:{4uk^gyfylXk^h֐#5wE]Ij-d [n mmm}zd\RU״Ξ{f1|Nפ=ZnxXXKG`bۍ.qK+xieß{.ԇ￿ol@5y U v>7*ȓZ,h/\8IKÎ'k~gCw7 vzUu"w>r ;pY' w.<:Ue$VBk8zP+- 0EC>ٜO5H'9 z5W':A8%Ra{1=h&!1k\\t-Ļ;EtCDHo<’_qXSX ݔ8N?Q$6m߾=Ɲ5o/5ި?z{M~݆qO'./XhN-z Z#4I֯>@8̘1# 8ǝ5)nLw }oxkjhsYZ y d;o(0-Qe}8pa֐3eeáGct~qkn~f'~OltɨЊC±st; /}SZ'#g.C+uV| +Iۇ0~v웝^feqhXPQ".:>uo[*ׇ?QΙ~Z>PkY#Ԥ`2A^;C|]?R|ǍajpἩa퉭aw'F+%U&1^9n[n%ԍMf 螰maa҄)\nٮ].>C$=|M:,C;&pgM6MmDcZ\1a&&'#jlG>YLXD:풱 ԡWl, a up,Z UI/~ߣN8%]&c X's㈌%5 ~^:'Oatm;d:Z1*bN\6mFҡV6MYQTu+i4agy2[yT5y^cx_idsWu<'fhu@LAT O}zdOY"J'_֜Ј-DŠ+"EF0ְQ!VZ۫.8ybX/{+_o=: ,[}bjP_S>L8>l\:3pZxcllGk??oG{"ś}%_! 5U:N)VȊڹQ ҈։ZgkHC'l6cCn(? s=ȯ{NKqbyG6JgWnuyryDzt J)?zKiCL<Ьq=y<8[V9+ԉ9r$t}:. c':ӡ.Űگ^Wj+ C3ݾé<)4ŽM~{f}hꂅTq(~"B;p;$,/ü%otnX4.<}a̳c][TLٻ;|O׾M=I7^8~N=;9sa|/K9>Nyv FtԘڛμ"vBMkuP6<@aOThXa7JİHnj(*إ4l/qg]*ZGĻ<:|aS#vG $X'Ĩ )BŦ:j;bgT6~ȉÇ N3A>3VFa?!$U܁ԴY~5G,#aWdC̴"|ӎb #5CO(MMbu1~ukUqaHAm2!QyrNwMfMi![)9yŭdeaUnSOrΠxu \X b_[x:6|Ŏ$| `oT(=tP튛>sհ<)6Lп=OzDmCF4%{ R5ШE|ᄑ;[`dXybjP[TuZH7G6k l3/Fpk!BƍƎU9MuJMQ wXCi pB*k GkҡSe;XӿC1ø!M:x`=ڄ ڇv@: Z? #E!G؋膖ES'9_l6&Un}#c~vi;~8vOǿ\e;ߚ٫%/F^7p^!t؟Pa(^L,*״'{`XI*=ΕK4L'CLsǡ]2D(<6Uw}, g\hBX蟦7/w[oݘtdV(h`{^8L\0<+=5Qh Ɵ{W+M aq}#wW+_{aXpƼcKxJZg%~U«^Aj,=hAK+?h\|%h5JGzz?sv̷~cW_#UQ¢-"sH zpxݿ|1\ۿoPt,y-a/q'ًWفŻSOQ+5hc`"AQyIȭUbSHzB6n*QO詃ɒ-n'.Ҋ,,H.<])6`j?dlxQ]Oo+PQD}5&\Nǻaj,cuK=y԰0&bv#'b D[v { K#¬Ma,Z_7Pwj L:%$􈋱/z&<aݶPL[CS 3'ÚT?Dgokr&NF;naX 4Vx}}8E׆~{Ԋm854Wpp2`$ 0Q:ְG_p>o )LmcI+GX/=W=ѤIl*}0WyKF<]f"ɾ@< ,l07) *L]o8VJrhХ!XP,>Y;1I{`Ke=]iC ҝ֥4ak#F= H5;E?iZݻwhؿS6}c6UwsÓ'-?T]h8yRx]mǎXc޿"5`[u ؠ@qGC{[\vѝnY,J^~7hOS&5_sx FE]翢?k\TGc _pBƎv X12~'L)Z=gSk)Z=6D^s .ҚYk"맊 egb#]a”I+?XCa^"laĜ??>9Co1Z?Z?Ob )=Bp^KB+?!pgyGgDx(ײZ_G# ΏUs/9;/rAG^rxE tK?2|zײʕ+W򕱏^GG?"lhrT PJ4N<2ˇ|Ms~n>JpYVC|S>#Lw8j2CǦMƴíO?2,ևu*OGCoi=tk٩,SuXHݳrE:YAVʧIaȖйy]h%y*Zgbnfgw~uꫯ?eNs:'xןRO@ga:x= a&[=c#@2ijx2ܱ*0+UN MS'kiÀj߭ףm|Hk=:*d޶|S#>jk#t&W356 Qy|>>S5UÓ}7jX 6;nǏЪGtqE8?|^Oel9Kaxˈxa<F=5>tqG^O0e)i5ϬOWhiL{ߺ<,9wVgפ54j복Z4c{D_3q)w%Z}u_د_8̰jVM{w_f? Ae_ hR:٧YgSm0nXٜ~lR®aXch;yM2w \/i ks_>%??i6\c)G5ȡ9 Y8E` R;aeեXH'?t-7}s!+"\ysΉBU}k,q:~9(%ވ-Z)evp Nzǖm-ad[kht?C -p 7h-;Y+$r,7N;}DZkqMUD4nXGdrQ7zd^a-;:n9BkPuϚ sd34|.9ݑ3frt_Dq Cnc$7pm7fjbB;8Nmi 窺mv< [wp{tǫ^ vua+.V;uksg4$%"Ey-tN)ܼ]Z9pVB|g$.5zMlcL ؾqg'ѓԯU=aݚ5VÖm?? ʓqkn?O_?t6G ˢwj;<-d5/Z:yzA R'M OH8>}A_}$2U>Da.z%Z<WAViuxƸ0ƀ_mR9DȜ&;dhoj"Vӄ2-eogp@-[nDhN>.ӣ- +z(.QkmkΣ1?{@#V<7`:ґ+o~2lDW_n#?Y>1L ~b_C5inMٳgǾa g88F wB܍kauû\7M{2wi#n0>S:&I<5> pZSgS35tk&BSGnOZ2wΕMټaaьMmkvIW/M>@&[op_?zlG뮻.s]]J'+5D_-ݩ5G'"gi uƺU˾'7-#ŋ,W\[E֣d?dw6OOax25Op=%KqOC5_Bgع3lv=u^oDcͣqGKo)<"n#s" S7x?.>4X+5x}ױO} >O}ߎf$xٳ]bq;t||3&T"DqԨx!~ZN,ivqx3 sĴE'= ;xFHKbzΦsq `N<(BNI:KɊ&ºq\hSt-zy4n1IߤjԓT\#Mtx+D%eRa- z~d9|Dғc- m䈑a葡Yi׎0[~}l]cPk*M&wvoEk' ꣡Ǎ c zRgPK 8FM ƲGOZ0uy$U:H@jQw⁔6=)̼ЩZ&6L<ڳꎢI<]n-Hd2}<.QŬ@SdشB*'>1gCFQ|ŋ O~-!;mƌx׾}a9#'? w^xW=ihБ;ZV_3`|GݨHBx-S{=O ;aJa~Ƀu۷zZDo۾Vi(?htG13nB#tqݲ={h(T#O8g~2a5bYD9s'.;ͅ.;$D%c۱sz[ Mz҄s|+Y߄QDNF 1ۘJ n׫LA1wwŤJ=zWun-4u+* 7&ႏ/L^`-Jh#OVhU6{6T 8'w|i?5ټ㿚+:G|黟1Q~?v3XkY?ި8g3Vs"kp">At53ף{$+^xDȃ('Qm{^?|?ZFGSժVHo߻OzDxAk;5թamIsU>Z˰ŭ.c\ .k_VaߡGKԃcaq!xeرsy!;'TX `U p4 ~C/bbozU rU$ld/ ~q-vyߗϊn@H} x[u A4:=9P郗p4wNTV*5iv߭;N#FUB~鐫^z=2rd@b^qO0+tkM0,V='[&)ç(=ެnmh:~c$ ̞=jk`WIw{`ia6v m֝Vhk}j^ɑe޳(,:{aXpQX@עgEVxj+f:0R\2 O]9#'WuӟG= ^A]WO-lپ+~^b+keŁY\@PW wd:GlZPmÝE:zIƿonpӍ?|ɰ͉vkXy^Ԇ_:5vϬ.,X% 9`m?XWHm0Qfm[I?~XCTl3"63Θ-tEʊ9{[#'U7Un+(JF.w:˞--/n{[ŀ#۪E׆'߱*kMyw+,.z_kcͺuzC*jfX_Cgh,H!𞭧_=6UlIoT݊WH^99!^IVb7([>nTKx3CIo;Z YЁ o]P_^?Ё~[lȈWU-JQe1W 5V]we1^fL g9=`aW[ ̜?7G4?]K. o㗆/H?ҭ'ZXp‹_p酋—㾯PW&oO+F/>l.j?OhعMaJ;/O yYԞo7JkYcEV_).0gNz;0.Cw;2^a7KX1ftUF^.ձӆ4߷{bR*2U-b`;f<#nek]W|C/#]e!yӦVIȞmЩ0Vj~[acs]Tޣ^͎GlMaꔉ«_@h|-W_.Z47_ptakeo>xa>nYaXWicGaj׶]jQW3fa&{s*2EO½82 ynMo=H¨w'kt\bk-rX>lϏ.l=Z5tak8OWˌ?~p׹ORa/.{ixɋ. _}/{?OytNsG;t==G6{8ĶuOs cw0=^t汯g~T۶?p% g/~_x_+Zkq"YOAmҤ ;l|أ9V>pk7T_m_Å8W/ ,ZС.+ 53| qsc֥ׄ1_?3oݶ] ?ۿn':3lOEH~Q/y>R߯íjo_^8,abAL*'yF׀FXdsflX޼a͢H2䫏:yn qN;VY쁢$X70ŋfR']q ˇ*U8½1orL+7}9^ONrEȧ}:vVVh(J?mYnhak6V]hxbry;d6p<98i?ҪӲٸ1M7ezT;哔 7:' & L)o5G'M?%g0vv a}Gکno7Fj)^UyT^6~|n1-!\?lޛ/n}sh.oU2)3c#x#ga{4rwM? m>u櫾NrVë_wLhk 6nݼTzt'="< ?Qzc8T)CwnE_SuXiulh,?B&L'NW;oY1Y;"^GG7l lܯ_\7O@bKW?@aڰ[$~-+]z =}SwcW|Nƿcm_~7*|_0oѬ>^Z۵/|?*|mᶇ?ޚ~ L7O]Gƒ, ;}nOke/~1?Zt=aC嶛il]7ư}V1Fmx*o>>F_3;wdM!OEi^Ok/El>eG9l߯ ׽,4~ת8ʏ,՗PM BY*`|JY#YO)N LUhطjsWƫ$+ G~)9/oo-[7Wvi)WqSBlTCүTm N8o9D6t>'{Ó+oKe_៯ѯ*w3W_nM8?܆ Rw>oTyr٣V}VACocS.C"_q[}A Cx#185>k_e_0A8XeޕV!/y"x ql w র}֨Zr0186yzgoǫ~Z@|<W߷{7i}+]AG6/=_-UOܥrp"(;@>ci>I翴Ӷ;Z|:ְ8a:|?&|maG:<֟|0&Z{+6=eM.GU-C:Ne[0uryMOyi͢A8C#/Ys}7īnˏYv=$>ְaa݇CWaOϟ>OG#/uaK੬Tߴp/~so<`_vXw+?֊kcӦѭٸ"9z}UaOk]O} ǯ {y?t=?]3swD7]ҥޥXpw-U0]+Fkhdڏ ]WPdž/<~@_wgtY7^7lj?_ˆQZKo%{ݺIL {uh{M?;oZGcifpDi +/6Sxe>þnЖXk1-%^Vp;(њ?Hv̓M{R2q_Pد^O{ _94##8' qb'Szp@#\>l1/<[s 8YΠPguHyh|i/ҝ1kRV V(b^g j9Cv=Zޭs@h.4%? ił6}qvxxeg9ho|2gƼuDJk غaۣz=Kkh6*܁力Hx/SrEVu¾`56 tWZc;4'g߼!s]?k÷oab0W'2LlDxg>^ʰ~}~'esp״[lʆ 2a~[X*ܰ;n=m~򳟇w|LDiZLcd0Q|# +X֬z4}>5Z,^uUagh.Md8:/냞:`/G{[]|H>T6o`񝯇=Ԏq#C÷%ztgXI1y4=ƒ!-~gA4~m@co ZQ>ᆛo ZtNxW-/dW]ַǟݖ] 9v*u]1rhᢳ}DV?^~Z$CO~Za] d&(kp2; e[|h~o3gL x~]wo]6O'uZhdžvX# ~8_| c5N8M}o^aɕH}>ra˖⢠n?67ƻY𽃾1z]WK*ŕ>оbm|\4xʸE-ϭ{EG^LyOWZݾiGF;n8v!;6mStdS!\SHgV?Z]V1Θ?Osv|~ceԥim:jXbs)wq@Kd=LyQ颧a +w9" m]>?kzEazm5!˃_^x+?]E$۲iMM !D4AAP@Qi"(TJ`@H{^ܝݻ/o7+Ν;w̙̙g!NVؒWة,ypN@UF$)/|e ([l{3ly ɡw~=(+'PxZ5ƐZ?qdGVi1_S6m; ;wY?r)f+XM^Wr^\]-Le홟>DžL[,\p֬O<5H(KGnus?~KMV5aQ},o$&8ou - f)oiə68HK }u6>o wi\.[grœ\gwb>wO&f>9%9hnGjK 0Xj]cy'#l̊4nyDžOjYZٷKQOY-S캳΀6_.?e KV؝eSgbW`TX{?eQty}qcm6 Cb`tq-0=ބivo_0~_s0s[Rr#YjtSv],{eVYs 78k?I_D8M^ۯ(?֜ .fh>SnQG}bHs}/{?Ǵ +Op%}'5)e InI~zG5V/Ayj/y+!\ BH=H ᣪl|*e܆0zXIIGðPu*GuR_*U^ؘ띚Cg]3]{.ݵÇ{7Zp#z W^ȳPdig!:+Bt4!G] R0t9~m6զZiVnh׶eJ@8zq8[rAIUGimKmۊ7mֱ^k̺];֍;l]MB@ ST!2}_3Xj:w;۴Y+X7U/oz{GmQxJ!  @%gI[t;1v~ֺluL$5֭S ֵ؆ftEqoC!d*a^!oOL9}N~{w,[6y]WlEm#oKys>_C@y1D{lfH1QYưjʩ@RA3s 6lm(- A3ۿz^v#̮7x#e g:]q/ .2l`vhhjQ^x9)ʗjf{`a|iͶtWraF8vS|tWl߭ŧ +`;e1[l 40*6g \f*;z(ѵ7VИ_3mZ1{lJr^j{zn _z>T[4%_gW?}a֩M l0ڹ]Kk`뀼`*֞mI)z;0b= f"?<}6K,Z"0$U&AQơ_sm5ѾQFƕ, ? fi 1j$m@5W-bf stWj]|4Z`أkrp]ݰ#1"/oe<y6K/=vޟO{_Y:8QJMHla;ydKPu4Gڂs䈑,fT{ >⽦dL@Ќn0ѵ( \ʐЍo-6婥]$9TāCW߂XeRc'Y~.PYQ,Xk7v{) O[ػ3lclΣa5SUi/MbKkBF\OC-AY?Qpmx49ʘl 9ΫɐU 9O|y(vYC{p2t?ǿ?cފ߶o{n+svC_q٣QOEM#Gc}{ hECc9Vl8KnЅjZ?X2-<3s"XIF_ݭi6vׇ- lӬg슴5>QKjhs tuO}, :THrx@`n,VKՆ]Z }҅.#m6>|۳e[yzR3Zf$! Tf"Ho(}6. [ymF"+Z^FZn~/R1]2uJViƶ_DBVy߼, ۀ`;vZ%6ߜڴ%˭9;`'NY=Vo ޕ[K]Ԏ u2^4CsEW=ߝhn-R֩/j.x7_] MQ֙ͪfZ5Jع45M0Vx9{PKP+ڷ~z!y50-G!DKJWG͚kk \R O~y=>Z{SX*Ȏ鮼B9p!.~~qn[pq26q"d6íyU@&)yT0#]2|T?p87so xb> ,M;qDwKگrTlf5[ۂ;0hՐ/X FaI,1!.Ye?B(fop }rk;P_q?fY=˟! x$&&WbvyR:"`گڰyÆ 6q$^uZ_cr & ay}N;n+yh gj7NU]ra8/ /0q?/kp0aВ#AK_}8%Q_0bƖp:C|e( ͇i֭<iї)&j5Rfn-vltȮn nMYJWgf d/=s1_nWnڂ)C߾h_~,g_J>/&aZ^jx%]9: zW`0QMsiϲJZj'n(`9G{uvb ߽ `w1J8}'`[{]^xBdDJ g9`R,8ao`*G!d4o|aKY>Vcjb;y6/]l^}r:\axmm_ 9`^(Csz3֛l!E5?~Tnk` xڅ mdH_hJ*KH:ay^%l쫣ZIAW*8` - %bKm&oZ޵wY^Qfc~imLyƷ?09I;XjWbX"F- //(@k()Kb}3;DNa?e\`RC%V=S>y΅R*(Rŗ!β[Qߴ^~ǎ;~:wiv?/~~NmD".|we8/OS`f۶p$ alh;L>ygRzt?':n=:iw%CkY90EkB)2d4[ H$ ˡ]m7n&9y:F;r%nGv:wdhQg?/]VbEm^v+)9= Ap wgLll_6WֵoXBΑ|(=~V>}AAN#:޻zY-12f0JȥgYzG4ӡo뙖%K$>dgR/Ͽr꧲#N3w0ɥ/O%X[Lnϣwdܹ3TAx ZU-kab袞8zy*A`ߞl`l{xVbzuܫ\SI:fD2 :Y;:J£j~``@Y,WYKJ ٍiok}L`e )XPa~k8 R2#Q_yQ~뷟Jڽ{;bg?佃;*nMґZw {ͨ7:gaGAw+Ae7[9ay-"MWeiW>aGN/gUW~[lO?;M77{ٶr*Be:GGÇ )~& pNN;%-rcɨJAH4/20)22ln14JcTcpymw K.e\upRN \S?Ѩ _tX^T@Jy /K򅆀%0fV##y4##M}o-Z8ߎ34Φ?J &SA_U-2+mX?xDZP4/I'm/-M7ߟc?Dr ՒbXw-vۄclb? >\oc֗1(*,ZFM})CO*Km+Y;S왧&Fa EOC? ɫvՊДjht |$/nRcmCޅ&%%~m g3j::^-|:O䋾pcNdZW}=7q#ZT 8"XhF`DwBqܿfz;KS>ka>ڝK$(pz4zAܱ"& _˳-b, ʲ[inYnO Z=CR >~=c7t{eɹvWJ[kOy~A YcqX1Le<?-_H?xppH<,n -?1bعݺY*x;yx$HL݅Uv9vË]Z8/X1.\46Sl]u؅JdgD--w+9|p(V_XfϜk׬F0*VT*95_4_lBGn;vo__ªGuɿ{KLJ^]z1o}˳;d:h(zŽǸ4/XyNPv_>)^B5FkH'8zR l'm_sNvK ~ߓb<!}{ː9Nп6Y6O&m]L5R f-j'!CMh|ygݹkeOU\XKƣ?WJB-3 j҇7ZرcG{7\4#e+#<{'ؗ;';(* &4yx[lPSD-O}ɐE[R.C&Q?[DEsr^ݐ}+{˖M7A aӊQonp0~ZVX\%OUq"MQ^ hedA%$!Ke8pT;Z?MnN^oWtʶo WG5\E:Ā(]k}qfgsFz_#ܸ߉Jgk$,*Lpo';]h3 T}*%Qs,diE3'|?-N\{,5K Ɣ,ڿl2[d[W4tH[J5kAQMˣ#Z++J,`$4@IOEgt+<Ϯ['/Xr:M iV./o=ڳKcB(̪s HsHYoUj=4۹c֌5""DE%t't&.R^aC]Lx%ʈLI-2'/Kwbl࿄zOj`tJ[Koη9Õx@Izi F(}st~C|mJ:Fym۱^+F~5jr<5#^P>\%5kVh/G혨X24 n;I  ៛M噖#>r7=Wn{v`_mwE =Xc r_H+EKoZbX-}ܸ[ڵi/֌0ǔdm1ʁC%*'P"xlc#v3c/9j<`RYh_qy۹6ůE=0:֖\z{kG`CL0ed ]%/:,A^=! Y3h |6iKVp?}T@m"NOZip23 Zq9u@+:xb)Vuj~>l_Ro6~GbDiɑٶe tt 4{$ۺ:n1(jǿhJk[Q*ɳ͝ff?␅dގ=^]=IƁ+B:'c`xfuðG[<O(Eo@aIi@Adh__ОCG[oA)1kkO>e_^O_G8N_ZD҄f 5D-ey4>GG{M9QvKď.4SyCx _kG!9<Db`nZx*-<ggrK ek^ݱO<-m[1^"p=R|9?+k=~g哺҇pixoF?"__ 9cQo(a*#'0~Q/9;W/m*.)]OҲr;+޸yzXnٖݺe[8KnLѬ=$C`ܔ%\ޗ6 r)Ѻu+ # "/)%ҧ m]gQ ,έ`XcB &q1VhY Mjp+p8{Mj Djդz_}>zS#4@N _Wg4]|A(4^g"ܧZe)_AWi26|ס+GLLoas_7>]۷)|R:LRYޗ2H&Pc w=*ClkS6G{megve=kq'UId0r@3pAS1r[/)'=yv q}\oSЫ}錳!*ЉۇyB q=XV~puδvmA= J>U\Pb)xk% LD1K6, +֙8q{],\Z b;GeZ g;*FV־M{+^b@0p#" JZk OhjvTv-۝`w>7 &y@?7mm837k+(EXE.Ks"}o&n|v ̍]0 hV vvZr =Q2X:cnuēk:Fsp_W/)WQt<憎.h'0PWH] '4wsڎQ+zg?Qהk,گ  |I 3\ey-ݗkwxwF2TjJJIUW -kq4V̸ڹ'? _4S%jތ%1ʨfdPtρ?\6vQFu)և3wA+]-In0)^_~s=pWP|x{ӬE:]zwV,z xF݈ݝ*;2<*#>[0~-*$%&s!rB0*򮓇D%tIp>Qqny{={0ΑO<\L-ԡ1͓=NO2 Q8ixqߓZZW}ɐҙl2uP.钏 =¸w2G' hfU.^scֳjKJv@٥՚}8⻒8Ef3L{=r v"^([+_n/wˆb|:ͤ]3϶?B/(z4rs! Xθ7qSkي"iǕ%gıE%&v A:/3Rt)?m2:okP=y)gumcԎpM GK)yQq#1< HejXsu!`I|+72_nXr1Pc 4pR:7vٻz0"? xߞ##Ӻtf+pF׵Fڳ3r6p֔]LEP|:ӿ@S;>_bt89Yأl&敖 h{.>V60^.1n#gx'Z_. t<^v)_01lG2&ZIl )o601yCZIuwuVz8N 3mڴG ?Fأ:ֽyddV:+ C4VgzGg_Ἶ}GyϯTY//G)BNP[r!t_+@.%(غu+.3ԭwe֬qe_Mì4h ؤ4UV_(DJYQn$JIB, АOSAmZij&6Hj A<)f%P7䐊4~)GۼctAh=DJ}xplC۪5kWf]bdQ>[/ZfeZ%w+0Fסʊ;|fۡ 0 J 7>V归c+UP''y|n5މl ~fUnn<4#%}'Woa=w`xK6iv~v۳aZ|'z(:`l_7m6Nn{kpw7K&F 0.͐(RI9ڱ`۸ct h{ꟛ0rxܝw|'t3Ե?G_omGU5#Kje۟KP76 "^@mИι]-~D~u-[h=諶jFG_V *#!*SO8<|5kI neI-[yS݈Vֱ3yeѸ0$# w JAez~&pFlޅTR{r'&MPhql`Z_ >c rRY6x|+6t'Dad 43_~t{|@C;Z^T{hQtP"|͒R[~eodnƒ6:QyIm˖m`Bnxɣf\8?6vZL{878ENp`LƐ$?i m0E_鿛vrfW^xvCKQݛJv:.(βCZ+o_f?[gH5h4 J$^ג$d2/i\DzD| eM$hQmٲhTw˔p/Zv/lc#@Vq؍_ObbKS1Ғ52egC7R%?l%Za4[4Fk忆ƿ`tx;6mN#oA.CͣP"//f#Iy^++ kkBkdHN%H!BWh5gDLOQ^wkAXZ.H't]r n9bmF..q&7y76u{Y$bF9+cb<~mFR'sShٷIxp?p 'W .f}g^G?wg+bڀqV ap &G5ickeX>aqJ_m^:d(Kbi r,\('PMWÌFw6yS7 [W-{9]h֥KZ\x:Hu$_ŧQ?jȣJ9}~yUzIt(]5xG(PzYk?g_kP Q!$Î!?77T)]ϽqH+HiСo물>{+ݧxS^*ק>< L^A>w_dḚA7Q2X+\WݮIӬBO]]t)f uζx6_p !(e@j3K,4JClJD$(OW7%͸*,l _s %; JDucz?OAU,2F`V^TB(o,ҵ?\͜ 4oF12\?zϗtC|ݫ,۠{\Sd͔Q\`v"QIr,gfƪ؆fFk[vujkMzwJ<#vO:n(З$ pWۇ+Pq;_A]'(/6Hъc;=XL ;%cF)D͗icXh׮X<( (S;| }>7.m'c(ε#7hu͋Q[>8O .~I"nlޮ B Ƽ/ơ^Zڷ غ Dufv[dY\l][ [YvA?૿-q;ߔ_.IDoN{pd^L*{k~Td`eFڄY% a <`t \*a7eK$.yAfsFKϼBG՟zz'{i?hF}'};AO1L!HlX4][UB"InggNu] j`lRY('Cg#A+% 7Kjo{ݚ= ?)#Wv魖͎2bXLu(GO|T*X2$q vz,'Z`LBjZ6ȵ<*ܮD&Th:%h KKf %%Fege&-- ^f5%5e7'(c@'bftZ\B.2)CcMk4eBYf4<muY`kmdOc?3udwng9UpOء/j8>_ 4CV۳{1eT6(Զ5Gư'Ok»ZYk;cc,۳o7c-Kyx]cOP=oG׉#{wv5EҿQFӐۊ] 3YƫThߔ7i~v?ރSBmPd+5\6t?HC=sͻirS?boW_2ڤ ۩֭#N" 1ӊdEƤx}%z\ INA*3.6(YF2ޗKޟjB~.i|6DpV}p|uvC gYڗ-?k\E\Z8o仺V{ BB2C#R^ xdʧk=STBZ4HI*O^ eRJϾ<}9>F=J =Sۥ{=ӽ7>Qk ˘Mdy.ҝV̟ 3h {w #l3}DzXƘOU63+Q'ECrD*8*ء Tn`{Z jAM8R19?_g1a/O-JS|9O??R_)F-m6w\KKO0m//_B|3b uf)CzVBеף}^1''G'>M:t|J_>uNyu8]ךiV~Qp*DaG:g|9B0=|~/-G<&*z25`yko{oCwtxx/(`WMqcILvx1d$(rpB(+C̉AKQ@Uqu_X3JSb`jk%:2PJ w}2:wzfy=R\+BAw?KǦx߲ x(=_MiS?-5fLFlRLH)?E H'f=K^%vbiS2b@GE8NqM<n:Ő3K\徯Ь$,@jh+_X@$cX09 :8Yny uLa Rr-ELtO4]7y8%E߄0 (DJ^sę\KEj( @hjaX/zEڵ3˚|XE/5m*X?q \R3LxKcT<2s8o2fXSR3a$uoJz͘6Ӳ!#<"ӴG2?~J)OGɵ ~M2Y ΔwȐlҡ^ ֭?/[N0OS;v~FHI[?4iw~~Se[|{?`WKpZd^gw{PǗN>_VpZZu#}^<| 6B:nt@(佢LH&ա#O,z!UrtUGbϿ=Oi׻>^{_o4 2rƍlw}+˘"QIC {W^b E+jTmySE܃5"ÓvR)'n7 IP1JHy.ORš2`"s+Aŗ K  W5ߖm!vKFd|}ij* 2VUBœ41Bq!LF4x19R!F\Y/V¨ѕcְ&xMO@IDAT6@Bw+%mFf*($ڢ% n elh;*O~vZf(}6WeX2.#h|lCo|B po[^tZ0Ղ]5\Β."D^=o_^:nN]xg)ZoW, O?:K[Kg>OoWFxL ~zS<-d!M?MC8t?i?uDtL?߇=iGTCFskgP=??j>Mgk=̿GwcG 1 @ hK|<ѽ0*N# q0ga`7ÁEQ>$b$N;$J< 2iNgRnYo衤"-S$o"JŐq ULJMbm%2 CB%UaJ2١܎|-7%4%Kf/Q/K0Q#E¨KP׮^kW,l\;bA bA &\~-?覟qsdI OY:;J s>Mg(Oa<>|u^JV#2Bޟ_:}p~Y‚;GSH__HwNW6='r=x_T'Cy.,$ӷk'èS=%.ImwֳR uٵ4swR(BrLYI#Qcxk1zTCg7]L"ӉVVZf% =<³0ZV$QDQWO"m*-z BkFjIĴRy-ӓS Gb* -` >:Sym̽<x􊇉aH |ʵ?T!^WƼ hH}7^%`$6u bM F12-i@Pb00b0!ğNp>?5-HտkԒgҽOY3suD+߇ϺwZ<4]92?釜 @~%i< Z,>ý{hm-vҎ?U̵ U\+) %EBB';@y(- /v3iv@4+hf)CutJ \prXx }Ki'?'-ŀR[%X(NfᵓTT[W f\ʮ1bxk1zَzM9\ ~"Qd_#M|M!l7hɡQxx]qXUkpٍk,0Q&URzI^R0-7Q:F9( Zj良Q7qJOv|-v_&DV&Vw%I[5fDbd/V7#xiqix?111}-z?~O NudgG~ =Y? 2FaJ* ;{$#,@%AFҏ#A2pIGw1Z`Ջw]pZUyÉ2],28!)!J"(ΐnvn;|r/eDg)R!{vJmVAi;e%&J>A݁ߋ(ZUhvx?rKL>G12>i{_ /~:?GEWpAJ]y =F~4%s8OkY:tֵdzk9ާY{}wyk%IZPUGc1hV[Sɭ;V%f+j5A-Q1iI[M*<6VhVh[V TI N*W'_%a..fDDŒw<4SN1N=&+uha%w_E08Cߓ csX9/0 b5kZJr`X+ݮAwQ7 `D5v閨`xTah'v% `D=U7=j ;&Qޯ]@ F%Fr=#OVmX^zDo2 :oeTɸ;kOQ}xh'/UJy\K="bxk1z$ٰ_|,%6&䣘| UHB_=#P!TI!&JKF#u?]Ģɇ>7 @|JS^ֵtSY?7v2@inD;K|{e{7|{A6x(  QSjgR*-իIfҧdnL΋ l ec.xv aq>2x]*\gX~Q)c!\rsNc]ѲDE~ހv"`WJdAާk`ՏP 윷ߖ'J=0*.lݦ-VYVBɁ;hc.خp#L=eY̵O<=T`SrsPbh(Ying->|rKYM ~/xA;l>2l-5T:C'> jخ@'܊f@bx$k1z1 bQLG1(&EYvvзЬbz3l"JPZ8tȡrC 8 Qpul,t ~_4XRx[ 6Zn'O)rr"ŀʋ (0!QJ^C <+,NP-|?ѣC>ʡ+7jΤI?Je=  V\F%侭X|I孥`Q>%(hQ/ ŲO՗E9wP.Uf q*O\Øyӕ)^2C[}0F-^vgG>hcS֞klmsY|!m(OŠV6ަbTAWLkgpD@D@D@D@D@D@D pO|:[osYmJZlfA\pםw7y ;j+]&8a;" "2o E Q1\, ӊ*Q,J`*JJ(㒅>xeiD:..zdb+T9-|-XYANeN&bZ쬩(nxkb&w|+> Z"ۈf2Qad*hUU>ZYve}c66db&ZeI%5ً=YnYlʋddlP_Yq+" " " " " "  y𫯾˗#33S^Mp`o&\2aF 93z͸6yN}o[%5uI`ߞ;ei i_l?ZgvSpe+2V)u%s) ETi@#+⑓x*Zv]*)B&\NWcUV'*SL >_a,F( VqZچ7g Җ( :kVW&;USΥQrvelª?,XvUZ̙= VBѮ"_w>_g?vk @VQ9`@y;xNAZ UEҚJ" " " " " " G7>u]_| +V@VVVs^cpݸyͷ݌LŎ/%{(~ 7m]wy1n-lP0sU*af1mq}gVkK}2VRSZ^'j4v]z,]L*Tՠ?[t'2QH2+ƶ?'>ޜ /J7@>@O]gyӁM$3AYEu64nrZ>u&DXǾ[,.;φF+,|-ѥsW Zl[.xQ노ڿKâV7od[OZC:N[BNqKqauR~:L/}+?>G UО<Ξ%$. TVP㴴J̬okha&c:6buZrsdU'kK?Ŵ;&M:gĞ0>U$' p>p9<(\siXQyW0O?B[./_h̽zyӘ4#b =*|o@$? 䟑UhYhjć̮湣6`0wNr|NVĥbO>SہΏ/IDK_De,2C" " " " " N^~?5KW^VИ#smQ48ᅰZS]:~v^v)Lڴ'ɝ:!cqmw &+~9:TŖu7܊;s H} v]< O9J;e 8'Eua Ni&DG)j5)o`7>P[ Š6E&1+ _ J(ܹG[1 e-xGo['flLZlF$H 0C ޾zj,| tTƭЖ%&P;vazخ];ΤŗDrE/ {Ze<|q|_*u%*˴d"t+\>RR2Ko0;Q16,F^3}Zn~_}!&IFXBYk.3p69M7GV^V}Υ z| V~Y 8X´ dz^ge e/O)Uc(+ʕZzQdMKQ8Xi~a)Qj29w\mJ8#S6ZKlqUv Ojڒ {%Zr}Bwȓvqjyx+q啕 {k~ʠbUJ@/=k"\[;de; r5kґ!m[>,X_:tӍon\tє6lM/ʮ_T>2Yh!7ﯚVƛ*ϳyT8}Y@C&lv3u4 w_Iž6*@e{31ݻQXPY\dBQ_X]p^߼?zꜿPܤ D+W۹:1>Ƀy>2Gw&=t8XT\ްb_qkb>eLm&,<1\td?EkD'jXf1hQe^fѵz*|Ma!X֬xOKD$JAmܱclJx}t1š7xkR<Ǹq\{{9/7A\A PbSzW{M-}\65od?La*inFr+3؛/*lÖ g/Yz+g}cӜcŝ/ mMc+`J$ t: KWX69RXo[ou,ÛNHeOo V8}+Gǡ3\vNǾ"e_ҏ.iOOn8{o"Z ~5$KCugvR>c1ȡEg##ҵc@*r>4#TU=}9[&V&|0}\꼨_Ƈ%tOdL蔘8cGԱ$1W1v!tvv2/S7甴y͟mN[a^Gu4hE%K-۴|_|SL.zJ|WSfO  ]6NqO<qj]˼B,/X7 7.*zR Ҙ)ؘ &-^B n58Jq|,Q7Y͝;S/BvQ2K*[;R)bw?(4x>y_oC5=:Ea{ogcEv g ʾ\ :ϱt?Kֶ?iIgQS؟cX6s1gG:Y7~o̐6+XɟҦ1~r F@~G9S`7[9$*µ1Qb.eA!K}ƾƱ^z߹Y{kiز3|&,~g:Bw.tAi$" " " " " 07dXj&N u懳ga.aKΨ k3wm^UtFE#hL5 oCs(ƌTu2/l:~%l!Fg xZqNsO7czF7G>hʄ6r!L2m -]Ƈͺ̘DI^2k̒(55FrJX֬(26M`G<E>PVGz̙0T@|+?[[L^ceM31/|-{1W38] b/6m)˼nOYȹ٪ĬjW#uo"5ڶCCe2Jk.cO75 qxbe3vQ%x'?G y籸w6ZS&~ܱy_`ۖXgu`ZwO/~b@9 q[v7~3\hwD +`XGJk*xc/WW.Uwg, φO_ _V_?6ӗ|W.}6lFzhabx5n'wWQf,ԈkzE"׼9O@_/{Yow"r<9ˌخxXL\V{[s⩧+s0λjfֿ.U! 0`@zH]eE=l.z/<%4ˑ{'j9'}[ zm3O8so1(9z+5һry1Ρ#h5 1aBdԼ߼f9| G@:"D-[2*[[NLn_<.:2oԒ/L J OL1!b]_x[rQbEu,Zs?,cAwjEVF.=&(֕jظ+.)F+V.AmqTF:rOY\"]o*jB4ɾif/އ ۧVzt212k.q|)!r[0g0Ḅ11掹,)՗0N{hgX]lcSDwX^wܲh;FgU}Wj]u)퉀$) >ed|g.ϴi{83]&ry7MUml߰sC1ɹ13i99<3}ѐ(KC8[؂SzY39r,.w E{ y?3UF;|2AR Iᆊiԧŭ eSSLE1Μ9<Uk?v]"lY %6K7QbfW&(da \]w}%(..hS\`7뢐V(@)ŵ5 `=h6T2 e PoK1+E턩x{sܸœ|Qe8[Jqo}Yѫ^Udc^]Ŵu)C׷Ijqނ5EL+$" " " " "p xciB.o8Z]gly֮fspX_հ-NU]io}~2OLl3bQ[J߱Aw`{ڎ.8|AlOoo26Q .7'>Hҙf񁢰RƏ LJ*.+ŃQ|[ys:-2>>Z'9]e(\}q AƮ`biBQ Oo2&SA>Rڤ`מ"$&k .%|1,H<~]l/D'.fIfT%Ѝ_ N|nF̙3 AZ}Y¯o5E"l㋴dR'Yxcd!IJTZ3l{?+̺/$Z[,gD16xgJpטF;&1,VμaV$#XJ_+1ͅ"|t#rW\xk:o{- X}5h <1}retd!bQy]xغx}uqU9+Vcka݇+fƜJz)Wi<⻔vⱿv2]yxOrׄ† hG1opN>x>ϷX_) c1;z::w1$sp>"Voݎ[cU+9n<5 C1ǖSյM6{ɧtk!yxq2OejSXx1YZHYf95T/)74 }ۜ,| zsg[Vj )hK ztd?㚫Y³q{:}:>= ||1C$}z深oc͸6ǣyyYmTpD' T %fwr‰őڳmwW}od#0\L13ZBq9.]8ȊK b&&Q,:qTNaUM1m+x^6en&k̵uܹ: mSᨮ(nEBc1 x71ɔ)kbaxqHljL<y[(ѷwcx[hb"ŊNтFzt~yY |gU2]3~YƙˣþۗdZGK_\m"S3J”?o@Q 8s@b_0:k>Z2BHמM9O1ugNę=96e)Z*$m矉|O9ʛq`c9؇Q5ؙ= T< eʀz7]{yӮFv?qӳUn%S M_\=)DW=?x%[g]..6:7>ǝb5H?eRm w0ږ߯^-Ѯs\xᅮ5s+&Mn6lEuVtXbX⼔E6nhwoqFaW@PVwqE(2=ilrlj+8h!^1.9;n܈ҝ71'Nkko@<UY 7"x۰BكE~,?˳m]9F❳}L+s_\@.g”ULOƭʒY8CВ⧿*})F<cJ( qC•2U3-XZetEd72z3g ^fej~oy0Te(1/-+j^.^n_AhedL5Yxt,^ts4K/21‵;s\KiyU#3۲`,u Vw,~xFO=4<#KЦ 0G*a=2)XE8["Fر-*9AShZ]k'H+,gػpkDI>#4I-pLѱ'EP1n:sj;,\7L{O?X0$QXw!1ɉ2Vv}[ʇ3[?lEM ;;.zJӑ%N:$,אS ѹsgƛƻk Xѧxl?4Ze!% VZr~nf_fH\]#R*: ~mU߼i=zd*jLmmye}+]oۺ>T(پ޾e+k[˳s6Տ.+hezP RU%[,EJOC+'`ZFy>JK0[L4;&`Y#cSvhUqs4y+ Dfy YN ^]:wEBnt Zl|[ue̽t%k#fc,gvy >墋qibѢϐiv $sff&N8BTX+#N8cbM3ͶYjٗwcè7} )Ĭ*𧂺U-)WYOjCj'/֗;eGVGZKSܤW-hU3+`0=Ũ$" " " " "˯477/"amqUWQ#Eq{>ͫniar8n̼;,7C[_͈ƾǢwaւ0qZ-")ɭ.c8礼 X G+⑐ QC)53 Kc/϶u}l6zߔ{e^co̹ґ|LegVRG4!s4*0UAk,|ή4*L2V;tB#sѳ,s)v'؃X&ϛZd΂>Z V8%uS0 jntRb25,YvMOzVC,^fxca}@.~0jE?U+sȓj W\\m۶Q,4RKwRDY" " " " " " ͘@>8?34")u5j/uwu\vN8F\F+ ?12|5wgb,J3?o~]fߣW2Yۏޚc#?}ٶI4vζ6_3h=yRȇ̗X E+ S&HJ+(?E(BޘcQaઆV/˔3.9ㅬӈ8)YϮg\+t @泆)JaG6o]c"`Z*Mm}z˒x@1͓ý2Ji ˖/#NU 2ڶdZ@-jGE@D@D@D@D@D@/>Z`~ov7vn7{wxm|Ywa}#zn+ SAL2?UJq).vo1ږ O',)śը2Xf姒Uϼ8_ɵibXbA[1h"V㢫߬(4Yzu1,B!.GʼnU8sM+)1 BYZr룀V>lE hQTsgM̓|kK&PID@D@D@D@D@D@?9cs~mΣ?hsusm:es$O2E"eOj D [2ydVO,oON#x,EwB_Z?eL(2*6h xY.^5(Z;}1kyQ<-K:4(`ŕXg9_>oZ8N󥵺 o{k]3AeN{☚[$6F%h,w"ǕUƲl?ͱsQ&U EJ:Ddi_{L2O?{e- $3,)Pl9P01 dZ]?0|x?QH% ]<X\A9*#gルƅ>~wA!{ض=GC\81sw-#6;0~w>ߐRgk.bsں>%$~rҼ?{8:YaQ8/Ê'&8;*Y}gܪ-A &4TpLN¿PL:7ay&nX0y3{hhŒCnvH "W,d7|t[ c.T@P2k"D[**<~"Iıe OY+!!vh!-vqLtT)Y.V4 !ܙdl<"`871q葼{2Mcuj]9DV)W}b$bޕ1Ιd{c&QewX.eo1krg}V}27UgEǭX:،] 12(b}?]βoF^~ BoH~oHZ\dVZl]y lyxg&!j, 8@ZTٟAj-ԮՎSbvny [P^OE%E Gȩ&تi(xXf-ΉfyeB j| #Ŧ ._)-(z -*mN` 'zpfejwm9.7##')gh‘g‹mTLL Mюb?̍Q DdnGP13F*f_VG$ ru*̚5{h6WD$2p(TNX&g#HJvXW$ٲx##{,ߐ;f9|M~{~|:"D-/eb>AE$*>sGaD,S.Bp& 2lXd27BSLLaTO!ŒTvU2')cnGɎ]ǔmƙ˚:BW-\\.&LdY~9x9H3Kfd̾*SX3+3sM#1swMG5GHClE4_Ӝ֌K߉1#x C❻MicaS)hV5,^Uϕ@<*u%JS=4>c, S$N&9! dfC6 9 3g1dǴ4 JArY| -oN2ʬ|hEmeymnQ mq<56au%4r18g}M5e _Zb$FzHHoHkμ?ƥ7#Rop/5F8b /pP TD@D@D@D@D@D@D@Gp#5F8H:*" " " " " " " 1B@VH CD@D@D@D@D@D@D@$@#7R#D#nk" " " " " " " "#$jȍ0D@D@D@D@D@D@D@DH"?:vѣ:ut[yyyذac֭m?I:\!" " " " " "puk׮HIIA-Z[X@ѯ_?s1$l5RVtZD@D@D@D@D@DK,|>ARRZj{F/3>ل#Մ0UI`h߾2@IW|mfT?IY 73Ƈ`h˖-mD}"" " " " " " ͟@\\\FpD{fZID@D@D@D@D@D@D@D@#ZID@D@D@D@D@D@D@D@#Z)WLiמ݃@ăݐ'?*TA#iLKH>pYiƒܚC`[rd΢|-R9pfv؂H;2LZ HoA=ߥP=ŚTI RII)S" " " " " "X=5Ʋq ,{]#Pް,}8{`jVaG@VC_\:iū$7'6I >xM,˫)9e >$)K|, b)ͧ0g}X8tNrmRg}%%شb.ޜ5j qpA-]7_ܪ<~FdnlIy+YzGΧ~>a$Z&q$z?귟3ch:cD@D@D@D@D@D f |ThyX>7 hh\MC@VC" )mv,lFMt lg]z5z +.\,%Uldr#Y_RJ:W%ᗗTב Ɔgim.8GʇS.չ"ɟnC¥eNLqci3!] *C ڰ1N J[Iݲ0dCnG-BÈ~yȥDo:(@@>-X%fcSp,zUR, ǰ+6B߾NBf w$oЪ*ƣy/?y^E܄Ru?;/ʸ[`%ЉY FZ5˅}-xlA/Z {D~܅֭YsJ.Q"c8νd8Eې%֮]EKd/x ;C1(rb`B{yksЯ8\K͹Ѱ-WLeHϞaԵ\t4-*SfJG/[[iJ1=F.%@UVAb]K%%Vn5tiUX;MMV8w`KE//3JU~`5!X6dP/da<t;SYƟJN" " " " " ͞@1;-νp RS;@ -ӯ~|cЦm*<MmV|ؽf.XuFAX,;jC ϩЂXj5A!$&VB'ꙢWm*i5^.cRtTݪ6݋qۻ/!K-lee6#ntKM#G-sg|*7E<._o`0יpbd`J:MIJCzQԊhU@Ngц0Gm)Z{8GJL]7{VmYW"S+^)8S*w =L5m C)ۖW?ǨUzj+G*#uc.FL>8E.6 KI.iq~Nm} 11sVy:~R4ֲ^-h2pJA˖Lǔޫ=G#`'VKA+Q6[jD SD@D@D@D@D@'Bٳ.Ě fB86 \?AΪx Zqq%D_ +-*|Yg(.Um4zW - Z@W43SsO>' qmP4jMJ•` -:uAJug[F`\$w1-ZiQrF\_]SxN[Cزˏ.iky>Y8bh1m&aZVK_}?Z t/c˖ŧuZJC[6mE@D@D@D@D@D vfaٟ#/sTzr|>t=n,椎Q=-Y罋Spܙg™ e/eÓ-йNl.-™0ja0&ڂ7>`p9k;f #jw2|~@G.7r|-XJCHFAJ=U:ԒFiqP!)h\ɖu؄naӏ_ z%j"gK9_?g eVRmV.$r[M|4N]6 ٟG,G\ E @\PJzHwj`,<7;e e e>y/8 W" " " " " "sZ1P?fE @b*c]jUeD`N=> wa+o9*"q?w})mR[Vxr~0eᢑ?; rU*Rbi՛y1HlػL[hfehˏ>l[dj;g}Sszeի,)q~vYH)CG[ W\SuS#i;W\CSD 0O+auk+VP65׾d$IFR VX7ub^~oJLNF~J P\9T׉!"K/㎣glpV3" .؏×[n}[ۏٌWSq-\=ؾ};6lذ%"ыA駟_ì`Dp$`W_}U{f'磳" " " " " " 1@\n\r%ѣ:vb=fef" " " " " " 1@D10 ADPρ@# Q2uXD@D@D@D@D@D@D@D@fG@VeD-=" " " " " " " " ͎DfwaZzD@D@D@D@D@D@D@D@~t877w?%" " " " " " " " +#B?\_"_ڵk_"'ab PD@D@D@D@D@D@D@bDػ<Z15@=bjD" " " " " " " "$j-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " 1O@Vb PD@D@D@D@D@D@D@bDػ<Z15@=bjD" " " " " " " "$j-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " 1O@Vb PD@D@D@D@D@D@D@bDػ<Z15@=bjD" " " " " " " "$j-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " 1O@Vb PD@D@D@D@D@D@D@bDػ<Z15@=bjD" " " " " " " "$j-E@D@D@D@D@D@D@D HԊ{@X#!5ش=Ouk?~>U! HjQ%~sf7k=A\4ڵy*!NɨN4D*ޝZ|]WOG+TpTH'>jeH8rSw@" " " " " " " "E@V}l>P%_zɰ2Mb;6 J(0sO Z?:(خ٫ӫɽѵ]^!" " " " " " " D nVK׍튟E%5&ܹly|.=)zCJk5x\l/bЎ5TmZeVaJ" " " " " " " "p8h:a4@Ғ[j\S$zmI> W ZVm0ipdKCzS{v⏌%WZ|]ոxu6 ̮_e~w^] k2R}~Uf`S|%h*( KmSU[^S5[K)V9[R'8zwSژҹM^pbGL f,·ˮݬ;rϿڰB]%_nqۛXG:McJ zsh-^v7e+*uҒ.u%\Yt`}i,XW~-]ъ <ɀf oiHwf奆_%A њA(%#6ٖ+F*@SY/-r)On:ZwW 5|ql.,23ʫDֵVjiI~:+'tKYihobvK" " " " " " " G)y3Qm7v!{}mjb_}v]4{.Z&T{ymzsz#:aۮ21~斨$" " " " " " " MEaӞjtDܻcʃ,~]]ׯo`46v, VH Jϲbn-\_w3|}= ?W-)tiT KXY Z%Մ: C;5Dx66ָgF:&mDYv_BÏ7UuK«%GYk\ܮu4tm K\ UX׶uԨlh<Yj5YW9A`Y#֯-Z1b֊S2_UDktq&sUÿ~5f.?=q6WzlUa Z};}uVgMUةѴ6S"P{चGŗG~,?˳m]߳s7!;g^WY.fҖ2l),EfP8hzKhe:g,TMtkx*!eRh׮]VD@D@D@D@D@D@b@\\XʭG,Wcqs},remkyy@YjEij8kOGU綊a,@ ְD@D@D@D@D@D@D@D 54+RgE@D@D@D@D@D@D@D@D-=" " " " " " " " ͎DfwaZzD@D@D@D@D@D@D@D@Z" " " " " " " "  4;-SE@D@D@D@D@D@D@D@$jhv$j5[H3 " " " " " " " "HjvLg@D@D@D@D@D@D@D@Dn:," " " " " " " " QKπ@# Q2uXD@D@D@D@D@D@D@D@fGz4/"5-RSOb:GQ5"i>z];ۢ\Diz8ݭM/ևu}-!go.IQsS@c Hj,1hU\بk'|w2&;'ee|sW<}xtA׭mW:>"vpɄyGӮ~ 3/:"H)ևw}m5Ү{3YZz껵:'" " " @u_wEo=_]:#݄g/WeuvwGzݩ%n<#ؚX#g&&jL-KD?I U˰t*,۰9|*3臬!#v%&PTTi 5kĢllyOj3Am{uU!ӂx]-EJ&6p Yp+ڶ\\䓍>=:wFYԯ&Zjy8OSՈQTT1{Ʒ' ,ņJ1 ](w-}sɛֹ:Sx[ٳܰlؼ7gDA=СETRbU{=+ϑW:]v9e7njחcHҨ큾cj s}_hI,gT=q^|7nnw);/ @;\,w Ǡ8sݏbctnK9" " "phH:sw$79nu$q7>޺ jyZz.ɪ}ڱjӸGbM~=qJTX޺Tܻ\ͽqީWe]1_͉]Ym`zQ s[,M^YNT%czTDm `՝E I HBj`5쮉t nاඒ6X?@hWR v t q[VH-&tK*X^4$ o! /{}+ |̙33g2;S (G8r r3&y4sľľJos%G LfhL{:R.[ YI~ya5ryrVc(1ϜVWض9zl\eTg*ۄ%^ +qY/ }%q1vf(][sNW6^xa!bcC`^cvzN\3@/-+X0-ƴK-2}% O徬.ߊϭ{~oNV!wAl~ w5Xu%Дؾʅ,Ŗ̖ծx  ~~̏kƋj1et4:r"WuAknpinvbIW'~ر$[u=-":[STuuwQ6[{+C֌pـE31ʬoY[fF"hy*X4.)*0هey3pK8`S١馱:HYavvfPp _;[Zd;(>xvn@b%^%gGmj,3O|lv.kiW\%}F^@ {!?+noSXiy!뜶 H [tn.ݎZ€aU[Tg|,H՛Qpt؉b_}!Dwu%Rt_٭l;]HOO/NGQ;m^}[7bq`J\c ݤryX_!gűtyXsq-^(eز}Ӹg-,[`t =ȑl{?[y 8e(?3jSoeh隍 4rmoT^ajw. *he/{MAu(%  '@Q-v(d}*Z;h'͓x:6l8wcgEnZ~,_c"60Ķ$/٥, ͖@X$LJR UF Fu\4o\Hs> j ym3eJ #U;p& u*l[_.VC|\F$'!مY6!+Y+AeA^ҳ@Jv.^)?!d&Cz$fc(.ǪUeBdoek"VJ|G'fM>۝J#H TZ}㟲u_ o-υ_/o5٩vk6olBU2`K ױ{}%swb@BZVgx?R3׎f,6&%7Չk IYأC -Y5ېИyS2:/K'k%/‰< c"w @7Mܐteq:tH3XaM֝HV#O>7t6WSK%QGtO\DȁxGDנmDc3n#f5]s1~x`mƦ4;Xׄ цu5sk ꕿIoi1Ք̉(Zc=Z԰JT6•ܶm'%=XmO6'I&*X!O-OOK_&Cr<{ו=(JY52f%{+ ͅL{]wڊ3^5QĀ࢚T,/fVy_!V!"QRi,Ri-yhЪZ5rHW;z/ZʤZ8;% ,r=1Km^x?&eVdH_Y+ͪzDvm_i4*gïf76V8TY Y#)Âǂu(D&  n%^YVSz_cdWUT!v*}E5X1yn탷>w Ig]>R@ʀx#I-/:hߏp=nIsY41lFv@ lcCkgCͲE|ѣlu a\ ]}K(^3~Zbk2rNgSϳﱶض#ImchuvSS(7q8feuZL6K׉gSg Z7/8;zCgƒIHHUtaiQ`?j1oQ6?0/0zQ ~Č: bO9azCi?cnJ <~QDx4T$H{[MxCFUۿ NUC1h@?a |Ŕ׍Rs읱1Wpk4NbjyKƔj%A{3'!^ Hp[кr=۶z\rVg`qx߇YR Z\;6,Z&4hxB f%Z'Y7.[eUɍZCA2{[Y;}BmǮ8.ϊJЩv=n;܏|-O V2dmC!dH:Tf")C삍ƪMT&I|B|$a"̵ C;ER+X/DE@3e= EOq+7ķ W[1ȐhL+I]:#uYeD_埲EL=uݖ]t'tzf/3Rsb^˃΂X_Y? RgG 3HHŷS1'' ~ķ &huݷ oWAKy|桑i &hr.nuQWpˡY=@*˔oJ؄YcZA 0b6O"3P'ZV-FASlzN!c~Kb SD-EBeN!ơvz]2[fJ ,ZL.[krҲor"ymek.d$xR!ҎYˋx;}.PMnOp$qKKl26+$''ztG XՎ%xV124rrrlfMěG~ }>/_ d_K۷lҠ }.D;X=(^;o V<+,QYkܨ*^r{iiM<[m  nnlԞiƷ vXq 4-cE'[&ʅS0su_~ %3= 4Ud:T_RX6wl׳툌Er<\SdXZW:R@JNd$6k=nhlґ+1cR;`9ن+&` (x_XrZE/q Q@xX`pE>Q xzĜ4٪*w t-;HFYa ^i_s8a( <+#i$iJr !ĦtYp unx[L s[u){`rd/Ii>:+X{edx$%uu0oM&"̐<w K%]uȤn/2CȁL$[ n :mv%|uh4^FbLZ ɯ-_϶[Ӎ FXLp"!6jzRgGUeZب~Q=.)}݈jV7ai=$ĵOQ_]CUFps#VƵ6CնpӎGؚЊڐι+bZSg (^v~T_.Am %ssKrwx^]zSwH?$2k[ksW!gl8`[zm;IH>}|,ub)cۏ1e'}n~n.%˨GɾTpj-Y˘ H4|PLъ` PԺ?ϞHf F,] D^Tؑ3+*Xǎpn1u]6ӯMmڀYIl)Ŭ ZN$@$pD-HHHHz F}+hw=Y+ -@bQjW9q l@;rXT`;lmFsHH:L@HHHHzskMλk˰h~!JUؑ,  ;%\^eOCfN=+!UEEL% WKJ,=U1I@Yf D֍t5y.$@$@$@7U:nQ0-a3䔘HHHHHHHH(jtҕVD7zLG?=G_C.cMX G/l)_;MkUwɷ݊%ap|yS^)Wg9a>c;C$@$@$@$@$@$@$u|H׵qW>AkxL+N+Z*Hu$WֿǢ#tުǫo7 s̘ o?u"`e''E.#̊IHHHHHHՎkJҪ~q5~xfT~^y:ڄOz;oHxR]-^L3sKkc%ۿ:T{R㥫xy mx!*b}N0l?-^ZCZ<>:/q2?=Vkoy fSno3+^wG :u$uDc3~!|FpHHHHHHH"@Qs[ 'ءON@5t4 EtWߗYUt*gnCLT_=T*=t㍲e]̣C'"10MWaKӏw' A(xG<ۿŠ[벭"Ջ0&V>Z1 }A]ulxiҙ#8^h:S&QDPw!=k7|Vn6n0$&qbZDT2`OL.u9`]5UλaG%}J˵7u3no,.8?o]qቷʐD3Y[UEC= 5N薡tkQ=\'       Pj(1ZKw s`b' :3=-Vp8| 3?4SG 5i/u$ s{Nxp >o@{aoT7☈]wo=ؾœMmHHHHHHHH @Q=#BYG1zLg&,uFC3}ZWcփEf.,^R])#U02cVY(1|:۲TGpKEZ_VY*CW<4ԤU S_Z<Zn3^WP/1ښ_- 2Mg%IF]վYvcСM$@$@$@$@$@$Ѓ gw@>CIB2Ggm3˘Y<^>:ܧGus)YFY]j&Қg ]}3 ^SҀ󷋘Ցd40゙Qm2 (jWG$@$@79f444ҥK&CO_~Qƀt:=4i @'I Y @#V]]#Fo_zիhlèQ(lpHHH ;D$@$@$@7$RAkȐ!zVQƍkD$@$@$@P GHHHz5r۫f4^^;&   GV8:G$@$@$Ы h -9}PFIHH PnlHHHHHHHH(ju!+        n8#       0ZF HHHHHHHHE&HHHHHHHH:LV        &@Q=        aHHHHHHHH  \/._3;-}!HPLlj}%Ghr_{Q{a^c#Q$@$@]GVױe$@ U8,5?4 v_{>QnL6asII&uEzG5t]П7{w3gEK"666~f<*b-w9~O]?8_C>:=cM݂ʼnFkW޶8}˿HHnƾy5ϔz?}xk'/OAEo ny4x~ 3nx#j9w8Cn fPN 1,݀Z9K{FN#t1׵mٳZM>GQJw8 $<78p$QoiESF`mqE_o«{OwEC -l`=#``{996v~MxcCR+xq H#Z!=B  NV@4H4_uz:|!L:+^~5?{~;WNGjTKxY&܆F~?|}Ɣav:,,N7Dqypԩ992辀̦j\ gvhF"l>DÞyjA$@tˣ;G$@ͧoé!X'pM^<?-=g߷ቱ6&9Molެ<#_›boԻUe'9닓0^?.ɽO~>W[-Y}3pߝ7CkIFGcj]&/;k֬ Y:zhxqicZ,3Zꏄix`h>Vo}yv*^\]x82==|]-o'{'XϞoFee<.SGyɖOSvk'xf|v{mN+&|s2icD- ^<[ 3ȳ13jߏ@O?BY>r  0 ndXH -7>G`OҟU{eK,@ͧnÅk8+kK?g6 ~Dl4gC-ڒjvɁzvgOoeG9?=yܯGMSA|L9`m.WnPbh UyLoY;m`5S'OW_VKL9zN R#"ĝÛWnW'v9_?45.w3%'K@Doɲ]ds 4MM;Zh:'N6џv׿"nY_*fT{u|_<4]n:]Xjc$73GӒ,-|eho_ͮqfSG1忔_jD;cQ0a8zJږ{xxZx^<o=%^<ݧe4?l>zz\1* y>x9r[ں{Jón^3zhquk,cX>ƻD||E<[{}ڳ} Uc &@OlH:иQffےtۚg].a)£V4AeÂ1"v]Jq^~dP:w Gl}W'fzS0;'SNI/[o?y~n7#ob"Z-)k |dWPxqFqAn]>h43c<|{Chc+HnA7yHz9? ]&"J5߿w|Ǡ9a^Rm+/A_hxqOYr\"l_UT S/Y^ o1Z&q[:Zy^ԩ{^Իb(L b-ے5%/_Kc70&U[ZܲerNצ݁G݂b O ["Ϫ8/C[/Qr}]1SF#7)~'e~YwG抰iw'+k{%GzN28Hꍹg<{ wɫF`-Ǚ'g7 m^K~xGg×%<COOsx772U<߄/E'oJFp[_hPAKE13iC6t&kY=OVHÌ4|؆2#|lixyiTy2Z ZF>COn9+:XoGГAȏ1 o52߳IηL2T %::~26%'gv_vo:`G$@ P ͆{H#5{ '&K[n];԰2AnuFJaadX2vMRmmaz*ka'C4v9C*QiOD HECtFTyS^TtӤ⚊V:pl*D}?sr:ԓi<7jp.-jzO'0[<ښF#)/XIOq9t sx'-6m!uOKC[]HUP]<^z<||z j 郩Myr2=luYTSSӪ OQu&!gÊZǓ Og|xڋ=Bx ɔޕUze"OO|Ga㣞CUj:q[F]畩cgO>|>%Q`IKoS1ꋡhϝxZtރy⮳p{d Ze41mI%'I4cgv_v=ǃRܿLYbs1Uw,K:lFϒo<Euxii5旊rq͎ɋ`$)\qw\$U2IքSȑT'e'~%s» *31Tkgq\R84``j^Q&ҏ& ?~xs߲Q2Vn0\𚈠<r(} z ܴ ԛ88AJ s[w!3ןU]K"=`l/P*hC>N \m B%o=-YC5V6Iũ5IOK?aD'x rFwRĆA"^s+ [ ǂǿ ޫ?/;;IomƸ +]sqjx=:0V{NyC< HRZ-U2Gaeus,oP40v!K˙Ku3߾4PHL7AWR/M:|Oc}up @%@Q^F$@$@$@$@$@$@$@$EPdO$@$@$@$@$@$@$@$c P걗 "@Q+ Xz쥡a$@$@$@$@$@$@$@$@P E$@$@$@$@$@$@$@$@=@k #   F%UpÁXg<\iHp0#{9U8T׌qKaf}>4'!C#*9&BXl  PԺ7ϖHHnP,+G~zŋp$IԆ嘱ȯ썥X8:)2U(.;qiHMN6hFm䬫A0{(yDsqWcINj PZ< l  ZCIHHzy_h)j˜LYkfӳyĂ1}R!6I J,]$'O s=sáF5Ū$)݀.>(Ē/˒ @HB   CXfw#Q5v5TÌu^tnnj!ՕuCN9['Rct*,L$@$@$@7 Z7ʕy 8LtliM!'R.r1͐pZ="92P'G1#w&~m*$@$@$pC7ɑ 嚻]K QkXKrp{>YKP^ U_Y9 QaS%X2 ,e˰<+[G֒UaY[Y-uJY-ݟ~IFm] Ӧ3֯Nwmg`mqQՎb|k4s}e[~,Z.#H2s,TFUv#ahFuZ/r;)E%&cBT5-Sluu4,u[-ZAM^,l*BSdЦeB %,܏%xX>>/6|Ⱦ*|}}K<&?Y&k O:Tz,/ ׄ&X2lZ""9_f ~ XDb5==V`}(jkFIHHL  Z:F^i3DSrJ<7cV兼%%hhSmŴP$%S:̜EjZꞑژ-B%VH{a|4,ZW$CHIIA5"uYRs Dydb$X~eVFZ-P9?I`uH+@ɺ0cm?7U,y96#%wHym9 3ĺf`yt\Sg`ipW&2(XӲDBXK8TbMdi*Z)eԿZAK,Zyx庸5km |<]Co6T,Ŵiڬ)fYQ!&˄aChC뫏!guOSԑW%\7%='\Jh4 *ZYg,Ou:  /Hʗ>YG2eL:z+ C 55Æ kZS#@Q]3ZL$@$@$Ny8<:n ,(Iʫ,@W1+RJ3:QF' IciL_˜y.O٪ZO1G ]uO, ɘc(d ((,`/Ȓc:ϾLsQmrb54+x"Up%j5۱|s( WD-D 2es-WbAG<=j+mGVKWG l[S\I>i,I\B_+B8xpWIxO-!p|@N`/̩y+μyi'!kA& F͔ObJ6/$ `W9ʐ݁Iܳڵu|ZʋnRMa=F6piXvCxpU|lۜ=jGJP K`X~fGD8V48.ztD?\4[ pN-~(@ PQWidm yꛫR7ʑt6:$pan"U6Z$a2tpL-cEEysx1y6<"[&ϕ! 2"^${9{<ϳ#@ޣ`Bdi!1צ}4Fޑp(u. s>3i",o+Q20$TX^i*۴iplJr尿ػchlZݓNO^=ՍFhk-Lzb3M"mR[z10FXo([u";kx-FBYUڄ)s74+?MN Pk8QܪNo({ju:)+(@ Pvyr8q>"Tr hWon_bLB>'7`քHX"DvR= zwiJ`lȞ/OL c̙WT㙙(_3h@ֵge\TH0+aBqΌ:{XY`s>%gX5}iؽw/O79B@FBQi:VQ嘒)׺b&B#YQڞTku*g.Ƭ$E}<ܥiYU$wY ly$X+l -5cƏGj=:ۥm1&a$7jn.pcd2Cp8u\bLtبII Zxx[w#$"5H/\#%ٰ+ᡈh<_^@v <   oK e:(}CN`P!=矨78kˌE|7(@ P蠀sbz /=`4yžYdBG ˰=[Tn9-1!nsjs4#p}3B_lyZ 'gitr?dӱE&;&DzYJ{r4yOXe((g0Sڛ)3fn˖˜K2_9\gtj1,vR^:PcATP%uZ Pi,>ȗI53ܭo (OFcb?A+cd(@ P(@ @qSMT#{YzS铳iS[+xo!J{α "e/.(@ P(@ P' 0Վ[p8GS [{Z5Qskx"'*D BV C _ kR \(@ P(@ P@`P3G^m]&D!ckP_b$S<wF?c 8~W'_KWu{DN P(@ Pz@kƩ1=}.*=4nB:Z{nqLmy p. Z ק]o3[H P(@ P(!w)@ P(@ PZ(@ P(@ P jyp(@ P(@ P 0[H P(@ P(!w)@ P(@ PZ]k6(@ PzZ.)@' Q(@ PhZb> P(@ P(@n#Vl(@ P(@ P@kjQ^+P}HʃU=6fdm52k P(@ P_*P%ıSfa/(֮ݏj1X<.I`/Ƴk2Q !u bM ;N}9w,6g-<, xzN3a뚵H,LdV):[,hnI#x P(@ P V' P MBJԲdfqdG2a/'Zo9مŰ4sq7ۑyԣɫcXIBͪ,a++3 ZJ%?}9r\4O X;gy $] IA P(@ P8hY1(Э!*;a}{A6N#qWLR} \e]d¸XLTV#Pg,2>j`asuJ{.a3zGUR@FfL'}(@ P(pԺwn@* $}Ƹ<\Y6[`2_,݄ E[# =H[<P 6.&'ZÂ1.*@Qy:&(@ P( ju*XU0`KٜBUH -6M&?چs«N496`Tc]25Q(@ PhYAmxF&2M&5T*WeKQ/R68)2 C.הjh+ DETq2Wh>*jE؃H;qHmXw1yf$Yo;rY#(@ P(KjǍy~:UJ]J.ru=}}bO&:-2 l3j(wZ)ʖi9us=c Ų+`<*!u5 sNI,Ԓ sE湹s4a)$[J? ?՞ʲqw,RYev_YVy5՘G$Q sK`XsnX%P(@ P jVz\\MįϕceN7 ;D5ߞX!QWoNPFQ ~yfe%c"dưA3dZՉQ|,_['e>hXO6!db<-b'1 ر3uzNS(@ P :pc`@Vs+{iVէL߹wgF 6qq+SCoG C^HhiubHya Y*жq2fqhVg*(@ P(:7/37ԙQ]w UWeV,/]u Ep ń_5;TQ'-/Ŏ?|?Va>|^RGG`zx80b`?,n}9C4Œc~/rLz64K~pb,ήłIxw}ղoF~;$`}!xj @h/%-H^ljgMp8;z !G`]R\S(@ P9 j^>c̛y ۺ#t I0Bi3COb_NY'FTawyR#F;I FG;;~5m]$`!xf5k(CH (?'v %+ReR0B+Ui˼@lh/9pƎ!w TЍ (eMZ]v&VL P(@ P 0Վ{2 Ӿ=X(=oߒ$+즐@_µ齗O_v-5{ω5s%GcάgKmF'2Z7H`Z|R·0Fzf6\yN(wccG}@dz(_-㿡> l%=ܫ6(@ P(@ P,!i:6rkx\/w`\K_ԣ\ kkw3bWD<x:ƫ-k}otlwDѵK܍^Bn9lp PaƬw9Zj߮Z_zcaϰSz|=ߗQw#w)@ P(@ PDځA,N^is2t=Z1%QLqS@BOvE6lT_S/}q/!]=@-?AkQ@zr}7m.g>o͹??= pw3<::K;(] P(@ P(QxW۩CI@L7}vYBRt2I@ISIɜ[E?wAJ_^W zʕs2 /`!\aFA3GO+G#:aɒ[jsC P(@ P:ApE'T۳o?G ݸĮpel~C 'i1Q}_  釋{1B^ŗe]Qg4u0? pAoҀ|}_'.*uk|!sn[KW%W TqZ&_mjIZ*t P(@ P(1j_ ;>eBdB6Ozx R~_U%4Ab6`_KAڐE0H޽g߷B__o`#lP_ݒd4|×qfJ/:dYePܵz ErU:Cr(@ P(@ t{jp~{i̴6U9w+Wg<pBn?@ =aPuL.e̮.Z~wDϨD{a0,UIpWʪyHbǀ UO`7㜌^[e~P_K ?GMB Im(@ PzZpD;J5S1{u ?4L~hߐW@k G7mE F1-eM ä×t%2 5kCὅo\ltUf3h#Bq8#Fdxbֳ8fqL& RF(@ P(R*kI@J{/B11ِvn,<Id Bޔ|p~۵ ' qcexadu(K2O9axrjL d{!veQQE;j = P(@ x{jyc)@kG "el*Nm K@r26gL\LSȽ'6A$:'bZ 9SpjV ^]Ԑxc^?w`צDܠ(@ PHA-/Yl*(Й6m++؝sohL2euL^]+rdo»Ą8*Q^^է>v7O m,[>xɈ?Pd vs;wotn` B̸)Hy9A EK- cFY rMPQ\\ZvQ(@ P^-^}x P\Lzn5}獕Fو ]AKh4ym/SbJ5MW@-c@J#!2o O2EbYv:EJTkB9{=htwSăӬ4ɼZj~<\}xb!' 2U"ATYVsE!W")&)ף1yq(@ PU j͋@YG)ʚ,CՒ0#yUJ-.ب7)qwZah VbU0Fzn9cmf ~j-LzURE4 dEZ eKȄ',?KqƇg"b}U2pps8f(%e“aePˡ(@ P_A-ᅦ P&0(/{0Y[Htkts1t*=rrp3('VR#iR=4#~xLjD3#igU`Q=y/z$)/(@ PJA^uy12黼:D"yq'w:)vFH븕׷l@4W5SKKAf 3(@ PJK-u]@.(@ Ph~4(@ P(@ P j^(@ P(@ P jE(@ P(@ PnZןg(@ P(@ PhZ@c P(@ P(@+)@ P(@ P!ێ2,B P]$p.R(@ PY jɫ\`oz |ݔ(@ P(@^ ᇽ&)@ P(@ P@O`OvGy=(@ PZҎl6-dtpaj(ځ"(@ PUgz%tjӧON:1(N b(@ PUg֦^,e;w#F`ӻNwm(@ P(@ PhZbb& Pn&MnMmNOGVZꮹN- P(p 8bT:K`;U(!3B:T)@ P@{Sr,G P(@ P(pԺm<1(@ P(@ P@{8r,G x@y^6+=8I10Imف`Eo|16j=m)`UM{ ʂ~ZoR S(@.4ܥSn jap%ıSfa ,ڹ?gK B %xvM&jHH݂¬xZaYampzw8SYͲl7(@ P;妁|Ѡ#ȗ ~+Q^)@s# Yhؒ2K#{rd~̉߂)Ԗ N9ɗTZ;n+`t X P a'ѴrpUH3SHL k k9a!3!nl7^K=Ar*KTzt}ᓱ9גT a遷̽(3 !-,ڢllB0y2>$;\ڎۛ"HM<lr$$%`vَUcGvcہCHPǑ+8=M˰0c#hmۨ~L dzQ# - J\a A ^9"GA[!֭P9(@n$PM?{WO@\ -G+kQU,81 黐U /0 )q0vI=F,LEOH 7Ӻecߍh P!`%Pˋ  ȑMjڏQObYb<o@(_wP/(ČS$ϭw?CEx9QfHB x@]FRe)Y0ab<\z׮ZQ^7ʯU%oLVMؕ'?y* ;&HL+21k8S׃=c0sr3Y S-&B 9EF1,h;!U TD`:\Vk1%=H@.BZ{-OGbRM? 2rӱ"ܦ@ ]NPBmt&Kt `vLZB<+ @Bj}Ȍ sNnA|L(*K?2_':.pH/FOND,;g|"Ej\(@ HʗPB`mB,bⴟ&'d,ɣe16WKMU)ydh̫iv~JK,3 t?{k;KJ=aC̨C[FYuؐdU!u1X`ڳr90ef@b:㡄' gn\mJ,s:s+̈́QLsE*M[`CCp#HB:(GY*pȑʨE6NYnl} 1&q=B{kF rpF&Sc jȕ)@/YG)j[m fLoy?ҬAkFd$5|:gUИ{@O0Y4uj%Jī`$ۦͽȉJXZҗ O"Y{ %ْAXc 2@7{ oa|`NJ)Jl]8M;͓u6uE2y jzUЦ5ُ$@>yHpqFbF1W@dD6P&aAHL/uHyH1HteԤ{jI2p2bօ)6s0&aM[#h>Q#"a7jYw Q<I7*bHya YM &yd۴/L9 ^Yƽ[' IrX6#yKZ^ۨ^ "еif.ŊecIMJ]&S׻k$F ݎ:Rd4 UK1or0;.K0$,i2}VJðo勑&ܛ8E3ʴ-oe&sYM jaj>~c8xl=P8y2sSe'2a}dvk!nGfJ/MkEI^dγʫMԽj]ڲe 0bJhG۹ۓ~NH뚼kYym2Fynu6^*m%IGUZ(@ x@O$JT"8PnQRSR2 Ciw֢@MBDΣmlljKR^:B7 qVu]7 R~7:BLNPP(@ P(@ PR(@ P(@ (9(@ P(@ P:(@ P(@ P( P(@ PL@= (@o`P O P(@ P ӧO{w}m(3~'tpZZxO*zQ^%pbj/K Pw bĈNl_~I'-:ŪnZ'(psIi&nJ (@ @@BBBֽ}@ GA-Wl)(@ P(@ jf3UກpYp{CWl)(@ P(@ PCA-~(@ P(@ PNA-el0(@ P(@ PZ P(@ P(@ xO+Z\1RFZ8֞jr{UNm#souu*Dž=F 1 izakضZ(@ P^Vw f?|X?I&ut>>>뤊OuM^ |ջ1=պucjxƶ$Vij\is7F&,zP-MBJ jaʓKlfTb%cvI5lRO)8͑X9& mXMв`鎗aE/؆'r,a++3Iυ(@ P])PYP\H[BPylRa֢TKUcjKQ=A(6`Tc^S& P՟چs}1jr'Mtk|ڵ ' qcmFDȂhSn*Y0$X&?y"90(@ P+D;|G?TBE?Xb̆g騺hǠ;]Bz < Z_4 } #C8r(^Fܗ>A/HO|C{ju)@oda_!tR<bhMނ={`x{//lMy,q;,mE[+VEQR-a2(@ P:"p$, oO1uA y9>Z v}^XשL0J8.-bRe'qL)Wk.(VjS^/`+؏?{nFio)[+v(lֲGAbYP07 eءS.It~%HwP(@ x@ŷQz(L2F-օA>UV+E̠; fyym`Oy17($-s(佼啮.Vv[e8'RE R]+0Uኤsk>v a|ڴY|WCcT\j(@ P]$pZ@/bwT>}Eک|'#x̋ʜ\w<Į;$50Q+oE@LxAP v$,N P hK+dnr՘3X2/SoVؙ,A'=җi8}^9` >&YkBY2I$k3#!2ov0 :[C0g|"Ej\(@ P(е(??<0;L~&'T#`pkkROFShࡪg]h4T_7Q|Z׌_CUV(\wZɪ(@+P6Sb%#e*ew.ب7)qwZa[YM$L}uL\6 9cmf ~jy" P(@ t@]4CyZa'3=+j foCE\)+ՂZ ~llǗNw{Z VRʬeA`P35Y(-Ba, P^fn2_, ,DIT$M8dFY9ǐCH0R^ (@ P|hol^GW I㍜}4KRa?kW|$oqM 0^9F 4F&}WǖH$/{iS8]Qpck P(@ t@!1O߃p]~QNVף}8 PqǏq .G'L> p. Z ק9 n[@3w3y&z]5S(@ P(@/`Po O P(@ PzZ)@ P(@ P 07ͧ(@ P(@ PQAxy(@ P(@ PS(@ P(@(/L P 6(@ P(ЭVzߔ1(@ P( 8d^"(@ P(@ Pi j;(@ P(@ P@A^py(@ P(@ P 0((@ P(@ zM%R(@ P(@&ӊ rcl{Jwt}#M[zuSkmFUNm#souu*Dž=F 1 izakضZ(@ P/`s;ǏcҤI؛gdT^XmW[c۳Q^[z]w;olkIQkϵ{MP ~ZR(@ F3Bzeoą@W"^}m0 P(@ P j eh=nق|ժk|vb{xmW'KQ(@ P@`PGF^zE? q bmx=WQ.ƾtgAbbRY^J~l(++qb={!،Zfib/CAMkmT;(@ P(мjޅ@w/*>8ߒv|xN1vUؐ% n%xvM&j9yLϯwaA)gRPt6.V0[>o\^;1Tk"il;r(@ Phz 2w'5+54X{Zc{uW`Z>RO_ݯU_Y?ǣLHN`P1Y(?7N&Q,IT!-;/c7dcZ@˯!)"rz9dؔ9NL]۷BLbX7sdy Q+(@ P( @0(u~3}D^D|IƐD&w*Oϕ)>/ *Z- vE\#-YޑֽKV/~ W.FP I,S?ݶ*ngV(z+_fŗ1H("r^W@͉PF]l{+fS޵ ' qcmH `łHFҲL 7"^eRggm(@ Pwĝ R4HQ+ӆXR̆g騺hǠ;_x՟6GZz|Z{ r@'EH0R6%ŅZjqhl_0 a U.YM1C֬ &GWjf7My,q;,mtS dͩ,k^ \](@ Ph*=m ẈesU.`guU-snϷ^Yir#K,ob@Wiu.(pԺe<(f/P,.-xy GC4R](vLZQL'죨jL&՛ y˖ˤ /lzKxbMA)gW e@yWiqM P(@ 4\|9 5csKUنYٯk1\=^x5 pwcujŅAAp Py ]ũ F}d'c7A9֞Ŏ2#TJYZ**$TQU, Y`Wv.di'W;_yOfr}xBjEsa%R,ys,C P(@CQz(?6wӧl^ԞjOFin+# LU+yO 4?΀\mtL¿Eb/7ϚƯ H,h|ZF^WWiA(x\xa(g^ys3$'`)m2t1&YkBY2I$k/iCNDP&O9;);ss(@ P'YÄK@@;ԟPUXQwdQK}5|U04CĀoq6jD\9c}}GG)/^yӯ j>k% XA.f@"&-?0ԊG'Ye_ۖub滪,T&X,'k7E(48̓w7U6hMނ=M$DWfk vlgQ|,_[dy4\S(@ PuU2q,_BL ,ʼZwYP?O]PRW\߫F |*r`X}2DZ{qwb\;&~+y~ k1X N`P+uY7()Cmvqq+Sٴaj` X% g9$x*&ʙh͑s()/lU7(@ P(fholO#2Gփ҃}ˤFξ,=H @"Pzz5hX}CgZuc8*JR /donŠp\F"E^["a|ձkgt (@ PHT>}FcՖ [5\(@mW)@ tP4CTD\\ETJŃFǶU{K#JtP@~ADT5#HJ(4BpJ;M;-3m #%d$T BmG)Rj{"43;s{!c6~*~X{Zٱ^kԾܤ8sL2%" xC61ȷwc\bp?]3!5_mks/@PkMIJF_YzcX~~woQ;s@U/I9W⤃  Fo"Pc%cr&{ď~oMwMY8@@(n*,l}*q6Ѕtrm6}̩ I@@@Eֵq ZM߿ܧUZZ^ I#ޥ+e,   E&@P*";8Fma(4,,K|W"2   0$@`K^X#N53%63JDq@@@ 5?s"|q.N3|`mZ{/+GD  E @P*""[ѯ֣m%|[ 2   0c$E@`Bu%ͥij%H@@@gkD>=T)Qh"ZkLŕG"i@@"@Pk @`8QK棾}_7OWoa@@@jQeST|'3&>   $ZT۔? X*8{S?<#  ̑=d@`~? jT,5k!=bIv\T+tndHk0E?*ӟg5@@j]#!TovV_ҽw}becEzw7 0{V1i  )5ѷUOC[*uke6mڡUW(D@@ZJ 0'訥NpWё}H?.ڐD@@@b U5O@pj ($zkN\AwU&ѡ7)& %H5xN\{XC@@JԺJ0G)/6[_Qdc.[K^~s}:}>;4tJ/ԸuՕю-:xv|@3:aYiڲIGtIaG6Z-ݗ,tڟ_:sӲib P)%)J31`8}pd*xQtfaCƥ%?  ]k#P;ЂO/ʔ2%߾t>PӤ7%ޯ&{TBopze/׶{jy8AR hw5Q rOE;tիd6}5V^SF ^ њ @bgguYkU۹M݉vsJz[yCj|*rqPxZ7T~{vTUϵZ@+d2e ,|Z !E'0E{'tz^|n_ZMVYi`yJSɳ:[ҁHK79JNi7#XTLGk\\IEQ悩μO [plveW>|rƴ؁\ XZ.}` a|{JvؗĠ63GO<G6>}srzEʂ [wiltT##{ԺI#t%k_Tk `C??&*ԩ&Ny=GgXq'd߾8}۷[Pu7m̅<Փe@xJl8Ґz^l֖[Ξk/{FOPgQK ΍Q\TN':ytzϹ.@  P</N(o+\D':[2w_R 8=ܠtjE"67KGjh۱c$ZP:/pU:Z"pa/ˤTW7W.!V@y}8d*Jd >} AVAaUX߯N[_ZrY:p7W =fC@Xf+Z 1=ܧS1/y-ဎMHA䎽G^Y 8ԵMJ/BKMWrR6t1;0sב,4ᰲmj|V{7{G6}ez\bC7vVmeR(^&,)Twc=Xm3yRd6dUW)QeІ$X-ۥ>ݠpʂgv^u|+O@A-G0Bw*R}眖m,z훲VFy\D҂PAOVKQ'm*M)_::l0i!-ٵ^N67\yX==Z _A& @ d>PzZ|W鞯BJO&67kjsZ7'j8mƃjk>=Æ"N)1 ~ $ pYeQL v ڿ)'}H%T;yS%ٝ%j}]/n(r@}aä{:2XX / v/?sLȰ 6 P7ᴉ@|$@PGEV@ʪmwB-Һ4嚦U%=x;<"HGIyÆk@> eC'e  CЇF@4 ,2m +6Ԁl~FLC8@(ZZE[@@@A-9G@@@VVV=G@@@+@P˿uG@@@@ UUO@@@@ ur|QxD   <ԚTDU`.K   P ?,J    @ *<    @*J    @ *<    @*J    @ *<    @*J @! XbBRqs   @a  x(LO~WRY}uͩ   7zj/    j@@@@|'@PwUF@jPG+:9x<{9qņ<ի"  #@Pp꒒ tlZCZh49zM/UmϪx9S/Tזf5o9bi9q޹ESSa %I?Rv\<1r%$^5XG@@`&$@I idnЩG6k7TݹAgNXviwP6n7,z.ՖȂ)Az~uX{w)rIަ?/1i~M^Ɨ^U]tlTQҵj~՜$,p5],@ڷy}Y<>=ri.=_W   < SkI@.p'eA#JUVU :'֯ >njg^,{DC*ڡ^|LH*+/WyyY&8"U4|Ĵy6%ZnvvcD=&8uZ|Ԏ=၄wP.S˵Ms*G޾u踛~t޴Wb#  ̕A$@cN;5jР/8nRO-sJ;w2+iA,{M ~JΎǧȍ[dS /JZ,2Si%wffhsƾ. ſw!=wtlJ<"  Sz8|'%ާ;pC&n:q%#˖ 'vV A۾]{?ȁ^@vnIZ[/57CTY]IHz*ҶՕxzYРg=j~vl|J=tY(㶿aym`K@@@ZsH 5tbM6:ZTq5EUiwjHuujDK7&->%maDێ&"'Il b@wXYIy.VA Vk͇m  A^PN:yzcvʕNzrUFeeI5vJTQ3H@@ 5w Y`^8.Y\H^LϿԨgUs[w,oWrRԚK%t;`yȷ ԨrRѬ̝X@޼ &,Q70?HY4QU;Tqmݡ) aUUN똷꥕^6e^۶lsWRB@@ijM&(<{=%5.y-$QQI)\jg66m{QJS.c- O RmSڻHhiW)xj.p)٪[eWun@@Mּђ0,eQL =ۛjUZ gep*5Ֆ~jfo$/ ;D/+reIb[ ;'-s)M RUj UY  WMּ e]XM:c kB3w!V@@@`j͗,"(S\R S{i]U64*{Vߑ]1#Ǐ 'W1}r` ۰q̕f: 3a   p|5q 8s̄ \y@= RQyՄx  > J"    jM    j"    DZ=x    Z>$    0Q 0)@n|q3/ϵ@@@MUQ(?$uY"@@@"`aT2ED@@@ MV(A@@@@VT2ED@@@ MV(A@@@@VT2ED@@@ MV(AHǢ7@@ _ PE @ | g3c   P(*    @ *ʦ    @*    @ *ʦ@b_]sRbyܐT2Fܐq@@(J&/j>LQ@IDAT>VȄ]j;xZ7UK$vl㓰щ &=qe3Gisq;4tڟ_:sq%S-1i~M.H/tzSm:?="X!VL@@@ E3@4!/ h]r'=kCr,)?ͻTk;ReQ hj݊Ȃ_mGtx knRX&\m+ufR][6{@u/׍_`Z귽Z ?UZrr>A@@@ ?3(TR9TjU܀J+T^ZrX0g% ;Ǝ+//s>X/Oi+\!]SЪ{FOo(3^`v hɕhY:>l efJE*+UYYSyN d@@_ZK uکQx M0؅#jn~J?S Ԩ~֬6@n,G)ì×JfҲ`0ԤoKzHbz}yVg7  TZ7#Hv؜Y#iS2UJbU]Ǐ+4|M>jwCҐܹO#q]ҝߑŷUjեU^û՞7/jV_6H@@ZsH" x,@(h>mqX-_DxnoHZkBnT.56TIZ[җȤ){bm̅VeuqK*֭N͇{bW1pFBZ[:9$i@@@(8|.PfNQSj=H:N,,SwruwOz5TMPeyȺ4QrvˤzևtU_T" [M<P1Uq   pj  pMeA, dلd1J/,K;q=/'UR<9PZhh߂.eu8o6}ez_Cjj|^ƒ>Ѧ=ZϫZ&&{PTc^Z7  \A+b X=VtZNt͞U}҆"pT6VҹHz`8ҪN.- n &&KǝgXklAxrtVV]ѩ3%v@@@`j,"([V=OِtsJ'3UjʛW*\295KR"si;&^,Y?*ӟma@@(<ZW& Uۤs}KZ6\re:z]_V.s6@@ Bo?,j    @q *    @A*j    @q *    @A*j    @q *    @A (3@JB1@@@ 5\{ |]@@@~XL@@@@B Uh5Jy@@@@" UL@@@@B Uh5Jy@@@@" UL@@@@B Uh5Jy@(R(I!@@@j$v@` ;  ̿A7     s,@PkAI@@@@`jͿ1W@@@@cZs Jr PG+^JxB+:*r y2J&H$f(>Vꈗh<].Cgtb23ܯ;{4= qWʃcs+Π?TBz1- 现limoRXq޹GM츒b==ͯ\RҫHg˕;@@@`a ZC@`5MjmHXo{Vk׆Z)(XRtQڽ&-: UwnP4p\޼KTT6!%E enR˥D+mK7LPuv+\抴@@@`|ɒ.,,g|ࡻ(PyiUVuQ!g_MMދ;P!WFyyƗTCO;ZzEϯhh=74mY+Sr(ѲʐŲ!W_"  7F֍q* .QsS5;q{pYp6:e%~ R][x@seY<טL? Yxb4)8;z]m  @Z7K!zesOCy Nqc %l}۷p'vg:r/#j铼X^;G6&uʞ#   pj-ܺ!g 0ONnN V[NؐN{Qź{5z<vwx&W;+r;.Ѷct~N8cj}Mfb6Ms.!x}FWH$Df/\恴@@@'8k7S *m)ˢ*в,LϿԨgUs)]/w}qb͓U&w"3IK_1!A/w@Z-4Kʂenhz/:złikN3Ab    u㬹D{=%56TІN1ӉZR&Ъ_:I GZuPܹ'=>y"ĉjOϰپp;W猉X`   j-!w 0em`L 91UZ WMsidjKsLJK^vEƓY?ɬL9]@@@PKK&[*Բ:'w+bg_}@/I   `Ud@@@@Jj]    ,(Z :     Ժ%A@@@XPTu@@@@+ u%J     *7d(r3(>   pẻ@"g^:.K   P ?,J    @ *<    @*J    @ *<    @*J    @ *<    @*J    @ *<    @*J    @ *<    @*J@b_]s31béy΁ss8ϥ#y@@@ +Ȯ>>VWh<]gtbòsw%RZZ" 'Π?TBz1-si_0;W25?={蘪9 s~'#  s.@PkII@I 頖-ujPk+GYN jqfZyj-@e,/5j=:ۻ9֤ýk]ֲG@@@~XUL@ Na@iKT^^(PJ][(UZU!7X5RyoiM%MUV)v˗nb:!  @ *JH 0@0؅#jn~J?UcN;5jР/nP][x@ʚy,O_ubݎ3@@@oVc[ ҮǏ >vtyi&;l4)*1&%b AŃjy{|v=htGwL~0?7(Ă @V-    L,    J"   h     *#    h     *#    h     *#    h     *# @@JxBMW΄$H(XZ%}NXܫn b*R"W2ML({&p({~rP{?Ol_b_ù ke61]) we6a"Ygp#~? ot,0[^m>[~ v( Pp6ѨWĐwuLc:њޓ-mԫ)l[ztyF _Md˖vi-|T-(ߕۄݧ'?ɒ9.)6 k>ש v/tٽ~Qa{_k^+V~cZQϔ N *]Yzzv[`P!WHKR6╵sczOEZ_1-)um?/";2QQ ,UR]?k*%/6赀V۽ gGc &7m kY}wwL =+~25#ʧ(\ͯ~Om~D#{4}*Rn3 ޣ'{,ߕ m"֐_J^њL@@~?J#>L lS,^w'.G_^[Zq}0]s?AkJ$uW nɞ]{GIuxJ҈j#eܗDTi1p]Y^fYsjcN;UZ]ʏieJ~;;صC߰ izlP*,QYdR$mhȍjl,lQ Ii[IcieuuZ']3VZE$R}14y|Sutd&EQj9ÐB]M UUuATL>MXy++uowd{{i#1 2,Vy%tW >8XtK//D Bq܏K~C%rK9߳I5ڿ6:=VatDu] Q0k'g=׹A%Ϫ?[p9кUI{#/|>W׽lQ(]٪Mf4o|E+Kmŋq WVbGNv7J:p؆?!w%x69um'ӷSۄ[5:AOsJX+SDJG^yYeibj+7<^[h|i-#-oIEXMi*}b׊ el+6)\hCyV=KVq9@^|Vm>\^ j;5ZP8)uff<5*Oƭg}œ l;gXSmTE!w6\b;t^{.E&S]:?H){[˗_9I&4z6eg Mc4ڭg_ P7 ;;bQꔌGXN"}J'yTRovzͧڄ[S]y:W-s#ùPLs/H䉡P[ixB!. V)@^v徱>]s_/FK혱a bydސujMd|2twJןQpdžH833ح[v{Wz7+tІᙄBpk/CZ UToc| h/uIwR}g~*Xh'/;_v{1#eR6L>C/X%2N6@_=&1 Y8lCF3 W6W؆+[X4{Dq Ω¨ޠ5ϫsWߝUH!^~ 9~_Sxm1křFlϖ jz S>(H`e {ҁXwZR ۵ʱ mڰ_{KIƾ0}5}. Tj[~U960`;qLǎ }CMl)=;\aŞ:#6FO/~C:ZT}w^Dm [s\6~s.q!\x_ʫr'7ހ=2C;Gz;ZH$yv8O2yvw={18 Fn)}R&d8 ط={iYi=_qv2L/N YH!E eJyMԂxk`IM@x6a/*qߐr-aO~+Ord'=}z6y鸏6w;`nP@mՑS~}nRY*6Y& p,s| a!0;Ono&@@@@|%@PWEf@@@@\Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@n%߯ws3fP r}3z|<Dž#%Y   ?=8Uj} ۧ{i!#GUW~TcvPpu蠶أWٹ֫x៥Ǟrxw|{>pIxP?> "    S^ Tj-եo>}c=dHRZO<8? -Q/u~ ]a~.j(d9nj`-??_Al@@@L0xs͝w߭աmן_x)wUG_-oӺ௶o_/H X`c(;aMn7ptI &(zh@>?*TS{vwd^ w*b6u3gF fFӐkZ}[H?^ZVxI+?ӀkbG>jھuow߭[=?}UWL>zLszyW>[}{UpKG-?o[~ܫ^0_w˂`N]=d@@@鱟jo-ldwY@۶RuEw5Փkݡu-璾ct~z5uwi?yܢ-YzҨEoS? I#]Χz*+zLB }}zTkVwXj[[F/n"Ic-5F=TsbhmzlQf9ƾ f/&>{} .zHU[8GzZոq?X_N'n hO-Y^,@PkWYC@@AFQ?oҒAvdoGJٓ⥪DtghcsZ^BRub1 [29ҷ_\U)ٕ5Z}p+oӇ~hj]uأcnں΍ܧ؇m]Yr-l>M_2flՊ5zk.,P_[8W;TOa{tUyݫ&=wqFYѠO/Zo8'FWV}snZ==(xf]>vm]m_HU5ۘuz 9JGpufsi}Zz?y; 8zs}yz^,/$5>W;llTޥ6u}FLXDw`6Oul6/.ڤq y>4By=.oѠօM"LԆ.R{#lGY&   ,,`Ӎt<]ڸ ݗ <ذU#n_+b6ް"|l0cip [2R`?hJN=Zs̓uI˃fn̊PO6`6֏G;3tЛS+/t\֗N` \R>է~sqwǵ ܫ{}wcy|ay:ϾV{UUq.| 1љds{˭1zi1|-Wc=?ϳǙ~~>N^w۫{]31{?ow;oOyX@@@6oĺ,5]/ cs'Z/);g5]7+Wi 8:2b_gmvE]RWg.hZogtBnvkIs[îW]vl]>=}z6y鸏6w;`nP@@@n@0E{K h+@+tlA >|}742[gOs[g?7x=%x)no&@@@@|%@PWEf@@@@\Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@@Z@@@@ ]a@@@oV$ɒ+:B ?W i)vF]V=<.YݑxٶXOF$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@lIDAT$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGd^X$  H@$  H$  H@$  H@OGZt$  H@$  H@gXjmyےJ@$  H@$ W"|?qlE#, NNX[3$  H@$  H@L`kңC*7k?5=Z@/ҺW_$  H@$  H>־7K/s/mb$  H@$  H jwօW_ ޳go$  H@$  H@xv{{r9gO^j}N@[l%%  H@$  H@%p>d\oEaQK^Gv]˯/# H@$  H@$&/d3w$ܺ(h+Rk%Bz@~b3a, H@$  H@Bك_߫w'E7m-~,c)SOjcۏ>ϧN?b'Z=3W~<}4$  H@$  H@C@^MoIh}_iN.O>}ӧK]ǽcSqjW?,9ĵ.~uMy)NOW[O\V!yNx$  H@$  H@x]Yp]ew1m/X0Q ZލF_Y޷ʵv{so]j好9Sѥ> l}U^SۋNr~{$  H@$  H@xnSo#ԤeW3voO-禾[ZG/K(ٻ|r3:~n1BiE/9$  H@$  H@8Bw m=O;$tzk֧n?{%%V˭/}Z! meO鷓 H@$  H@$p-)෍\J}j:9ı}[ßtʗZ-*ۦ=]J@$  H@$ I ; ~۹ fEϖW=:sR+gbBmsώG- ,.iӟlko~H@$  H@$rc_z.-[h=~N|3q׵>krڥŁW.0{ԨGղʻ{eU]9I H@$  H@$IeZNSg.C?G_i}R+_GF1Z'ϡ>1#- - H@$  H@$p᷍ crbcz9G[ŭcZjB+}jɼ[m~pffq,!CwVr|lkj%  H@$  H@x-bjyǢa{vғӽg}bȷenkWZj^ '5cۧcjc#" K=,,{# H@$  H@#0wo]h%RCRv+H}Nە5o ճmieʗĪ.9fC&e&? 鍖B8͓X4؜\#?%  H@$  H@z!|cjGq+mϮމCߒu%sdKfũڽsh豜xyi_-μ\yoB:G~J@$  H@$j;h;y|jm˻N> [;ϺUmϑ!7Y ?ٗ8Y\ -s0{J}r[|$  H@$  H@GwЈ^<]F|K_ug'oR[kYD&~V9[~rN'YhmF紏$  H@$  Hudi?Zg9#>bSd\ԯ4rK8\\R燉ˈ{1>}ό˳aV$  H@$ "{9Z|Rm.o̟z4I.ϙs}jа[:K~i.1-ح'YJuM$ǻQÒ+>'Oww$  H@$  H@/C {ybIqv'1Jc=ό?.Im}N.YKեzj|Փ8?@Vjs2V GCϜbs:=W|݊ѵ$  H@$   |ێbѰGC_YN'~lNoޚ?ڧ,r9?G/Eϴ7>O~'q|Q?-X>ew%$  H@$  HdY/8s۳m}j2}blr>vKw+~R!%ԩYwM3/>I~;O3.9FM9$  H@$  )8+'eDz@mwܴ{Z %YO;k;\Ǯҗ9jK R}\`C$  H@$ "]=>όc{ P8ur{Qɼi[{+QK#N>5+-?}%N-?T$eV4NzˉNϭK\n.lи8y||jFzׯ09C’Fb cs=OrK@$  H@$:zFk`IM?6ONQӹUmM?qNf0|Ϸ}XrćKo-oa>qlNr9%ZX>QG=qޑzӏm=~Nr9s^J# H@$  H@@v 5'o3ZxO=ؕO̷~j}89X{Yje,eV$  H@$ !hV>Z,XWZ< ҏM?ZN]{^ɼ,.;YpAY.t=zlzKIރ^ZuiM~S$  H@$  H5dЧml 3xZ#y]>KFg7knZ]"rmyrω_2#?9̎e{vۇ%  H@$  H@x0X |j;FScS]iOg^||M9ǒݨɌXRq'{C~r$  H@$  H@/E ybOZ뭡<6:>-1qkފZg1så<̢)}D~bSsW[H>_|g*vj};O^+ H@$  H@H!@~r;f:OmƧ0ZM?'ѷOߔkZyE^ ΌÏmh9@dy8>zjғ{uļ+[)vXfO>gg:} H@$  H@[Ϛh{=΃SK.wOLm9+ KmyrO.>ߝEMԵ~gXN`ETM͙:6=;$  H@$  HDwX'5e1Ѣo>=̧=yr3ڧ.^Ki?\8y?60YXǦ6:XL1/uoIm;NhwG/rrm.?k;,X*=9g^ -أϩt}3ZΖ[ak%  H@$  H@x-,lk3e>؜{SwHC~}VR+b/Gɜb =燉9[_h9H@$  H@$ I`BW-3Ou؛tK>v1Ή3YIrwR+/vq=s;5ˬ!f'u9'yj~ғ$  H@$  H@Ej' /[!ƶy[uY&i}=4o/B>:˨ӿO.<>6:}$  H@$  H`>6w ؽ5m粋ֻ>>5tjm[1cs3:5mSZfXg=崆V^Z8[*$  H@$  HueNyk+ =|ԉ_du]/|f`?6kI<+m|Rā`ŝO>SԴ>'?1{R}[s6k%  H@$  H@V˚84oWzYljy69Ζ|V13v\wj_cSOx.zf/襯9rf݌f=$  H@$  H`@/vV>ڴ V3uWKO_[f_c6~8Gϕϲf< [k?㈷,5O״ՓU-:vΈ!x˟9z$  H@$  H`.o:C-9Ӈ*:vOfL-q9>κUnKw~;p${D}U y1ZGgKCV$  H@$  >a橍m?u9u>xe.nﲟԚ˗a~ꈱ&y9s鏆g&҇m-~k H@$  H@^ŧ1>vwM.ř3k{6y3泈Sۋ6̸E랋.[s~$'E_yZ H@$  H@$"pd5g+*:s>s[Ïv֡ssqQ5kG㮛>q[\ :ʷO~K'$  H@$  H5 l-rP>v?94l͟x*j-=|Ϙ-Pkֵԭ4rZ H@$  H@$p@/m#Ʀ7>1vı9a[{+x5X:YQ#˥[&m%osѺg, H@$  H@ ptUC퓏]hأ]5kV;3.ޱ_U.pt۳3' H@$  H@$pˢgxʣcFϪ\|^E̥wmѷzj/ȽZ H@$  H@$pg/ܽεOotfn#3G޷Us@g+GjV}h3G+ H@$  H@"pHq]5yȔYܚۺ޼GlR$  H@$  H@[=23昿O- GȻ/ܛѯ$  H@$  H@&$=.ݛϻ.<6׼R|Yo5KM$  H@$  \"pHߥK5wGY\s#Gj&[z c H@$  H@$nY$9Rw?";]Spo~Ԝ$  H@$  G-sM53 9X$  H@$  |{K_[ϲȹjCU$  H@$  Hѭoi?3.euGi?/$  H@$  H@ Z@=j⊏bg}N$  H@$  Hzϧ>$  H@$  |yOZ:y$  H@$  H@ZjqGgٚ$  H@$  H@x}얀$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$ ߛOULIENDB`pgcharts/propaganda/pgcharts-query-list.png000066400000000000000000004413521315737174100214640ustar00rootroot00000000000000PNG  IHDRԨ iCCPICC ProfileH wTSI{H ҫ@A`#$! % bW\ *"芈kd-(EYTu`C{η}sޝ;w̻ @{3QU,T$=/3T!͋UJtv<^hś@@"$ ِ R`B!8/)%Ma:;8PVk,rZ<.O\ mp)27Xl8őI h Xb~ $ OvV@F  ~8G NYW n~x CF!!t b8"D"1H"C#@v#/ ,r F!PTG#8t.Gs]A=^Ao=Kt8*N gŹqQd\N[+ƕq\7'x&9R:|~?ߎ= "" E2>qy-B?=H"Z݈a$b:qqqJ&I$ɆM"IRRi; :L%!d\F>@>MN~FQRU2STR*-TڠWEREbAQ)+(zyC[*jLΤ ˩ԋ^':͚HCjh{t:ݜGOKs e;e2WyrruW*J*f**T TT\STUR5W Te.UT=zGuXN%$us`uzs} Ä0V1235,tCCΚ 4{pZZ,L ZGnk}?oIO=YO]ݠ}KS'X'CgN#]L;uN֘53xP=kEz{ 423H7bp`ac(4bxSd3ۙCFzFaF2FF#+PLML N7]lZgzLL`ͬ샹yj&,:tK_j˛VD+w V]֨ jj#a=0chJ;4[<:^;-HvMvNMijo.{8;;thqxhqtDw qZƙ ej6nz7S*;/z<qcfǪ37" M=I'OxךF'+Oipr虂3í}muf/^pÿE'/y^:qr+W]㝮ܮ5wyttO>}A7.dݼrkƭޙs.{^ϻ?`CG=מSAW>y{G_ ҟ=3|VɁ_,SϪWաYC%G߬{ޏ|(q'O??YזofX-F4- M = (u2^c|rx--_j_ fӰY^2DrӜI[}R WȎѯ{z@kx}.&Zh:/Rc iTXtXML:com.adobe.xmp 1205 966 ,@IDATx u[[!$$!$! 8ޒg-Nqdbo덗kg2eƎ 06K6/ҭ^Owu,pvU:uSwB.#d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d~: 1{v\vF #d2@F #dNqzNRM d2@F #d2@F pspy@F #d2@F #dDd@rl&>jC%D2@F #d2@F # Cu85TrMxh=O4ߠ2Fxs|e2-#d2@F #d2`Q-,=uyXSKكjҫы2j+@F #d2@F #d^zSietʟUOO8\ &Zz^Xb<-^Sy hd洌@F #d2@F #d?N1`q#tho4ʹ22>ۯ'?.d}7ZH?U [o Ӳd2@F #d2@FV}hU yS>Ҫū-,ӊy;ÚTTMn"]\YH4)Ͳ7Iõ9d2@F #d2@F EAP52"Z'JwCdi),oLOyVFKWFsZ3@F #d2@F # @PV#34t)id2@F #d2@F7oҴZ f>4L]uա<yBKӠh?l]iIK.p1*cG> ^׽j̙/1bĬPWg~L/:4^_-nωq|tk^;?R\͓7Ynwz5~4,`e>2]+/p'*V]7}xsc\smkWE0O#hEx0W2.郕tח|r.>w~yc\s_l6+U2y.?:Å;Q=UsNw| ߼uؾ?>e0َpZ[[l߾7tGS81| /KKiRDŽ?G ^^5^YJ(_i5>ce^{ퟏ3"ejhh RV|bRWWL#4 ]ᱲl,8z/2Usg^|cj̋?Zƻ2fE St㿂VKS)KYǠUsg^<21+bhb?9N_A+ %ԇ18p{-^]>l(4DӴb,^}PW9 *Cَ8a8^7ON8R9e*ơM'?ӦM{ E*[I(E6~J'Lyq9-]h[KyȑoC7ͲIR7ݲMs^|Ã4|By|Ҋq-.}64)0w}9lYc~NiӸYM3}cZ$;?E'~J' jl5MK2#/H\4_Kq샙æf?ܒ>8henZ[W8s?7M+ qǿu)ՓTG<Mc۴Էqẋ<迩wvv&M:/~qHHg+q%@xOvz>$g#,o>+'2nٲMMM3=HQzo 8q4+[&te|i{6 :'4LzGO,:a1υ3byҸ-m'/b:"y OZomZYkY#噏tS߲oiLs>qŶiS030~<1F)i8ԼdMyow#8F%o_ckp3OPj7~1JqL)%oCB4Lzy[Oqn~A'lOu~ߏi1JqL)%kCB4L{SO?}fPD: ^TȓI+Op-qxuQ3(1 e4#p1^'yNï2Uܶm/`"HoS:4jyvďץӰќF48n^Cgt|\]W]Z7w~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ' ʓ.7T ^Ǚ/zqhic•9<(oxVѪxaL'@ᔿPVLҝmea+iq0C>iHp.e໎) Z>ZǬO!|I:c\v+iL}u{˲#eÓ֕TX?i4X7wYv5|.-+r)e໎) :g+W>bVlHI.E LsgK;_UVRP̗ ;-a(@>$#^o͛ofyGx:`;-S:a84yeE?g9$;_jd[@9:V*|1 >OcLC~."G8MB/5i^!Xv~g;i8d\\&Ǽg(R3N\(;|\cgsTq ~.tHw4-? b|1߿2)FaEcltg\㛷XeYiΗ.0."~-S~Qqq.?q߼粣Ky/taXnZGS>=siY?]siZ$&,|y?zzf$ XMCq2wyy eEbYNi<t4?o]|\?c:Hw4-? |s9?z@7ap~:srbbo:lp"?.2zZ.qxp|)Keu*++crMLp,VR*iiTVAw?KNe^7Cˆq |oYN'a!Y'(8ק&nyi,恎C>4iruvM4i+rfiy:;u%Jt|EurZdCy08m.e9/4.x1&e:e;ekRTr]iry7t򡙎_Ls]4O#+4=VB+"Cʳlǹlv-yq,NjF/m7,y- .^r\gO-/3ytb\Y.~ZNw]_wzPe; ?e[%nY e9^L-6zigkYNw𚆰7:\ׇx&nyi\|h\W:ruvJt^wˀ4>0qKo8C3"iG8]Wiz@W]'E?gÏsٖr[BrY{^nYZ]!,M.![^Z/g~@!4N\˷L|.rRʜi-<.ZZ|t|IhE,$# iL7FN#_JK_O~g;l팑浟~mL#ivゖiHii>—h0A3΄ ' gzO]Qĥach=e;k3=-WL'n'%a+cL0OiC&|1iwy:2Hq?E]8@gҰA_cxS\Y|3˄VLO%lYqr+LLKt:W):ax_OTFJK!DLሧ29}Wp>DŹ/vΝ;bOyabt|RWiDŽ !iMs/-;t2heuvvtPb𝧣oc^C>a@ B^;q>"|L >G2눏\9/wkw;͟r͏Fȋs[/Ms(8ѨQ´i¸q"HYO|t )Fe1^q[Cز]󻾎;(y]g|iEyrS9EKeZz\&rݻzzX?ySt;#?iOi)S\׃1}xpcƌ 'OGc}B(c޽}c {Mzѹ|Mww^7)OpZw1/eg&Lp y!]#l3<Ӡ.;fП>!-as_Sېew? yv絉'es>O<m6z9O=br(Dz\ 9x*'A32G#Gs?8<#,uio~n\ǩ3pn}ionnM:5GɖIY<\#6iLQ5m?2]C9NrRt;]ZVy;fY&MDRl/ȴFR[6w}?eu~.uMiqEyrأ#FN;-;6;82pm<֐q37 Y8c7@K WkG?Ӎqi젹#l6=XAA7ae.e_>a9j˪(#:w]H]kiHX5(hu7R"vpIu7neG)yݪ3嫌.M9%R QOYY!Θ.cTਯ7mG:+֫6l˞wּ0j(jJ}`$ V-q= 7n 2͋k8IEC;g6W#گ b9z lFQ!ea|oܸ1.d9'9Bx7|נ(؁փaӦ#؎y͛{VhւO ?i)ZێƬ QiӦjD8gaԘ^۩n9dƌkv 쪂I?e/cXzÜrA'߅l F즦0ykч6w #7h1B:NqA=#F 3q33>6mkQ @R6iXs֏FFHjC5iM/vH=&=f\;׮]7GhxaO ߡhż8{:{4uk^gyfylXk^h֐#5wE]Ij-d [n mmm}zd\RU״Ξ{f1|Nפ=ZnxXXKG`bۍ.qK+xieß{.ԇ￿ol@5y U v>7*ȓZ,h/\8IKÎ'k~gCw7 vzUu"w>r ;pY' w.<:Ue$VBk8zP+- 0EC>ٜO5H'9 z5W':A8%Ra{1=h&!1k\\t-Ļ;EtCDHo<’_qXSX ݔ8N?Q$6m߾=Ɲ5o/5ި?z{M~݆qO'./XhN-z Z#4I֯>@8̘1# 8ǝ5)nLw }oxkjhsYZ y d;o(0-Qe}8pa֐3eeáGct~qkn~f'~OltɨЊC±st; /}SZ'#g.C+uV| +Iۇ0~v웝^feqhXPQ".:>uo[*ׇ?QΙ~Z>PkY#Ԥ`2A^;C|]?R|ǍajpἩa퉭aw'F+%U&1^9n[n%ԍMf 螰maa҄)\nٮ].>C$=|M:,C;&pgM6MmDcZ\1a&&'#jlG>YLXD:풱 ԡWl, a up,Z UI/~ߣN8%]&c X's㈌%5 ~^:'Oatm;d:Z1*bN\6mFҡV6MYQTu+i4agy2[yT5y^cx_idsWu<'fhu@LAT O}zdOY"J'_֜Ј-DŠ+"EF0ְQ!VZ۫.8ybX/{+_o=: ,[}bjP_S>L8>l\:3pZxcllGk??oG{"ś}%_! 5U:N)VȊڹQ ҈։ZgkHC'l6cCn(? s=ȯ{NKqbyG6JgWnuyryDzt J)?zKiCL<Ьq=y<8[V9+ԉ9r$t}:. c':ӡ.Űگ^Wj+ C3ݾé<)4ŽM~{f}hꂅTq(~"B;p;$,/ü%otnX4.<}a̳c][TLٻ;|O׾M=I7^8~N=;9sa|/K9>Nyv FtԘڛμ"vBMkuP6<@aOThXa7JİHnj(*إ4l/qg]*ZGĻ<:|aS#vG $X'Ĩ )BŦ:j;bgT6~ȉÇ N3A>3VFa?!$U܁ԴY~5G,#aWdC̴"|ӎb #5CO(MMbu1~ukUqaHAm2!QyrNwMfMi![)9yŭdeaUnSOrΠxu \X b_[x:6|Ŏ$| `oT(=tP튛>sհ<)6Lп=OzDmCF4%{ R5ШE|ᄑ;[`dXybjP[TuZH7G6k l3/Fpk!BƍƎU9MuJMQ wXCi pB*k GkҡSe;XӿC1ø!M:x`=ڄ ڇv@: Z? #E!G؋膖ES'9_l6&Un}#c~vi;~8vOǿ\e;ߚ٫%/F^7p^!t؟Pa(^L,*״'{`XI*=ΕK4L'CLsǡ]2D(<6Uw}, g\hBX蟦7/w[oݘtdV(h`{^8L\0<+=5Qh Ɵ{W+M aq}#wW+_{aXpƼcKxJZg%~U«^Aj,=hAK+?h\|%h5JGzz?sv̷~cW_#UQ¢-"sH zpxݿ|1\ۿoPt,y-a/q'ًWفŻSOQ+5hc`"AQyIȭUbSHzB6n*QO詃ɒ-n'.Ҋ,,H.<])6`j?dlxQ]Oo+PQD}5&\Nǻaj,cuK=y԰0&bv#'b D[v { K#¬Ma,Z_7Pwj L:%$􈋱/z&<aݶPL[CS 3'ÚT?Dgokr&NF;naX 4Vx}}8E׆~{Ԋm854Wpp2`$ 0Q:ְG_p>o )LmcI+GX/=W=ѤIl*}0WyKF<]f"ɾ@< ,l07) *L]o8VJrhХ!XP,>Y;1I{`Ke=]iC ҝ֥4ak#F= H5;E?iZݻwhؿS6}c6UwsÓ'-?T]h8yRx]mǎXc޿"5`[u ؠ@qGC{[\vѝnY,J^~7hOS&5_sx FE]翢?k\TGc _pBƎv X12~'L)Z=gSk)Z=6D^s .ҚYk"맊 egb#]a”I+?XCa^"laĜ??>9Co1Z?Z?Ob )=Bp^KB+?!pgyGgDx(ײZ_G# ΏUs/9;/rAG^rxE tK?2|zײʕ+W򕱏^GG?"lhrT PJ4N<2ˇ|Ms~n>JpYVC|S>#Lw8j2CǦMƴíO?2,ևu*OGCoi=tk٩,SuXHݳrE:YAVʧIaȖйy]h%y*Zgbnfgw~uꫯ?eNs:'xןRO@ga:x= a&[=c#@2ijx2ܱ*0+UN MS'kiÀj߭ףm|Hk=:*d޶|S#>jk#t&W356 Qy|>>S5UÓ}7jX 6;nǏЪGtqE8?|^Oel9Kaxˈxa<F=5>tqG^O0e)i5ϬOWhiL{ߺ<,9wVgפ54j복Z4c{D_3q)w%Z}u_د_8̰jVM{w_f? Ae_ hR:٧YgSm0nXٜ~lR®aXch;yM2w \/i ks_>%??i6\c)G5ȡ9 Y8E` R;aeեXH'?t-7}s!+"\ysΉBU}k,q:~9(%ވ-Z)evp Nzǖm-ad[kht?C -p 7h-;Y+$r,7N;}DZkqMUD4nXGdrQ7zd^a-;:n9BkPuϚ sd34|.9ݑ3frt_Dq Cnc$7pm7fjbB;8Nmi 窺mv< [wp{tǫ^ vua+.V;uksg4$%"Ey-tN)ܼ]Z9pVB|g$.5zMlcL ؾqg'ѓԯU=aݚ5VÖm?? ʓqkn?O_?t6G ˢwj;<-d5/Z:yzA R'M OH8>}A_}$2U>Da.z%Z<WAViuxƸ0ƀ_mR9DȜ&;dhoj"Vӄ2-eogp@-[nDhN>.ӣ- +z(.QkmkΣ1?{@#V<7`:ґ+o~2lDW_n#?Y>1L ~b_C5inMٳgǾa g88F wB܍kauû\7M{2wi#n0>S:&I<5> pZSgS35tk&BSGnOZ2wΕMټaaьMmkvIW/M>@&[op_?zlG뮻.s]]J'+5D_-ݩ5G'"gi uƺU˾'7-#ŋ,W\[E֣d?dw6OOax25Op=%KqOC5_Bgع3lv=u^oDcͣqGKo)<"n#s" S7x?.>4X+5x}ױO} >O}ߎf$xٳ]bq;t||3&T"DqԨx!~ZN,ivqx3 sĴE'= ;xFHKbzΦsq `N<(BNI:KɊ&ºq\hSt-zy4n1IߤjԓT\#Mtx+D%eRa- z~d9|Dғc- m䈑a葡Yi׎0[~}l]cPk*M&wvoEk' ꣡Ǎ c zRgPK 8FM ƲGOZ0uy$U:H@jQw⁔6=)̼ЩZ&6L<ڳꎢI<]n-Hd2}<.QŬ@SdشB*'>1gCFQ|ŋ O~-!;mƌx׾}a9#'? w^xW=ihБ;ZV_3`|GݨHBx-S{=O ;aJa~Ƀu۷zZDo۾Vi(?htG13nB#tqݲ={h(T#O8g~2a5bYD9s'.;ͅ.;$D%c۱sz[ Mz҄s|+Y߄QDNF 1ۘJ n׫LA1wwŤJ=zWun-4u+* 7&ႏ/L^`-Jh#OVhU6{6T 8'w|i?5ټ㿚+:G|黟1Q~?v3XkY?ި8g3Vs"kp">At53ף{$+^xDȃ('Qm{^?|?ZFGSժVHo߻OzDxAk;5թamIsU>Z˰ŭ.c\ .k_VaߡGKԃcaq!xeرsy!;'TX `U p4 ~C/bbozU rU$ld/ ~q-vyߗϊn@H} x[u A4:=9P郗p4wNTV*5iv߭;N#FUB~鐫^z=2rd@b^qO0+tkM0,V='[&)ç(=ެnmh:~c$ ̞=jk`WIw{`ia6v m֝Vhk}j^ɑe޳(,:{aXpQX@עgEVxj+f:0R\2 O]9#'WuӟG= ^A]WO-lپ+~^b+keŁY\@PW wd:GlZPmÝE:zIƿonpӍ?|ɰ͉vkXy^Ԇ_:5vϬ.,X% 9`m?XWHm0Qfm[I?~XCTl3"63Θ-tEʊ9{[#'U7Un+(JF.w:˞--/n{[ŀ#۪E׆'߱*kMyw+,.z_kcͺuzC*jfX_Cgh,H!𞭧_=6UlIoT݊WH^99!^IVb7([>nTKx3CIo;Z YЁ o]P_^?Ё~[lȈWU-JQe1W 5V]we1^fL g9=`aW[ ̜?7G4?]K. o㗆/H?ҭ'ZXp‹_p酋—㾯PW&oO+F/>l.j?OhعMaJ;/O yYԞo7JkYcEV_).0gNz;0.Cw;2^a7KX1ftUF^.ձӆ4߷{bR*2U-b`;f<#nek]W|C/#]e!yӦVIȞmЩ0Vj~[acs]Tޣ^͎GlMaꔉ«_@h|-W_.Z47_ptakeo>xa>nYaXWicGaj׶]jQW3fa&{s*2EO½82 ynMo=H¨w'kt\bk-rX>lϏ.l=Z5tak8OWˌ?~p׹ORa/.{ixɋ. _}/{?OytNsG;t==G6{8ĶuOs cw0=^t汯g~T۶?p% g/~_x_+Zkq"YOAmҤ ;l|أ9V>pk7T_m_Å8W/ ,ZС.+ 53| qsc֥ׄ1_?3oݶ] ?ۿn':3lOEH~Q/y>R߯íjo_^8,abAL*'yF׀FXdsflX޼a͢H2䫏:yn qN;VY쁢$X70ŋfR']q ˇ*U8½1orL+7}9^ONrEȧ}:vVVh(J?mYnhak6V]hxbry;d6p<98i?ҪӲٸ1M7ezT;哔 7:' & L)o5G'M?%g0vv a}Gکno7Fj)^UyT^6~|n1-!\?lޛ/n}sh.oU2)3c#x#ga{4rwM? m>u櫾NrVë_wLhk 6nݼTzt'="< ?Qzc8T)CwnE_SuXiulh,?B&L'NW;oY1Y;"^GG7l lܯ_\7O@bKW?@aڰ[$~-+]z =}SwcW|Nƿcm_~7*|_0oѬ>^Z۵/|?*|mᶇ?ޚ~ L7O]Gƒ, ;}nOke/~1?Zt=aC嶛il]7ư}V1Fmx*o>>F_3;wdM!OEi^Ok/El>eG9l߯ ׽,4~ת8ʏ,՗PM BY*`|JY#YO)N LUhطjsWƫ$+ G~)9/oo-[7Wvi)WqSBlTCүTm N8o9D6t>'{Ó+oKe_៯ѯ*w3W_nM8?܆ Rw>oTyr٣V}VACocS.C"_q[}A Cx#185>k_e_0A8XeޕV!/y"x ql w র}֨Zr0186yzgoǫ~Z@|<W߷{7i}+]AG6/=_-UOܥrp"(;@>ci>I翴Ӷ;Z|:ְ8a:|?&|maG:<֟|0&Z{+6=eM.GU-C:Ne[0uryMOyi͢A8C#/Ys}7īnˏYv=$>ְaa݇CWaOϟ>OG#/uaK੬Tߴp/~so<`_vXw+?֊kcӦѭٸ"9z}UaOk]O} ǯ {y?t=?]3swD7]ҥޥXpw-U0]+Fkhdڏ ]WPdž/<~@_wgtY7^7lj?_ˆQZKo%{ݺIL {uh{M?;oZGcifpDi +/6Sxe>þnЖXk1-%^Vp;(њ?Hv̓M{R2q_Pد^O{ _94##8' qb'Szp@#\>l1/<[s 8YΠPguHyh|i/ҝ1kRV V(b^g j9Cv=Zޭs@h.4%? ił6}qvxxeg9ho|2gƼuDJk غaۣz=Kkh6*܁力Hx/SrEVu¾`56 tWZc;4'g߼!s]?k÷oab0W'2LlDxg>^ʰ~}~'esp״[lʆ 2a~[X*ܰ;n=m~򳟇w|LDiZLcd0Q|# +X֬z4}>5Z,^uUagh.Md8:/냞:`/G{[]|H>T6o`񝯇=Ԏq#C÷%ztgXI1y4=ƒ!-~gA4~m@co ZQ>ᆛo ZtNxW-/dW]ַǟݖ] 9v*u]1rhᢳ}DV?^~Z$CO~Za] d&(kp2; e[|h~o3gL x~]wo]6O'uZhdžvX# ~8_| c5N8M}o^aɕH}>ra˖⢠n?67ƻY𽃾1z]WK*ŕ>оbm|\4xʸE-ϭ{EG^LyOWZݾiGF;n8v!;6mStdS!\SHgV?Z]V1Θ?Osv|~ceԥim:jXbs)wq@Kd=LyQ颧a +w9" m]>?kzEazm5!˃_^x+?]E$۲iMM !D4AAP@Qi"(TJ`@H{^ܝݻ/o7+Ν;w̙̙g!NVؒWة,ypN@UF$)/|e ([l{3ly ɡw~=(+'PxZ5ƐZ?qdGVi1_S6m; ;wY?r)f+XM^Wr^\]-Le홟>DžL[,\p֬O<5H(KGnus?~KMV5aQ},o$&8ou - f)oiə68HK }u6>o wi\.[grœ\gwb>wO&f>9%9hnGjK 0Xj]cy'#l̊4nyDžOjYZٷKQOY-S캳΀6_.?e KV؝eSgbW`TX{?eQty}qcm6 Cb`tq-0=ބivo_0~_s0s[Rr#YjtSv],{eVYs 78k?I_D8M^ۯ(?֜ .fh>SnQG}bHs}/{?Ǵ +Op%}'5)e InI~zG5V/Ayj/y+!\ BH=H ᣪl|*e܆0zXIIGðPu*GuR_*U^ؘ띚Cg]3]{.ݵÇ{7Zp#z W^ȳPdig!:+Bt4!G] R0t9~m6զZiVnh׶eJ@8zq8[rAIUGimKmۊ7mֱ^k̺];֍;l]MB@ ST!2}_3Xj:w;۴Y+X7U/oz{GmQxJ!  @%gI[t;1v~ֺluL$5֭S ֵ؆ftEqoC!d*a^!oOL9}N~{w,[6y]WlEm#oKys>_C@y1D{lfH1QYưjʩ@RA3s 6lm(- A3ۿz^v#̮7x#e g:]q/ .2l`vhhjQ^x9)ʗjf{`a|iͶtWraF8vS|tWl߭ŧ +`;e1[l 40*6g \f*;z(ѵ7VИ_3mZ1{lJr^j{zn _z>T[4%_gW?}a֩M l0ڹ]Kk`뀼`*֞mI)z;0b= f"?<}6K,Z"0$U&AQơ_sm5ѾQFƕ, ? fi 1j$m@5W-bf stWj]|4Z`أkrp]ݰ#1"/oe<y6K/=vޟO{_Y:8QJMHla;ydKPu4Gڂs䈑,fT{ >⽦dL@Ќn0ѵ( \ʐЍo-6婥]$9TāCW߂XeRc'Y~.PYQ,Xk7v{) O[ػ3lclΣa5SUi/MbKkBF\OC-AY?Qpmx49ʘl 9ΫɐU 9O|y(vYC{p2t?ǿ?cފ߶o{n+svC_q٣QOEM#Gc}{ hECc9Vl8KnЅjZ?X2-<3s"XIF_ݭi6vׇ- lӬg슴5>QKjhs tuO}, :THrx@`n,VKՆ]Z }҅.#m6>|۳e[yzR3Zf$! Tf"Ho(}6. [ymF"+Z^FZn~/R1]2uJViƶ_DBVy߼, ۀ`;vZ%6ߜڴ%˭9;`'NY=Vo ޕ[K]Ԏ u2^4CsEW=ߝhn-R֩/j.x7_] MQ֙ͪfZ5Jع45M0Vx9{PKP+ڷ~z!y50-G!DKJWG͚kk \R O~y=>Z{SX*Ȏ鮼B9p!.~~qn[pq26q"d6íyU@&)yT0#]2|T?p87so xb> ,M;qDwKگrTlf5[ۂ;0hՐ/X FaI,1!.Ye?B(fop }rk;P_q?fY=˟! x$&&WbvyR:"`گڰyÆ 6q$^uZ_cr & ay}N;n+yh gj7NU]ra8/ /0q?/kp0aВ#AK_}8%Q_0bƖp:C|e( ͇i֭<iї)&j5Rfn-vltȮn nMYJWgf d/=s1_nWnڂ)C߾h_~,g_J>/&aZ^jx%]9: zW`0QMsiϲJZj'n(`9G{uvb ߽ `w1J8}'`[{]^xBdDJ g9`R,8ao`*G!d4o|aKY>Vcjb;y6/]l^}r:\axmm_ 9`^(Csz3֛l!E5?~Tnk` xڅ mdH_hJ*KH:ay^%l쫣ZIAW*8` - %bKm&oZ޵wY^Qfc~imLyƷ?09I;XjWbX"F- //(@k()Kb}3;DNa?e\`RC%V=S>y΅R*(Rŗ!β[Qߴ^~ǎ;~:wiv?/~~NmD".|we8/OS`f۶p$ alh;L>ygRzt?':n=:iw%CkY90EkB)2d4[ H$ ˡ]m7n&9y:F;r%nGv:wdhQg?/]VbEm^v+)9= Ap wgLll_6WֵoXBΑ|(=~V>}AAN#:޻zY-12f0JȥgYzG4ӡo뙖%K$>dgR/Ͽr꧲#N3w0ɥ/O%X[Lnϣwdܹ3TAx ZU-kab袞8zy*A`ߞl`l{xVbzuܫ\SI:fD2 :Y;:J£j~``@Y,WYKJ ٍiok}L`e )XPa~k8 R2#Q_yQ~뷟Jڽ{;bg?佃;*nMґZw {ͨ7:gaGAw+Ae7[9ay-"MWeiW>aGN/gUW~[lO?;M77{ٶr*Be:GGÇ )~& pNN;%-rcɨJAH4/20)22ln14JcTcpymw K.e\upRN \S?Ѩ _tX^T@Jy /K򅆀%0fV##y4##M}o-Z8ߎ34Φ?J &SA_U-2+mX?xDZP4/I'm/-M7ߟc?Dr ՒbXw-vۄclb? >\oc֗1(*,ZFM})CO*Km+Y;S왧&Fa EOC? ɫvՊДjht |$/nRcmCޅ&%%~m g3j::^-|:O䋾pcNdZW}=7q#ZT 8"XhF`DwBqܿfz;KS>ka>ڝK$(pz4zAܱ"& _˳-b, ʲ[inYnO Z=CR >~=c7t{eɹvWJ[kOy~A YcqX1Le<?-_H?xppH<,n -?1bعݺY*x;yx$HL݅Uv9vË]Z8/X1.\46Sl]u؅JdgD--w+9|p(V_XfϜk׬F0*VT*95_4_lBGn;vo__ªGuɿ{KLJ^]z1o}˳;d:h(zŽǸ4/XyNPv_>)^B5FkH'8zR l'm_sNvK ~ߓb<!}{ː9Nп6Y6O&m]L5R f-j'!CMh|ygݹkeOU\XKƣ?WJB-3 j҇7ZرcG{7\4#e+#<{'ؗ;';(* &4yx[lPSD-O}ɐE[R.C&Q?[DEsr^ݐ}+{˖M7A aӊQonp0~ZVX\%OUq"MQ^ hedA%$!Ke8pT;Z?MnN^oWtʶo WG5\E:Ā(]k}qfgsFz_#ܸ߉Jgk$,*Lpo';]h3 T}*%Qs,diE3'|?-N\{,5K Ɣ,ڿl2[d[W4tH[J5kAQMˣ#Z++J,`$4@IOEgt+<Ϯ['/Xr:M iV./o=ڳKcB(̪s HsHYoUj=4۹c֌5""DE%t't&.R^aC]Lx%ʈLI-2'/Kwbl࿄zOj`tJ[Koη9Õx@Izi F(}st~C|mJ:Fym۱^+F~5jr<5#^P>\%5kVh/G혨X24 n;I  ៛M噖#>r7=Wn{v`_mwE =Xc r_H+EKoZbX-}ܸ[ڵi/֌0ǔdm1ʁC%*'P"xlc#v3c/9j<`RYh_qy۹6ůE=0:֖\z{kG`CL0ed ]%/:,A^=! Y3h |6iKVp?}T@m"NOZip23 Zq9u@+:xb)Vuj~>l_Ro6~GbDiɑٶe tt 4{$ۺ:n1(jǿhJk[Q*ɳ͝ff?␅dގ=^]=IƁ+B:'c`xfuðG[<O(Eo@aIi@Adh__ОCG[oA)1kkO>e_^O_G8N_ZD҄f 5D-ey4>GG{M9QvKď.4SyCx _kG!9<Db`nZx*-<ggrK ek^ݱO<-m[1^"p=R|9?+k=~g哺҇pixoF?"__ 9cQo(a*#'0~Q/9;W/m*.)]OҲr;+޸yzXnٖݺe[8KnLѬ=$C`ܔ%\ޗ6 r)Ѻu+ # "/)%ҧ m]gQ ,έ`XcB &q1VhY Mjp+p8{Mj Djդz_}>zS#4@N _Wg4]|A(4^g"ܧZe)_AWi26|ס+GLLoas_7>]۷)|R:LRYޗ2H&Pc w=*ClkS6G{megve=kq'UId0r@3pAS1r[/)'=yv q}\oSЫ}錳!*ЉۇyB q=XV~puδvmA= J>U\Pb)xk% LD1K6, +֙8q{],\Z b;GeZ g;*FV־M{+^b@0p#" JZk OhjvTv-۝`w>7 &y@?7mm837k+(EXE.Ks"}o&n|v ̍]0 hV vvZr =Q2X:cnuēk:Fsp_W/)WQt<憎.h'0PWH] '4wsڎQ+zg?Qהk,گ  |I 3\ey-ݗkwxwF2TjJJIUW -kq4V̸ڹ'? _4S%jތ%1ʨfdPtρ?\6vQFu)և3wA+]-In0)^_~s=pWP|x{ӬE:]zwV,z xF݈ݝ*;2<*#>[0~-*$%&s!rB0*򮓇D%tIp>Qqny{={0ΑO<\L-ԡ1͓=NO2 Q8ixqߓZZW}ɐҙl2uP.钏 =¸w2G' hfU.^scֳjKJv@٥՚}8⻒8Ef3L{=r v"^([+_n/wˆb|:ͤ]3϶?B/(z4rs! Xθ7qSkي"iǕ%gıE%&v A:/3Rt)?m2:okP=y)gumcԎpM GK)yQq#1< HejXsu!`I|+72_nXr1Pc 4pR:7vٻz0"? xߞ##Ӻtf+pF׵Fڳ3r6p֔]LEP|:ӿ@S;>_bt89Yأl&敖 h{.>V60^.1n#gx'Z_. t<^v)_01lG2&ZIl )o601yCZIuwuVz8N 3mڴG ?Fأ:ֽyddV:+ C4VgzGg_Ἶ}GyϯTY//G)BNP[r!t_+@.%(غu+.3ԭwe֬qe_Mì4h ؤ4UV_(DJYQn$JIB, АOSAmZij&6Hj A<)f%P7䐊4~)GۼctAh=DJ}xplC۪5kWf]bdQ>[/ZfeZ%w+0Fסʊ;|fۡ 0 J 7>V归c+UP''y|n5މl ~fUnn<4#%}'Woa=w`xK6iv~v۳aZ|'z(:`l_7m6Nn{kpw7K&F 0.͐(RI9ڱ`۸ct h{ꟛ0rxܝw|'t3Ե?G_omGU5#Kje۟KP76 "^@mИι]-~D~u-[h=諶jFG_V *#!*SO8<|5kI neI-[yS݈Vֱ3yeѸ0$# w JAez~&pFlޅTR{r'&MPhql`Z_ >c rRY6x|+6t'Dad 43_~t{|@C;Z^T{hQtP"|͒R[~eodnƒ6:QyIm˖m`Bnxɣf\8?6vZL{878ENp`LƐ$?i m0E_鿛vrfW^xvCKQݛJv:.(βCZ+o_f?[gH5h4 J$^ג$d2/i\DzD| eM$hQmٲhTw˔p/Zv/lc#@Vq؍_ObbKS1Ғ52egC7R%?l%Za4[4Fk忆ƿ`tx;6mN#oA.CͣP"//f#Iy^++ kkBkdHN%H!BWh5gDLOQ^wkAXZ.H't]r n9bmF..q&7y76u{Y$bF9+cb<~mFR'sShٷIxp?p 'W .f}g^G?wg+bڀqV ap &G5ickeX>aqJ_m^:d(Kbi r,\('PMWÌFw6yS7 [W-{9]h֥KZ\x:Hu$_ŧQ?jȣJ9}~yUzIt(]5xG(PzYk?g_kP Q!$Î!?77T)]ϽqH+HiСo물>{+ݧxS^*ק>< L^A>w_dḚA7Q2X+\WݮIӬBO]]t)f uζx6_p !(e@j3K,4JClJD$(OW7%͸*,l _s %; JDucz?OAU,2F`V^TB(o,ҵ?\͜ 4oF12\?zϗtC|ݫ,۠{\Sd͔Q\`v"QIr,gfƪ؆fFk[vujkMzwJ<#vO:n(З$ pWۇ+Pq;_A]'(/6Hъc;=XL ;%cF)D͗icXh׮X<( (S;| }>7.m'c(ε#7hu͋Q[>8O .~I"nlޮ B Ƽ/ơ^Zڷ غ Dufv[dY\l][ [YvA?૿-q;ߔ_.IDoN{pd^L*{k~Td`eFڄY% a <`t \*a7eK$.yAfsFKϼBG՟zz'{i?hF}'};AO1L!HlX4][UB"InggNu] j`lRY('Cg#A+% 7Kjo{ݚ= ?)#Wv魖͎2bXLu(GO|T*X2$q vz,'Z`LBjZ6ȵ<*ܮD&Th:%h KKf %%Fege&-- ^f5%5e7'(c@'bftZ\B.2)CcMk4eBYf4<muY`kmdOc?3udwng9UpOء/j8>_ 4CV۳{1eT6(Զ5Gư'Ok»ZYk;cc,۳o7c-Kyx]cOP=oG׉#{wv5EҿQFӐۊ] 3YƫThߔ7i~v?ރSBmPd+5\6t?HC=sͻirS?boW_2ڤ ۩֭#N" 1ӊdEƤx}%z\ INA*3.6(YF2ޗKޟjB~.i|6DpV}p|uvC gYڗ-?k\E\Z8o仺V{ BB2C#R^ xdʧk=STBZ4HI*O^ eRJϾ<}9>F=J =Sۥ{=ӽ7>Qk ˘Mdy.ҝV̟ 3h {w #l3}DzXƘOU63+Q'ECrD*8*ء Tn`{Z jAM8R19?_g1a/O-JS|9O??R_)F-m6w\KKO0m//_B|3b uf)CzVBеף}^1''G'>M:t|J_>uNyu8]ךiV~Qp*DaG:g|9B0=|~/-G<&*z25`yko{oCwtxx/(`WMqcILvx1d$(rpB(+C̉AKQ@Uqu_X3JSb`jk%:2PJ w}2:wzfy=R\+BAw?KǦx߲ x(=_MiS?-5fLFlRLH)?E H'f=K^%vbiS2b@GE8NqM<n:Ő3K\徯Ь$,@jh+_X@$cX09 :8Yny uLa Rr-ELtO4]7y8%E߄0 (DJ^sę\KEj( @hjaX/zEڵ3˚|XE/5m*X?q \R3LxKcT<2s8o2fXSR3a$uoJz͘6Ӳ!#<"ӴG2?~J)OGɵ ~M2Y ΔwȐlҡ^ ֭?/[N0OS;v~FHI[?4iw~~Se[|{?`WKpZd^gw{PǗN>_VpZZu#}^<| 6B:nt@(佢LH&ա#O,z!UrtUGbϿ=Oi׻>^{_o4 2rƍlw}+˘"QIC {W^b E+jTmySE܃5"ÓvR)'n7 IP1JHy.ORš2`"s+Aŗ K  W5ߖm!vKFd|}ij* 2VUBœ41Bq!LF4x19R!F\Y/V¨ѕcְ&xMO@IDAT6@Bw+%mFf*($ڢ% n elh;*O~vZf(}6WeX2.#h|lCo|B po[^tZ0Ղ]5\Β."D^=o_^:nN]xg)ZoW, O?:K[Kg>OoWFxL ~zS<-d!M?MC8t?i?uDtL?߇=iGTCFskgP=??j>Mgk=̿GwcG 1 @ hK|<ѽ0*N# q0ga`7ÁEQ>$b$N;$J< 2iNgRnYo衤"-S$o"JŐq ULJMbm%2 CB%UaJ2١܎|-7%4%Kf/Q/K0Q#E¨KP׮^kW,l\;bA bA &\~-?覟qsdI OY:;J s>Mg(Oa<>|u^JV#2Bޟ_:}p~Y‚;GSH__HwNW6='r=x_T'Cy.,$ӷk'èS=%.ImwֳR uٵ4swR(BrLYI#Qcxk1zTCg7]L"ӉVVZf% =<³0ZV$QDQWO"m*-z BkFjIĴRy-ӓS Gb* -` >:Sym̽<x􊇉aH |ʵ?T!^WƼ hH}7^%`$6u bM F12-i@Pb00b0!ğNp>?5-HտkԒgҽOY3suD+߇ϺwZ<4]92?釜 @~%i< Z,>ý{hm-vҎ?U̵ U\+) %EBB';@y(- /v3iv@4+hf)CutJ \prXx }Ki'?'-ŀR[%X(NfᵓTT[W f\ʮ1bxk1zَzM9\ ~"Qd_#M|M!l7hɡQxx]qXUkpٍk,0Q&URzI^R0-7Q:F9( Zj良Q7qJOv|-v_&DV&Vw%I[5fDbd/V7#xiqix?111}-z?~O NudgG~ =Y? 2FaJ* ;{$#,@%AFҏ#A2pIGw1Z`Ջw]pZUyÉ2],28!)!J"(ΐnvn;|r/eDg)R!{vJmVAi;e%&J>A݁ߋ(ZUhvx?rKL>G12>i{_ /~:?GEWpAJ]y =F~4%s8OkY:tֵdzk9ާY{}wyk%IZPUGc1hV[Sɭ;V%f+j5A-Q1iI[M*<6VhVh[V TI N*W'_%a..fDDŒw<4SN1N=&+uha%w_E08Cߓ csX9/0 b5kZJr`X+ݮAwQ7 `D5v閨`xTah'v% `D=U7=j ;&Qޯ]@ F%Fr=#OVmX^zDo2 :oeTɸ;kOQ}xh'/UJy\K="bxk1z$ٰ_|,%6&䣘| UHB_=#P!TI!&JKF#u?]Ģɇ>7 @|JS^ֵtSY?7v2@inD;K|{e{7|{A6x(  QSjgR*-իIfҧdnL΋ l ec.xv aq>2x]*\gX~Q)c!\rsNc]ѲDE~ހv"`WJdAާk`ՏP 윷ߖ'J=0*.lݦ-VYVBɁ;hc.خp#L=eY̵O<=T`SrsPbh(Ying->|rKYM ~/xA;l>2l-5T:C'> jخ@'܊f@bx$k1z1 bQLG1(&EYvvзЬbz3l"JPZ8tȡrC 8 Qpul,t ~_4XRx[ 6Zn'O)rr"ŀʋ (0!QJ^C <+,NP-|?ѣC>ʡ+7jΤI?Je=  V\F%侭X|I孥`Qj'ۨQLqhyR l(C۾`^(䧟TgOVTbQ,cTQRB1,}+ ]B&MxU G&6ZN+k7+(өL)5VX;k*[4,7ɝb',1ȼ6( EE>YRZt0vbV7]Y{خ Vhr#dnFvMbhe[u32/ԯ##PBnvE@D@D@D@D@D@D6~WvZt _~pl6e;0y :{n'?0.,k['T:-騻S6LSoh>㴛bćۄ([ѐN1w++L9e.zLYQċ(VՔײ|TqM7uc1VeuR2%˔]zMe6b(9OAkG!u9be Җ( :kVW&;SΥPrvel$-ӻJ?,Xv}&,~'XHNNF^'G?7- gdp &Q Ǿ ͍ /]~<_$h:$" " " " " "иlٲ| nzKXn柜ÛOs:~6v,;{Vi/p'ܜw}ls9G e* Z 3*`&< bjvgVk'8>˫O\WWF|TD`',scqzgV-b)0Mw"$r{`l+{K/O/)rU|B7D2U]hA,XSgrOGp޺!n$}O [f v?s7[=ykEMY4>1ݠd2<#˅6mB1᥀xQY;JB ^.\Y~x^eТޓ8Nm[W :ɓB[ X,BXAY3-T,YOg**V'<3q4k%f(018{ TNaCk,+bmMᕅrDH&OWGC7L<-=PdX[2C,̒߂^Lw>tՙr&$$ 11(,,PçVk׎5k F B yŋ1dcRZfRj|?R0τYciuo \-Z߬ĵ\NyĽbվ`q76PׇWag Jy΃7`^]Xve/|Tvd7bimB+" " " " " G`Ædw'OrAtO}Eqwy'htUmZHŶh1s ݃ ЦLB-v9cc8/nM˴u**_~鼰\.u3$ I&szEGkugyGXZ@rz;edLayvHK^!C;oL2!9k(i)vXE54(PsmED! Sv&hiBci?ǏCff&7o?EDָZ63mҙ{ax1o#i}0>H,_mq_ h_D@D@D@D@DGËLpco׮nذ{?Ki͹6(A /CN? &hm=۶E);AL4TŖu߁3>yII,b9{7mpS'})Rb-|Q~gXywML]ykCx~h#VtzX`mSuye=mxDW⒅AZ^BS=נSDƄ[te1 RB9R8]O{3 ZчjKCԦhdWz:FssZ cSϬ޶Nؘ(2tId@a} X*tɌ[u7 M:Dw4~#5e˖TI/f%@՗_ٵxnx,W ZvVY6d"#t _qnuL2Kop뵿pVMcooΞz9z4W2 7-R둈`e^ g{4~}r<63hZyާxUp*2ce).P|R|ezV< mE@D@D@D@D@'p"eуY (Xʗ´ ۏe{m/#!Kr_6qD:b+iiӏJ#Xkq^bXoDW#4ɥKEGd{)$E 3O MKlJm(E{zmn\ľvpۯs6e-U$4uF`\X i輪.lRKY~~৐8UݴZ'&U'1US\yUc5 ho.{xfq)tTs_} oW}D13Ld˦F& tMd!fNVad=~2\j |jJ w߳O0Yz+g İ;_? cOi¤'ж)7̟Cܔp)߆/o/}cpz8Ʒ5 {oq(uz]coŠc?쀜OW#I_ڝ>]>9bJLCWkBeB ZyH4Tdxpv{E33m9/v%;nU[L" " " " " "-{NwD?9=uqNIk津uTCGSz-YjҼ۴:|,<;"ti9m_NH4R|\p&vi8Ń7?, 1sFfo!,}1 H趺smR~O tTYBJ7A310;dxd7݂wѭE(>wʂcx Z-] _qxeZz3wSB148{}tѝ/526,?>>I8b럩ړW Yb}E `i%|M̊9XxbRJt%\X}6(?Tx"Zًe\l\RP,1,WK(h}}B`k6<|DA cKswU:U|:vF׿b!f%gWٹ5ep-ZٟI(jkBSpSXI`]q)c::iXE7;BYi)g|@ks]P K i!DVs(b\0C~zFQarF6ny;@McN٫G9dtS}mvOA bb4~eBYr& ÇkVCR xάɤ^cDfM5!V?\bY,2ܚU XƔY %",?& wLr;v c>cBm"74427G۷\pᄑ8UcyiSNYuV5, fUinf13Nڸ!M/&Mk.cm~E $bUp~>x\`mUXŒJ NȻOv`)Hc~=\`׷w CE>0kE`*-<ʠ*t8i,8-/;u˧[~ ]hwZ1ʶW GboL^Ϳz!p6r}@<v ,uvkB̼-|-ӑ@w!5Ä 㑖VCi`?]^~y il_]Co?/pO9j[ m3׶Կ;xЗ^S̓9iwU %>8.a0{SJ̅,k3P|s ͒a~R1LhQZ =f1e~QTgݪ}Rwbuqya& Mb(>]BE" L1!/]_x[ra>`2~X̂,Xs+a/~FMVSV.}yŸ:ug1h0V!-ť{XifכJžl/Mq/]SZًy繕]y 5WQ|)1!'/ ?Lc0*h$sYV[ UR M8dV_C?.oORkkËU=6Ũ\D PU UT=8n4E|zJ F֖oK\̺!k͆YjXs@J]ĵx;*U@ £om=,I 'MO>ą[ K.9rc\]Ú5E5s\:/=[i6H΍yM˹!7t _yg۠od5`ڃ%'N1r{ 3zB1hlBoƐe 0,t{XYکɤIc簚V\l-Z~:֞3 9<,GvW C%1n}^g_IJ "7,,!Z6Y(/D-}k~b\u&qcҢ*jiA1=%kYnq&X lwYgᣏ>v_}Һ _.7QÄmn̺ǹKΚ9q1FT}7.R5c퍯>XgjH&Y U]`Քܩ h/63zz_p/%@ʥ<}iHV`Cd Q7d<Ɲ[`\#Yw*i'ϥ-* >LY1^sG<ڣwzjj򗱍E8zp} ˂qH/sYm _w֍t{ץ}x,~`Z{ݼQCE Z~!s#_MsHw5 Zvmf5s2ѝyyƒ,><}􏿣Ob \ⴷy >|o~jfciu qsYγ{uŕ\b%bt,SӼ?0~,b?)D~fz3A L|iqFtOy^ {Zܷo_؊|͚5eK׿O }Ns#ZLC$򴏱~J>ø9 1Ʈ`bi=&3'ctoLr&/!%E|-H<3 gWd _2Á|Ūի`BV6Zjm pԬHĽlfUUae"_Bז*[/f_"xVj7wG(#=)(V®/pʲxw|ߥ׺wݝG7-EWߕKI)!"-O~~>]^4ʏm6`W݇=bֳ0* , ~E 6/cށv? .'_M,l@vdϼmR2X>bs=J" " " " " "P~)MBj1c3X|E'ۜ֌T?'xro^?;֭+o%+)hOJ zqf޿p? Gp;+G#/G CHx9Xr ioe.Q)WIt@P"vQXjٳmwW=4_rE rn.te|*s˜XgEId/̥1’Z3.Scb&Z ik\ JEQh[fd\Xw#g?Rds+r G@10^`ۚ0&k)yTK'N];)ѺP wr9xm Fqcd1UVȬLlnQhC D-룥ۯG\uB9S|YV&5M`d{@bۅ>z2cBޘ3~$WK4>}Y~34:UZ*GO>hoξ 7]~f"]1+pgq湫Z)q~?,|5[\!CWSOBWJ" " " " " "PfgK/umg̭7n4:3)j=]vM6 cs3f܍;]~>7iUF'M6tݟShlb)O?4gJp09y-[бu;.G/N|547 zj/RNיB÷L*,?4ώyfb 7}%xe·2'oXs9d>p> Sh)FSq+$dN4ay> . ) qC•2U3-Kwb.ɗɆoꍕ_)3M)2ˬ̅8Q-{ͷ]gqܘ萳J۲ΔUxY|&JRhL*5Rxyt*y}nq4i ZY׋hyU#V./Vf ͒0`Йx& SO맆fW#⪫&y%-XCfa^ZqHp\XA_>SlJ w!4XO>erNX5[|j->UkHIyP[MRvص hJKѡD ++ o6NJOC7om jz BK=33a+芸!z Vp~n)(heb쥌?Mj%:NEg/鼭j[<- -L9?Vcmp\^&~MzP~+n,oC\[8Lp?|k%X~q0϶5}Ls ?lQ+{˖.HQs&Ǹ>=BSǬhiņMJHH'.EE^xZJz۬(xb-<rhg=fe ?.p:&ZiEF2f|\u0ڢ}Ux؜Z.H=L).>ô6|&jEyX1_b0!,ϱ MW۶nA~$Q}ԩޟ[HF*h&FGrD| B\ȪmK&j=_XDWU{:+" " " " " "]Xx ۋ^D˖-pܶ8gtrjٲe]V+(`-N=;adU9+> qw5ȼIlE@2{֗'ẌB x 9>ƏǼ4Ν"_Ԫ~_Pe' FY`&KŀUX'hE? Al⪆ŇPEW; fIV,r[L1~s3˫Ro˴Q >|]7 K~ V*E>Ա E*ZF* aeXP37^C؄S`-Ӕ/n1Z^,cY4a-ռ8@*¸GX@=V~/ʡ~bieV(S{I&T &jUXM)x+DSO=>,6nDA2dH\Ҍ$FN: o:2.R5;5FWĚҢüwqO؋Ŝ97˴ }"Q4`{_b@#H+Z&*~,?8gۚ>v9ۆ4bxuSy6"hm8[X OY|+Y1 ]+͒4PぉiV'+%&Mf5jW1ڶd-U)KyX>}.7vn7{̓mmR6es'ԼKYjE[a+ FSQgqeufeKbeJ=fieSt M-ЬJ,$RQfejTY3/uɵibX MbLcf`e"㢫LVfNl2a%%%R)E(RUKmñ ihemZE%z([mRQb1iFʬjZ*TV@yh uf ?=lo^Lfe~ͭ-Oy=0##OQ1b$BOHQ1qYf1,Y/9u!`dJӲb)ѴX J&eٻdohG儤hX.^5(Z;}1k>ESز)eiJVTI1Iux\,DK0k={Ïø[&౷5h]f^6cDM/1,vV}W/dD@D@D@D@D@D@D ؼ3//<4/6 鲟Qݘ E,ATb̴eqUVB\e)YA4J!-cVך1?J%7KqG,Bg~Q _c]Y`wcLb_q ]i]gYֽlCMbh6,N]v%Wa4ZtG4ք2he<9JF%Srf޶1iޢEؤ6żֶm["sNj4'j6F!j9$v(^YR B̲CKX4|2gAg5e[w_c'hŬRĬnDrP2?)Xj\|x䧥 ۢY/aKBb ayFbff`e+'29{S2+LcV\4ˮ6 -jZֶY933"ƱưNty}h׺v܁ dw9yVJ.Ɯ;ޛi'EѮVh(>pfw1>e+oȄwHr`d6lE\t:J!2aJBJ!mG@F~6WP{ûoq~<*#bwǐ{qbHZ;[Gmw6aw^~}!7\5} )9ڵi٬\༟,"=qYaQ8/ҨX'&8;*Yь}øU~ZBPQ0h~&X+ ~ tn LjЄ(b1^(ȘK  E(ȿc)8і 枉n֏(*2Q,oeSN1!jDDbrsT)EYxV4XѺ][|}{tnrN8l$c]gAK&/:ro+cn}c0κ] Iǫ>_jE8;Q|W`Qkì1&rp?}27UgEgtu;m"F{AbH;~~np๿ߐaBߐoHέ:x>.^oGF!j-!H*Gڕڱ X4D Y?@IDATu""VbujR2rNQP+hb a˗:'ʾmʄ<(xlFM>*\"ZNQ2IZ,OUzfDDhEAWkKXw -v9gL2W2I;ʄ70׫?p>Ӈ &! 8xhj}7FQƈ]T#8#* XΊԬXs`;7ᑝM2FfV/*N3336wO?*)2E6 ;2_AFv23?{Z+؍9CJ3l_Hϑ5};۬{; _# 53p5)MQZ_< \UJ HT"H?ŦhngA9dZ{T 7Jy*@T+Qb&롹gX"v2_s߬}L 6ߩgbrɎii|&2L>[Tߜ`eYfy(Hцۢ92yjllKh%cHqjUGS 3+- aKKHϑ5};[_# 5|MsșG(,6{1@!(D^xP TD@D@D@D@D@D@D@F~n(" " " " " " " Dt5V"Fj" " " " " " " "ИHjLw[c! Q+Bn!" " " " " " " Dt5V"Fj" " " " " " " "И4j" " " " " " @6mpW"-- m۶m 4Ν;gyv:nytLr'cFx;vDRRY[X@.]ЫW/|ɸ[$lRVtZD@D@D@D@D@D'0ydtYhy<DG+ωW#o hڴ)gA6$j5 LU%" " " " " "p|ӧZj,L0P㕀=-ZYm)N@t|tVD@D@D@D@D@D $&&¬`$hE͌!3ڤI}}UH*"" " " " " "p:4 rmU?N*%" " " " " " " "pu uED@D@D@D@D@D@D@D~$jՏJG$jG7C]Zݔ? z+nb$7CjT4? ~8z1G_j8fbb4&%1k$Pqbnغ/*E@D@D@D@D@D!{Zdmچ}~xѩOowf"gawwwN@w~ j.k) Q ڷ⽯U˖-밪4{o`v&[{:atoY#Zu~I\|lDѯ'χ_⽷`ʒSj~vo$% 5> :\oG}!,< 1[-ł_R8c8Dz9 LDQc0k[$vc }عn^X?QH>8ǜI>|׋&nî/gl0f 6ODBY;7c+oD@D@D@D@D@D b v|}1l9X7%k֞}~|y⾃դ?$ju/sJRNðeͨąWMASLtdL.V됎 ;'meA|/!9z)) xUu$tÈaCYluv> W\O/`:A$$i*~m6 !|ޏI-;aR9)W uYՙ9$_ mE@D@D@D@D@D FeGMS14FQ>^M9>E-]Ibh`ev-mWa?[hۅ;}ݖ-Șbաۭz(BVv|.1|$IB H Q/ ZV`3^~ai=3ko$ٹ Zvw_1%(+w \вUoѻQ|x_^AWü !0E[.Su_nEe/ji^!ʕd8^]c2U 4_!6)hUJ)=0|VfGlRq@Dh#cgݹgT, ZGt LAƖLl:8 dҝAsU95qWY:Qe1r>l'vʮl\FrGixogD-&FIZ;n[ؓaVFS6VuaI^#՝)ܹYhѲƲ`FȷY~8)ʿ o n--,Wi+* f[^U؁nб0w_2#,]$" " " " " E 9m Oonl6mZOKZǢw~p;s͙yW:5W-ſ 7/Gx9N2x$Z3p<@K]˥ߧWYjۑѬPV"@GD *!h꓂L꺈*dj ӝ&+|c(Hn +ahV xqŲvCj畄=`?_ BղS O`m-0ҡHNn}ؽ O!rsrA%E mHmK,")=zMŦ5Yas<RNLRS44#>:T{f &PRƐsAխj>* ~;έ,1_7?8\ZS-sg|r7Et^R:'}^w3%b{Yj3։eOFQ+$}mE@D@D@D@D@D x8ك14BLBC#c VXKsҶ)p" *\q'r| ^^0C.0x"X D7ցc0Q`l$_rs뗁s)0_2z Iy<-;ݖczQ'Ui9;-t|RֲS!hyRq2A˖Lgj׭]\Ab%gKy9_,t.O8qt? ee<-]ظv%30#%: \Νax5Zqq%DOv2}q=C3,:uoǪې]AA 舺7tf ލxEpuW @@ZsR[{`-v@2/YbJ,rFtK@WaWш9s` }t{K_iQr\_QS`N}!`!Aڮq :3 mĂl>OCLaرc?:-)С[wG" " " " " "91qAgؙʼ9>:: qR(ٲ}N9d!X2l_?<a|t^a30n/~Os h[6GT6O;dH'P\C?v`5 {CttY"WWUĕZ#(<".@7 Z,WKlEglDzg?*)C`DZ^u~ʴ \WI6o|{2DN;6#u@:A\ E+ @\P bT y'd$ eAJ~&,8 T" " " " " "q2P` E|2c]5mZnD`N~&w1ΕR` ]_Df|\ H@П/X9I*mS|Zkvg^`TqqL[8Dգe۠~,?8gۚ>&S9ۆ2Ju|K^z%z4>|K 8>p%ՁK˙SJʶ1`~8X6xmk[fzlky·y@Dj96X^y;w6+䂄T p3NCW \11g\< Zªu j/\=вɼMÏ$ju;gVkUXu6FLBpʥ.} MT8*W%}>;zy@ L HQpV||SnC%D@D@D@D@D@D@D@DU3^Th/VU~D@D@D@D@D@D@D@D@  $" " " " " " " " 'Z'RgE@D@D@D@D@D@D@D@D-=" " " " " " O|^/v9u jڵk%B={ ;;%wZk" " " " " "(<ؼy3ݳjϬRa|tVD@D@D@D@D@D +-܂ɓ'#-- mڴQiFS2AKu]Zu3R  `"#D@p$jpLg@D@D@D@D@D@D@D@D# Q넻eD-=" " " " " " " " 'Z'-SE@D@D@D@D@D@D@D@$j8Ĝp=>UDD@D@D@D@D@D@D@Dx%(D㕿%GDe˖Gt.|QQQ?HF-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " O@Vb PD@D@D@D@D@D@D@"DȻD<Z5@<"jD" " " " " " " "$jE-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " O@Vb PD@D@D@D@D@D@D@"DȻD<Z5@<"jD" " " " " " " "$jE-E@D@D@D@D@D@D@D HԊ{@X# Q+F$" " " " " " " O@Vb PD@D@D@D@D@D@D@"DȻD<Z5@<"jD" " " " " " " "b"~qK`wzdfLl_e=m =гпo!|+A~HKq)hءЮ@$ QqwZSٙf`Enزe 2Wd`܇\SfbHmw=& [BPLy &hWD@D@D@D@D@6{wG9ם ,hU׹1X>^6@# QsXluj;5&,yjZ5}WYHHЊQҿya#׶ӹU<9Xs:.SMC)[՝cLLQpC=+YkUhT[^/-*@Q</r֯5&{{O)7YǜXb5ss]C'NA.~ hUG3Xgldee#g{r9f;otZ+к/" " " " "  E@(])#)DDǓsM͚֡u짍V*O]CSlky!ɱˍc^8IJL(Ь_4Nu**e5m UMo>&dɗ!CEW7S9̐VL&4.m(YV~R?Kl,x 8ʠy3Ȯr2D@D@D@D@D@D (Fuu/nD~vY<i;UL4Nuվq?]=>LЦ!RG&1h׬*(Q9b=ިFn>+9x7*'/6]`0]WrQ'⦳jvA6;Z2O30K{Gj~f焵>zBFS{ǤYO(kzUD/^o4=7hd~7|z6/-]JpFjżz_ \ЕPے[aqG6N2ٕ;\~ cM6Pmxzߍέq[YǷZ:<ƁG5ƋKv5S< \ed5Y-iSXM)UuN+x+N>&ϤIQEe:%" " " " " GJaL~$k7dڙ_h1$\NI,jAWҦ݅Xe AR<74m?֕ڹ㽬7~C+a`Z3+RKDj=WTj\W[>'{UQMUOw#ͱHd ci BU4W hTS`QZ5t?Qe;+S C??m䠩V!" " " " " džT y oe &t[hn?Ô7MyJ@pewܹ=bׯe0oM} =ʩJixML[Q"3s2Xuhf54+50̇!k(l8^ص&hÎ.Tة:4 O|јpzk֐7s+oڰ=xN}Aỷ >xz$4xRnL: %x+"q,AvVV̟U-Z)CowXih$j5MrֱF:W 4el?/Aƺe.}]*PO/Svp&rUÿ շvr#5vf=boX]8꺾g&TZgfVaߧRc$\ {MHo<4#L|/9PxʝKkzf6dkn"<_M;GUΌOŹU) ;]3RR^PoL:+D㏡hA%:.dL,WhVeU.^V)" " " " "pdp,U@ RG܉+2X`R3t0|pOUVv.VTgUQ']UNuU-Ua͔R1Q*rD&ONs A +GF*՛Cye n8RTRy,]ssI5{sszfϞ[ŒQT" " " " " ' o_`mkvζ&~L6X䂂,$Ce˖'xwטjFix~cr10_w3 7]*wc2XB{㺳/d\B $) qP۠OըbkZ Vh[RP[؁^bP( d')!g)gHBBHgk{IywomZNA$@$@$@$@$(jE h41gcX0sVh eۋK^D PIcrݶ/yrEXAezMÃ*ƛo󿎑Ϭ%1.Au3'ŸWo쉎3zho0f[hvY}cK ڿdjbV#)93,ڏ!РHHHHHZ05:V>xocZiyUp[Cg-/CԹ 凡̅ %UVH!>>T87a#aaLVE1mvJ HHNŰa6}sU,Geeg-ɩ)_+կM:u[.TU\\sBr[*!u@$@$@$@$@$@&-ױ{4iVm #qDp# WBwcNn &BzCkr     <:ŷv#%@JÓ C      h&b" vDNAJ$@$@$@$@$@EVk]        V#@Q0 @kZdiHHHHHHHHPj54L$@$@$@$@$@$@$@$Z(jY%       h5Z - ZEvIHHHHHHHZEVCK$@$@$@$@$@$@$@$@EVk]        V#@Q0 @kZdiHHHHHHHHtm54L$Щ =zS'    :(jIbI=/8k3 \~~=%       [HHHHHHHHSv9y       d(j℗w VCV$M$@$@$@$@$@$@$@EVcn&g]]JVdM$@$@$@$@$@$@$@EV'xi]2z≉i%{L+\&IHHHHHHHܺ#VAkNTTƑ:C]Av| VbsŊ8-6&`-bYs`_]8Tu{0@6> Z-4/hiɇWwR*1" ꮡHM/Nb[N1ι~V}rx*ĩuT!h}c@LWY       h:Ҽl!,hi :Sbw`W͖6MzQ?nv$o|79ז:\կ/K{$@$@$@$@$@$@$@EpֳS^Q.i"0UzWHPtYC cIMaW+-Ɏ.O6. HVqcЩf{Ro^7^uԍ׷Tන}dY<#5XrO6\+q߹O/]Z+6ƈq8*e^ߋ&8u%D$@$@$@$@$@$@$q\1%h)>"tGů]Td Xl{ȫ` dS0I\BX#ߜ=k~]U⹥KBwu<_cTm#^_ 51*%[Q[&uX)^̐ t aϧeuSi, N{+jQ <~Eyx"K =*K%}.-{Le"]Z VCUn#vVrOsap䞦`]RXo1#S!P%v4NuB NsO$@$@$@$@$@$@$Ap9L-VRZSNdpTҷ#nW-KS'jQ%.SD|&׎\gӼ?#O7٤|OSpoc(~!      hՌz #Ma|ZVWu]ְX,1Μ5*W!jnsSlJF_^ˤz2WU8VuF=:Mm3;[BV?0CJО\+EUG7 nH>yxo1 t<]f:ޘyD[/XȄ'n֛0o|(wČ:= jD̚vE2,o(Sx,Y`~ǁS"jŒRpR܏#V<^ JfhƒFl 7##+7W`$UؙK5`ʏ,$3N<~r#>Ӹ.=< tjLn{h 8y*R}F -k_xXEUC"7׆UF+!u>.1 ݍIٹR# 9}T]z7{cG[d& poƌŪץėח#Ctn9Uiު\vyREZ1TO 6 qI*>'V[t8x,2UmikVi,pK73" {_3D{k_r!))/C$@$@$@$@$@$@픀h Ȧ{p^Xyتk}M Y4omZf孽uueeFzjrK.؇H|NzunVҷ~֡׷Zo2 89hX\ugoX|}Kng%D$@$@$@$@$@$@$1 7 teܘ#'w1q$@$@$@$@$@$@$@ S+4Cv|kd;9L$@$@$@$@$@$@$TJIAzO Zkdž$Ǥii3;W/;B־: 46[ D%p)^s#{#v.9=)$yk/xK[=c .UHHHHHH.t.bH]pώ5{#pn;~ pH"IW~Y~־* 46[ D"p]rvl-sãmYj\WVF`<>B^k=5/g {p#֯ЗD~Va0;ײ: W ٴyR$ TyiJ@wc2qNEpo_:^ IHHHV\ڔ@Ƶ:ɋW5֖ϹDO^ڬ^ܕ%e1@lYws^wNd,gk=7ݬw"_#n_6OR9OE 6\ 4nkT {kd#@IDATmv4=A5vHHHHZ@;W{km %(⎮@Tg'pC]r׷TEZvgzե`RĵOՈ_Z'ku۲VĨ,+~me޴Z( >.)p im n] V?ѭ25tpuාu^lǰOy(G &{+RyͯaKgc+b-IIcJ7f\ߖ]DGB]|Zhi,;{0*&r}4/ @;#@QMK@xCDhHŧ][<ݿE<^&eT.BcR7]c"{*˨qͺI"xL 7xxI^>-k:.l]>Ak\SdbH݃Y]a[dSMކD\zh{>^[_n)퍱ٓqMg`k~%Mј9S{L,Tܝ(} tN O{ sǶ$@ 2A#E$cne8)DrzdwwʶJD)Fknp_s%:V?ܿȲEw}W.Svb፧_7c1"nSDxHLa)?4 o)cP ۑ+K:Bw97VQ.*{@o F{qExKOm֮+edz2N/A~Q.TOF$mkrOI۽MۯNhUUp`I-=.>%g񆜋2n;V#}8&b)zRy~o<͹-yX'ɋJ!tk> J@P# @sqHQ}h'ZRRdEc>E#=Kx@$@$@$@$pNuNؘH "zNoj,x/2BEMr8K]_P#Vtًb+Rzg3Z_6j.R]oMcQ 2[ 7?&7,9G*>27F ܐf:wK~Iq沺PCTsoLw"nH*Ş ňuD֔c1uPZZsLzdøݍ1FWk%f*۴%?!DC", hp}L1Lm+er혜10Xc rח`cSE}'qu>4s bJ\A zbMQ"w4oœH=N;ͅSpKSf* n WV=Q|}GA*=eu{HvP_NČ2lR7PY)zr NQ, `r?FnGO;fo(CDϹ6h}!9?}b+WEQ9b;1"#5ba oׯMהkOkSYΗaSw{!lii/=Rv{xalkc@ejшkfU‘s6^|3VU(iz3M≠wlچݥqh1ޓmIrMת&R+8mJؿ g0ц m}6sx6׮^ '<"   hI_Z0m A)xd:kϋK P<O3My xLOnWYo ,(CrbQ8*a ?u{_j)L*1z}澴xdܯU"j{_2!a@b˛x}S%wFYj/.t&V"ڌ-D}BO[WX0+񞬴!rkߔn|Wn jX)*+EhQ˺N9<2; 1$vl0}ރnGmR_^HHHH PjiG$H)2jI WsrϋKKm~*m^1ܵ`i]뉝U7X7& ؊cSrnA2l\UDdĆpVrdf V範7v;=ʼu=l^-o{Z,vl\ZX^,ĆbhW ;V"v@-ŐZ{>' U{Hڱ*/-PA-tRIXE {QRTQ8c#5R'k*xm ׌JEM#XlXOVQyj0 z̙-c?pr[{BV_\{P-4ފHHHHEo?l66"h4h G$65jy~x.1I%֯i/-̊!ݵ M/#>Pz]F GDzкq0#Eu1[C$Ovb$@$@$@$@-A FX%iVmՠ~ͳiު\vyR: ˅3ǤJQLˎIIpxNx7҇oHꀦ˯Wexܥ%ꠁc`.'5(,mToՋ4J'~jH2 q{@[UmQkǚ߽0LqUSV[_ܴ]S+\nQm%*wр3|EZj|] bg<{ou~u|pmgiڴRdѽi ? 6"IH h]#eϟ|,9X||qž<"R.&E$ b)uMoqd7w--43MVc= >/4FdK>ϳa5m%$@$@$@$@!Ђ͹<ې @;&}Y&<. 嗾 +`"HHA#Y    (juyIZ::y\9!oi?I;@O:6HHHHZEgJ$@@Ym9^     6'ԙHHHHHHHHH]ծ%       Px ;Ռ)[(6m$̸~`#[ @$" s.*%he5qTO;)jb       h*ZM%&ztʼnSuQ[~zϞE&jV        hZXi-izuŔijD?U{ bĠ[.f3]wݻ]XNן.o@/Rz`\mVIy|!1 @ Pj22 =َںxVR7\(]C盶_ļX1c$]^R$3U~܍z Owח^"xTZ}tn[?C$@$@$@$@$@$@$z|H]Y?Ǿ#߭AyS% R+w`WVmbsZoH5K]X~o%X!v?}xwd$Sj54L$@$@$@$@$@$@Z͘pׇ5H- ʛZ0튾ka$H.;dy.I޸Ciպ2m'Nj֖A>j4 RIULJ0Dx{,}c⥕4g9>0 Ow߶TX[be {`,W<%K1v n Vl>㠶U?"ǚcv       EV3= 'Tyg3NQۜkӳ+rꇗDZ|א .oYTkWCW Xp]fm(KTRkm1cIC7u7ȹ!7C]wV6l]0}\-Mp^G9 jGqVb>U#TsI' u[W&J57]hup17neK;>^|-wybYh%ܜA]%5%KSn0O$@$@$@$@$@$@$ Pj U}js?$4~UK%>C{OzHL"'և4^k;QfH@xr?>X |h؈@wVM*|!b~cmKaMrxIHHHHHHHH @Q7]$^U늏C7M*hL*R}] % KZT'nҀ21I@꣒*Oel^5oJ7HK`[EZTPH,@lNJG吚tbЛ5njۿ>$@$@$@$@$@$@$@Ef̝8׭S$(29_ ,;y@RO!jR!JKƉf~w7_o<7VVtE㔱ɸWD$폾OS(_ߖ툱2[[(Ѕ2       jђ+#iVmsc}p^8m嚷:ԦomXyتo}M׳Y4omZf孽uueeFzj* {`[ I1\4ҲaC{Td"      ԛHHHHHHHHzjbgI# g(r!!92cLjB{J\Ep%$ %/͗3JWʰOQ*wm=J×L,X Lt4 nxEi]sɳvs0l܏]|bh&~>?cUHq(j5k @м|Ixf<:YăP l@ 1\`X~1; *ǔ,ӹv\̞(meۋcY~!82s0stAH݁ɎJ<3g!\d`pRL?Yj o?$ˁY`L3}yЪri ]Kb1x=>2waO#gEp/¶rVQXj؍Ǹfc Z*u=6vYK߆Zx w7fϝ P"΋m^G?*fb,{U:qnjӸdLd}w~z%J*rΓ/?"idŚܥG&K_&K_s a\J1}d3;פA$@$@@ʩ\<+'‰.ҳOgʳ#/ɝU?yd' !Zm&ʋ<}َfN沼J{% zE6ܳPܕ70exېg21UlAgb>d=\Tx:P,$#'9ɺ\nL?8&b~B<[)I5e0mq陲0Qbbi/_"4R1_eڬ؀I(ó L[({b#2[l47({ӶkWNEByn׺x#r/p_n_eUX>,Id=W"GD*/ŇČM"/ e^'̑B'*g.obo_ }җ_Y"l?'r-Zryxv<3Q0 H seҖj_\{7ߺ1៹秆=a>̑@|  IUzϫ-X;Rcor\f)h% WcfV,f|)s&X~f<8-Mg6NauW!YgfdžKd["]gS㵘iZ|di$ ϽiSTv /- q)Mc+P =zW3읭b3䙘:ޤsC HJ?Ja;0{D΢h2!m/TYǿ͒ek9%Wy/]LgagSBTOJ([(sυ$YJh|` UrCL1k< k7'BS:= \x=W=Zh=F-l =Zm? @$<|J\lsDCHm[ /ǬYL)`{P<dW#Uu";{ l6gQÓ21L-M 1C4yXXiW0M.„/U`U 7I &L%ayA– {Z6{e7gE9kWAʕX/ar%ZyRʲmep:aӼ&8*=?9/5KFqXyguEmSefB͆sJfa,۰bD$T2QM|D~ivOvHHHHHCK.iN3iAjA4E$@$@$@$@$@$@$@$p~SpUH-:ݔs$@$@$@$@$@$p^ SHHHHHHHHZEH$@$@$@$@$@$@$@$@E#       h Z"m W"P:Py1        %)D-޺i3 8/G$@$@$@$@$@$p nJ!        h(jE#$@$@$@$@$@$@$@$@ZܔC$@$@$@$@$@$@$@$@PԊFI.n%vAL;A$@$@$@$@$@Z4$y _<j;W^y%:y睨6uw 99 2=D$@$@$@$@ 8WtQq$4MC$@O?G8s&pRR-Zx+ؼy3.lݛ=Xo` ZYY޽χnҥu5>y:U[ް{Ϙ:1jD98vU)0*d|0j7yv9$$$xG:eddd GubWbb?ꅥ&TRaK%hi^<j޾65&}eO6Q c̱Z_Yki1X}gU]Zkk2or>x?r^Yc| F0aKsF3;؅G5GD-W%fDVl2+wҵ/OH_&J_ox&_\Vݠ*\ckLYHH @]}?78kl v glS> F>ֶ•iHSnh Czj=zxRAK%lYyP> yH`QWY>\{?y( *OMۥ:=܏ٟ.ű zSW}h6ABB;`i_-y=Y-1OYo><ʬp +9' KXҁxwoc]'H ^ rlQ$@$@M"pJ@b\OYg1 #dm`o;~L}.ݍ+j'~v\ Uf;-vOjQjyܘ&85!O>ZJ{o,RʹECqX&Z|>{ܟKjW#G6k6~︱Utnaan8Ww<6e2wbkUș:=ݟp4Nb34O{Bb0i ٻ/GtYwŲǘ"<[;Uez)s F^㇜ȳ>;J?wc<0' Bݝx?3{Qxs[㫣 .y6]^(Osb-G Ŀ[8- @8ǎ y*Xzзo_Ԅ--_ r\6)>A;TUJ|\<(rc/+c OE\NOEfu!~6UE6m*c?3E1~(1tTGdS~='#Y'0φ5H]0WxvE/(wcZH.: Ď|CE'؞x}\EǎD J%I/S-»sO.7f@$v"C}yzj_{W߮-1@Ϗ_6J끻ҺD-fa]"c_L=wiZGRZ^iZCnzyVSuȞg)=;P?-BHxwu"=k;NSQ^W'ptuAޞS*<ϝq!~ @'%Q И[-z$YX+~~^dN,?J l*o x Sˋ &N*++wok.65X^Wi=գ^U SǪSo71Em^]Sl9/bYQy=xzinF%2d34UPFM~4@8hz/s xljxK&Gԃ{bk_n}_S.ƁPC=OC)cr}*/NzfRtag"nUXB}(>N>؇pzdɥ.6 /+TrNLaV__v R6x\)gvw /-ŏEA1(߯V}'ׄmw@#8|Dۛ_U"dUbTf0x5>%5)c[kxG7q;je}61[[{r"޳rܓ 4ߟ'wW\K!_loAoY8+{0jeCMÒD:e{0orH&h Z*m 4%KZRA+Kv%[w/xZ~h LW M!Ł$2&rdK}m;< 2 $ϒrb7){ᘑ+o5xh6j18GԋJWy6-kL`Ǒ1:GtVa =ڡW9WDSza'xAea,)*czZ ;F;6'M0aV Ƌ AKƑ1Tk'tØ[.79ZZ7># Q 'i2Kdp:b؈DMĐ,Y9^"Qapɾ0/֎"a.U ƏwaӇS:p2~.슉FAQX?$slO 8 v%dE p1GuQ9]|aۺT^qޥ:駊ZVd

S\u~ B Z2D4geldG7HX&^0!q|E\kƫ +t/%ߐO!>E@qֹWNgΙ ϙ<fw@biIbc$xu,A9j}*wOљm!!}^|w~ZccEԪ%|X+deeTk|M1.'D42(=!mų7 atu}L° b/]-aƦq릎'ewȶz.ܞg+LRVn2y;vcoawafIHPAkaGkJԺYD)M'jP$.7Lx]W 5qoo=]ӣ7$MdZcCk^IH رcQXX* XIN7'I_!dVFMbhqpxVVWR2W4[zՠ3͢_䷖7Ɔ AQWȉD]rP2}l B /;Gz$,1>:Q۾t^z c)d顦}=DQa{JX#j݌b \)?E͋ٺ~wRiq?6>&K0d1GMNaHZ^g0VvvX,%bo}ea(a^O%VvV>wVMIH;s;:+u2n߯ݐ}Y_ls I@DԚ)q˛!+3QVbi8[xs̓@K{i sA$@#ps=g4HHhxWѥKL>=a. Z2Â5kyGVWU}*N59uO1Yi/mÏAK<]^R^.P/v~X5S=x>~ r$c[ȕI9ЭlQPa6.} +h#&9y0"PZzowJt+Yz)7&ݐf.1i;i˛[R0DVĆoDՋX?'\"7HxT~ R|e띂oʼnU.w'J5sڎjCb/9Gh>z[k/CJ,*#"z9E|ʍ*{2|4t|"d^^zso'R##r݇Yb0{Qp@IDAT8|Hc3i_%~"KdA7G~]fagE; \}|P 2v/Ǽom"EfYJ$@$Ђ4֐qغ {B߰&N qiTg'@Q? o}[?7O=_j{,AKk[oE<ZV7%NdxKY%K'"l=֯'gD( $_uo@ǍC 1Kd]YW=`XOd`植Xœ1{LC!T1yɲ6[ 0Rqw,LY.ֽL}](5&>]CÓQ"D>g'^~$^ܭ9 m tY_aj?<}/k̸~XDޚz>",o?YoK[jU, "<67?+k Sb_nڱog^~(Ib *5MwUjEv{Ӳ@2_틬 7W&?iū;G Yi6尉o @ +xsA#5F+}@ ÕٗeChu||J1}i׽[eV>^\y}iު\vI3(Tf"@@1֧k̬W^y[n +p뭷vi;1[䋡!xqX<,A5<04|eT2n_4ғ{Xf?D|\ ѩ볮 }McTXuulշ>ܦ7uN֦eVKQWZ)x_fTP)Zc* irM˃2݇ۂ,gVS&БD== $/?VɃ#P^] )gٴd }T7/8xXm!)t7' ISҘ[]FOH3s=:-@$@$@$@$@$@$@gRQHHHHHHHHZjY        %@Q @#@QM;L$@$@$@$@$@$@$@$@Q @#@QM;L$@$@$@$@$@$@$@$@Q @#@QM;L$@$@$@$@$@$@$@$@Q @#е&h>vOvHHHHHCK.iN3iAZ&M s$@$@$@$@$@$@-O[)- 2zj]j pHV        '@QLgϞŞõ8p`akL@|/; ]7-¶ONa@       (j5ذ8Μ 𣒪'4Bo8c{;"T)       \(j|N/-i452+ t TK9}I8GUm]ݣ+z0Z;or[lW/DZg/cYNxl4&)&k'R /a" W]{}>sp^skZk̡2n D4-=sbt0vX̜9z^Fcc#O گںu@aa"Llc`L 0&~$6}߾{$ M7~$j0k7nbJSqÔmM,t `FG+p @ߪݠ@ϏVS=Ҙ\٠E`׃ ^k֬7ကl޼Z.(..ӧ1dh4⬰-6nmC$ \ ذF.j&y4K둓qDho-bCh{3QOGHG.ɬzF!&D)մWyjq!=AG W]s䔶Nme4W##7iHNY\e1x#>V _$+΁8]$Υ>z!'{\R,{qBtAz5#\ BPkz1r+oC͵5nGD ^ToGq;,>W\=n=\&`kؗI϶.WP4k0V5D~l=ٹU:F+nlt?k[V Eƪ Ͼ4 qxT?|{Q z|Q~Ryק ƒXjt*0=Hn?޲{~(G a ,Y=K 0 ~/Jvd=k&fʕhe]4!h qH{Lp@DnpڡaL$oZ&[\bŋFl}` J:r,IJs=3KH9W4](&O.Kք{x*u.4??lN.iSz,ƅyA(yoW~Md7xaD th7,S]~wgaS#u$R7{#œ$ӹ$[M>n+=3RJ&9b庯;ٸ^W=,ڃqhhgC(á݂-j}j]7x9/Y0mo]Zc( t> kqG1s{3¹"=h3Ƈ#`Ǟۓ@[Kkӣ}I[I2mxm}4%bv~PjmԂֈ#xbkR[e)WZ"-Q 瘟o0↛L4 ZnxeшKKX)&Y㩙8Q X w=܇,D^{HQ'Ϸ~$ 2Dܼ BlũHMc+05Ak`+~YF¤YXqDapJNVImnI7-”$WSM xBRx kkX{aWZ-^yㅇpl9ߤγn:z0+Jjtf0rL_X,ִ^s {h t/#sW}d![ gb~f 6Z57"tbŒ|b3w7vHl<=ܴmOi҇8Y%ػdrgaӹPbΩ }J^ƎR| Tz.r?k)qs1^)BocLa\6b9ifiG [|F{n\T"^M!5j :}\o}ة85vXSiyHC+A>N^:pyl|Rpǜw`VVM? tMtZ,ɺPbVR,&Gk Y55uOҽ 怣e+]<v١O {M)چ4ϒgѽ.mʄ=L R'cL ׮'@0>`כ#)–]w Z/ʖĨbђ˔,!L+ 7uܱa:nOV-Z^Z R k6ZSvBھ XؗG1j1c3H)/ ?G/xi1,Gܜ*ቘ@wȑŅZ.ZpƋ3T7! I҆bn;[2zA≅M9yҴxIКj3.0ێj @]2bqD@IQ9qpw!2)|lk+\ !G&@Ĵ`V%98BƄ KiK6f% Zһmi&q:#т98feh," */T}s<H"Nb_Kv֫u{0>E72u=#D!Q{Ga=]-cf%h]/JI| IК㇅1HɬA irroW}حtv)j:_!C0qW*n^jsON+UvٗDlK]Yt&Py^|[&ąů=P !;H眡Ƨ44~zbB#Aq %0<fe(cKZ&œp:;nmhĄiiYBViӓHjyŃ?  ]B7ri_Fp×?Ta(ugd:Bx;H 0&9z-i -PV)8I=ˡu$J`= kEV$/o} 李\w`PPUJĩ",9N^r6=BBHA&3ILPdY4 gaAj"#! 'A2T6cod2sN~GVSE+e=ڍqWT0%F)gf57rB$nm(ӓ Hy /˱.h"$G_DʣN$) kWɲj3Kq3U.*0\ngscܱ-GJ"s*XR_Pc9T6F@Tor;cGX%ƦsDݚ'EݸԳ^znacY=Il+ 'kC>$Ȋ2iu⠹c#:pY|Xӌ&GNrx GHbj''^f_ʣp{)ca|uLX&,Z3c+_PYK$A+j$ Jp{ u1Uo,jz"V] O: bRCQ~d1jjnB [9'eq!IP/Hzq̋<+$ܽZNΥqzIZeQJDzmp3 nҬŘzeȓWD#[ӗ52c8-*kAFFV1\rvcFq#@7HtsC: a|;EJ &`C2ʚ#,aiRvV>|Z̺c2GbQ8 NYIon]+5Q8d)~YK H% Լs4N<7޺W[azi=r:1Vr]Cl.[:d:a]FFVh:w(G  [h]9C -//amfǸT-9+K}FİIJูtδ. 0& \RUeDr'qJ8I t,â"AM&j/*g+>؏!,=FD-t fwѻ}>2&pk t:8q#J{*TM 99rdmߗE+%@CK -%._%Yrpo cif2@.u]A,01FeTx$1+Vۉ'_בÌ)GF"s[)lv{ӈ ǝn|6K_IVѯ ,K Y1%;O#IZf?-Z/a]ՂD)QQ.^x]TO?-oW-1p"N ZTJhvTҌb9<2"E/3ؖK&all8<Ur^ Ygfj|m)^YLW]/_$ D-ȿ-yk|AN^O$ȓ>uwF>,_$G7yHj\nG@-]3_D食|*SSx783ۑt_F"ُ̧ kbD9@wK $pZK3k c%`ɰrz&~0U0nd{`?ކ 4i>,f)1a[-ӸA/w5Ьr8n%C_Lu.%0oq>:$T^l$h>@DI+Š U2f%<7ĆYXxolĮbixB'!48O!ST徒ƃL [#/O6`JGJ\ %\1Eym7 XR aBBR9huD<<R=egD\7VRyKtFVKymB#bu JYF]dXjeL[#6X\foǬxd..*{\) DJVh)zکh/I^N0IJCv;5Dtڶ]r|qu|LLM7`WF%焗MY*mVYw%Ow:ɩu1X󐰄 65Vci'J Ҙ*,˹Nk&#XG)=N9(hM/u,K[x"UI6=W!4Maj7#uoTD'­ו0g&~8l~%Rsw]]<( Ef~ ,r^1fֻK#cls}YL2W@#kOJp$jH46:E^#Eƺ7bߺµUs=dEpn[ms;i7['yu]Mmi}O?iH 5 k"rodyJpss{r}*~NYu%^,DTe+?%IqR gTIq:\B@N"z] K{?k!KSD+ۛIԺ$מ 0&`L neaDX‰ȒSƳnQƷ[`L 0&`L [eA̓]KӮ˹3&`L 0&`L t*g`L 0&`L 0&еXZ;`L 0&`L 0&@`Q rL 0&`L 0&`]KE˹3&`L 0&`L t*g`L 0&`L 0&еXZ;`L 0&`L 0&@`Q rL 0&`L 0&`]KE˹3&`L 0&`L t*g`L 0&`L 0&е<6{Ν 0ەŋoתs`L 0&  26eϮ"Z=p@%^{L 0&`L 0^AądL 0&`L 0&P`QKML 0&`L 0&`Z0q!`L 0&`L 0&XR`?`L 0&`L 0&@ w0ec۱\oa%6K& 2 0&`L 0&`L S qM5`C~e#f.V>[봀*ɪGH` \9#&`L 0&`L r,j˭ƍ\ks6C.P ꟇuR `L 0&`L 0&\#k,b}-u(.L&MYOey"7u ͸bh?kr7p Jx^ЄATPw|u~[1N"`0켼xNB0&`L 0&z5q}=19.P(=VoE$w ?73BOU ;7IVCx:rlث^%4S۞ѣG}v|whll'puwj$9r/^DHHmn=F텅˗[`L 0&6} k18b3v`Q+O3ۑJn.ؼ3Vaf5< #.ɖa_}s%28'7F1> $B\hD%}+~6]i@z m)P%֛|0YccKEl!#5260 Wƚ5kp,. 7o-^\\ӧOcȐ!h r˖7۶/% \ ذVkNr\s-Pr6i9(!YONf\G~V5c`/=04|kOu1N,a\ Ɔ#ԫ짏6:3jF=g\HZW*+N 9OOi̮4^֓=. \u+׋Ps5{Bmkz1r+oC͵-[ ttpVx~SY}v۲Wf}& déGz`wʤ$_LG}WU؟߈C$p*cYU& ߿VBPP̙??x;m4KZ߰d|bWfDRXh AK8!^ K[)8tŖl.<ؽ<OׁRCbpnB>D]L6N"J_D. <~na>.Q8I!V]&_kS+<݃P_K W;##M!bJMtj"aWH畨B%fC*V5`Cl$K\gkx7#0:ĜVIJVm N6m-SgijE{S{h@hGml?’ٚ{zXcyJ wá?1t[-ܦu^$*:y;k^.vR9ZL]/(+ |=q)y0:=no!ˏ-nܴ}Ö`黂;1)C?x,Ou2 b";iz5|A"Q%3Osοn"ev"x SUduw[.WB<{ww!VGw pZ1Nl?br1^{5iʕ+%:(ĭIDCa%-aKK-wOTֻpdA>^MXtr'Ŋ =ʂVK["Q>T/xղ _5)CfHf~4A. АB^8.YֆRF\~DY  СLF~wF=5BZŀt2ޫ($)⃤0#[M>n+=3R#.J,M{4"KQu{0> h-ECGxCcG[,զSnr^.a<7>4]9naΝTc]ouS W#u=7m(!QK;l;52yAE{3¹"=^ }4yégp=p:&9;g27lew+”KUҥ*l:Ԃ! 76G^GKװ-%GZ2I]T-{/"@4걞-Ѹmt7ph#*|*R]*Y8L]˯7\݄4`u5ek EhoVohh#5b,^11֑#VYc=ޖn2u$hy:DP7C6 Wd(R} AoQE9ysAG# O3NQK1 ؾBݙWArCAo 8} q&W6#%HIbd.ؕG՝1nY[I&ۅHyz H]= xwf®Z r쩿)}:z0+i]kfsޕk`#ki j猋9B&31?kf W:1 bZBf>;;j$6b (- hT (}J>*%Ð? We >MM ^<,];륽aD\~րS젮~Hz؜5t=k&\,g< q|*CPEBk :}\o?8mV]ın1rJC?*_q<2^IT+ŁWlN329^M? tMOt Y:-d]i(j1+),Ѻ'^Zֆqs gZ|vXpjm_ 8:(A|pDzn?tHi]%p sGvSu^iʣ>Ƴ$xYt){@7hn.R1vX)ftэ ˾jh 5xro9U~x~_G^ÕXE >05T6\5.Zza#@ʐ#kYi k'>Gj;_l J拥4k?ɓƥm24RF N]9eB,"Nb_d8Rv֫u{0>E72u=>ODP~Ԟr:fVbORi,-H| IКD.DJf RZY8Gv}حtv)j:_!C!L8fڜa_Ui@h}IlؕER:ŷkB\x_*tIiAj|JCK'89;n9*oӫp'yv2NʣC܇xE*zeb0L8'R,gyv&<9ZH==`6Sϕc!h?j3[i$a9#H<>zk|L_ %qnaJ~UÇtsDf Proqk`גAiCy4`"VE; 5 F/G ס7$!rvL= ZEEEXh'[7RA,᪲/_PKO9q/A8cVIt#(nLB$"h yblz7 xkH"&vW*@(R[I&s/6z,R'yx#i? g 9*V^ yRJMZr:k7Hѿ=/ N;G%HV>K15JOL&$ qC&&ō@IDAT`צXQKLV'r dqIDpn\tt/̫ñzV1cH,vi0JXH—\Mtl)HG?q^)^Q㋏I23vK MO"&gf#5JlW=PNU{gW8 Tr[m•r0/Ȃh+>71uvEԬ?rI N!.2 51 annu9waWձhOޑWg  8E GQw>B#AqSoaۗWtGh{Qx'ܬ4ulI+()O|1:'Ύ[8*T_ N=4N;;.g靕$.cXMr{=Ҳ*`|/S7ǧ'EՂS?/2ިtjC ri_Fp×?Ta(ugd:Bx;H_צۼ˺^83/ Ib7)u9t{׮/Cgt:q$!yyP5(}z-i -Pք iy~ڃzC덢+"ѭ2]zz&ʋ$JKCEblDA"M 6IL0y YAXZ__:AlHIкL1UgA |h`_ԢhJdY˲uԻ-|ƾ77>K_/ (~ь27)G$>:.A06%&ОNu㊳1Ke=ث&ezgpҾ9C(v^Y';&h?Jd-w_9:<4#ф"jf~Dų,}Ohs|T9gvA`eq]Z°2(nBMYFAKlƇ#pLb.WK":89;n9Z--3R=ڄWIu 3Gnjo.m;B_Yi#9} ˾2O[„EP[7caqU *"awz$he_0aCI:~Ft~8ۀ Cgu=g0މ]c1=v|[#50NN2@UuSNa…XzPFv6Yge-EVIY\HR?Sq"Lny˦yӓb*H7L!BAc=K/sMYZy1^,7A&/;fZ/,–| ,9 7FY==Gɗ1"5HoJdyb H7;v!:|_G3)̱oI}eDJ"L#*@w"}TUbG~y*CyLIΓňBgt1EtjAb(/G$dZD⃤E]a֟x1v ^/q:CwOH@@9kcivNYz?||qp %8U*d[ Ai=)N[,/|zi+>B#IZ:TIU"q]yfv4gf%|r,npN Ųjs(DSY)"V9OqPtE4 ,ItcnKih(ŝs_wvsl}(epuN9q,?Cn=惱,Nw4 [~%+CŌ,4a`3wOhijog$d%O}}L,;&1mSQKJ"z] K{?qmbiC6WX/8wɃPdvL@@ ocfd=i1Vq=gŔ)Sz{5f0-oBJ^X7s$^'zXF1C1yKcm#cY$M{)R4vGo$7w/3wۺuuh˞QO:ɫC|(jjN\[;'nVt.J^,Mekq"ILWm^_h zySZs|T>Gǒç1{n]kNA6j{mtZ} .WklH;}P-mA3*3=DåGZ@/|E¶ Ǵ{$f5q Z7GzHy D ¾Z K[?aQʺ_I/~WMSʒb)„^ä8e^WQK! '?n%)ZM$jGk`L <وDvy=\"&1eaDX‰ȒSƳnQƷ[`L 0&nexLW@ ο/ jZ,v-_Ν 0&`L 0&`L P9K&`L 0&`L 0%Vܙ`L 0&`L 0&Z]dL 0&`L 0&Z,ju-_Ν 0&`L 0&`L P9K&`L 0&`L 0%Vܙ`L 0&`L 0&Z]dL 0&`L 0&Z,ju-_Ν 0&`L 0&`L P9K&`L 0&`L 0%ѵsL ܮ.^xV`L 0&m@`Ȑ!A-{vYLJKz-CgL 0&`L W&.$`L 0&`L 0&ZjgL 0&`L 0&X `L 0&`L 0&&`L 0&`L 0&zzaB2&`L 0&`L ~&`L 0&`L 0^AE^qL 0&`L 0&`j,ji 0&`L 0&`LW`QW&.$`L 0&`L 0&ZjgL0 hll1&`L 0&@`Q{yޘ"pQ̝;GN}݇cb̙Rl!fM>AAA(--AnPX 0zEƎ 0&`L Hl,} I6nHj`p-:fL tիWc͚5q&͛7CJ;+..ӧ1dh4X ظض 8r9&Lrs2`;;&j9W2q!4W## F|eJummڣWkq!=AG ثG'A>zHfz9k+Kav`˔uRtz:@녈0nTZF6u+6#2&kؗI϶.W4 r ֖g?6oaL tcժU՜9sgyڴioÒ%K_@]۸Y +,!h '+!b aK8E~g`r֥N6~`s ZWU oLD&=cB,1Jja hMؿ0TkVAr[Tj=8PewSJ杴$9R?crYp_i R;(G1^1vuɦetL 0&!bQz*r oB$pW‚˳Kif*`C^vrJIޫr(ĭJ{Lp@DnpڡaL${ykݛvo%rIVHA,T⃤0®#B,;gϛ4 p _ϧK5X4:jҕH LRKW˻!;@'#>%F<6(DqW6LBZ_6v4Hyw,zj.e!,VO}MxoA7XrӮ`H)爋9dz8`L &+ŵf}x[(@ hB*"밻|#Q3S<4ybx;͐#0mdAL 0oҩ#F`ŖDWCaR.%D[UK` 7w:i<"iF#.; >OGT6@|bWf ZƒV`N TBWWU#6c}38AݙWArCAo 8} q& v]w^ٌ"5&Š# $>JNVImnI7$WSM xBRx kk.X{aWZ- ñS槎El] VR& 53ɢb篥k`;ޛ,.k$6xnPLPpKeppҧ4`ZQ_]2 9\ (Owb0gf+`L@x.JULU;lwv}S*߉CHơx,#:$` XMy 0&]fsւÇz:f"[Bv-hY(KH{ F[-LI ꑯD @"si-+(G yG\Pܪem H¬x^N!+zx<)b #gf7۾ߓjuJz,]n/lu{o- ZEEEXh.Yoσ,X,-&CV-L/5$_1s|PCq1+IäB@:~7&!Bh4~i Q1v6Vo=Pe$HYP+RLsH#jJdŦב|VE"\<43? +<)hԤ%#vo~3xP]rd4)SɂqmBW8ٚ $ML MW69IVSi*IDpn\t4~^8f%#'K]xFK5:-R*u-ΧxFvw*F/>^'u/)4i>:Y3%8aCU!I.xy`Q68\E&[[Zˡb% ԭyn0Ɋ>Z4\-]i#wEZJ\blrpדFNDm7j=Ě0:- ͅ87&Rt"5UYSJU˶^KQr (Uy scܱ-GJ"s*XR_PQ nj(Ȓ WYmo3V1Ƨ#Lݕ7%&<)iSzi` bj''FHVS]Uqg%_'~{ Iz?bM]aKxb,|Z?HDΕKcy-0 dg[fi,.!z WKVZ'. "E%~+z>V] O: bRCQ~d1jJnB [9'eq!)A #DžخH] ܯCTI_DI $˔Vq{h@#u~pY(\Zn6L^wx^Y1/b3iPI"*zSe-2(ފ!:\uMcFq#8AؤFOOba9l9rHf &|EK˨+kjVZ]ƊvV>|Z43iU9:Vj6EKzSVEJMT,=Y_"RRi<Լs4N<7~-KkL 0&S AKtfuvd1s7\hP׿;MUqu#}|쥷b6x{'`tZow\0;EPs`,n/,j^Ǜkz N'NV}D{V嫩`ߗE+%2XZjaK]\K(7^o sSw`#S{ZMc.}ًj_ב[i$>2"%TdNTdݶJ;E{#?N_#UUׄխ:O7_9I}#]>[wvZ_a/ on|i}3|gO_[8IfUC˷\Y^_[_^^ [~U[#\/?~ ?Y?<[[?'w_aZKQ'?X[~?^^~z޻~'VX U95|-o|/SooW_> )Ӗ_9Oe37#ӑ|[zq.X_~K˫&޷ߧ& ?%~/&sra>|+_yw3[^ @ Tz_WX\_;~'_w?_1X%˟ܥ~êOZ+ ݓ//yYB2gߟcxU|'Vޫ+ƪvu}C_ʲNV >P3Mozwz|mm+^?Opˣ\o\\.G?Yg,oI$G>f>zOD rȣg,w럄\,A'/'uM3ZvӯՋO߼ )[|'m&+Y?/`R'_{~:Y?m爟e< O[ǖ/'Xk>gMݿݓ귶>yد-/'~_'YU/z/k_ZӕU)Oy?Zw0߭VCΜ<_ޫ~/cΫbi^C'sX ӛ8Fo9iu%T*>z5&j^VZ+r>I @Ww`?>[$?~oK}'/&֗wq/+/.pZ R @ @oUp~C_H| 3{V7F@B @ @`*If  @ @J@R= @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:ImBa5IDAT̆  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @I-w @ @`:Ĭ  @ @$ @ @$;2&@ @r @ @Ԛl @ @@R @ @N@Rk#a @ @ @ p| ICx^:cj @ @uӯzŷ~\bO!0sG8O @ pr([%ƹLjĶ`bYm @ @ l_5_/Lj}- np& @ @&9|mHjmx]n}՗Y߳ @ @M2vx媓Zcc=xo@ @ p '2\ҿ(rUI+]V|21  @ @sOAp}9Q۪[׿79bH}~ =  @ @wʃNN1 ̭^rv*iv<9Us+6637V]C+>H{^O֬Sz;15 @ p}z(n|$[$VU~{tm?귴>|#sc;sRg^_keU׼ޯ駽UXP*)tR8o&?;>cGց]___{՞\gl^P)B @\_J$w.ƺ'`ʜPܼwߪ~[c=vL1~TIzӞ9Ig=5cc52')^y @ @s Bڽ1(37sꙴ5uvͻHsMjTE9Xbic?T~*fLM @8Fu*?qh~O]sxFcտIl>VrkU|KXz3PUZW^ΛԪM\&jO׵O.EYaN+zJ\R? @ @k'A}S'V^g%ޣǫ]4z,1v~w9&\6cˎOu]^Y#[r@%*UZC  @ @ [@ڽN"^r;T]{ߊem2UR6xWxJW?{V]$WP @ @g $Pu xCcs:{gSzb[K;uIU%jC=! lXW;Z)_ϚFU ~N{뷶j,?uY5 @ pkOv]y1V2~ՉOaR2bK:sۚXXGͯvs@{fkl/g/U_ER>Yɚ@lͫv>TK[UJ9I @=v_1j~bj'vzĪ`5R嘤VdLqsخ+x)uxJbֺx޷[+>DiO @ @ T."%^+~9Jv:.u3;=Wl{YIj'+!kCW3uYP;~pIB%V+뤟zy[ @ @ @کKg*/9Ϋ^^=W%~zW;Z.ԪNmz{Pnj՜=xQ5ڕ^3eXX3VuSz;15 @ p}*Jr},iM"uTV5Jߊe`}ָpmb+eK̫u{;zϫvLūgTo繊vQ%:xW @ @K z|՜ɨz{;j1^#SjJXogNb?ʤV`%tRg,ԉ:cU ?I>֩w2*IrU;zOz%~_o)%C @\#%_9̫vķbY+~og-ocUR_]IMI|^x^f:mSZ'2dW,ZƪN}:g  @ @!B>mWjN_T]Խ]ķgl~s~ާbiW]{{o?FݖEZ$~Tvy~_$J+ujU={> @V[Hj'Z;Tg,Wc9~oƶJc5w/gƟHR @m'u JeV]z52VN z{ɚ{+j,Xݫ뙌y5 @ p*OV]j~2ү:ī㽟\I|k^WxڇK_6U99v<*kU?Ϧ.X]sYw {2+>bү9iW]eO~ @ @N*Po$X'QuzlyYK>ޭX_v|\eZY6Nc=5VW^UNz"WJOX8jN֫9zcկRs'~ @ @Jr )ixWݓP[կx_v.^WJWe{dE\URN%}kJӟ{O]HSI@Im}ԜSvA[n~=ܚWxIxUz4' @ p*ծXiLڙ3L}VJ=W{,:c+^O?릮2֧ӟ1m @ @|D>ubV?ح3 @ @*pVɜ5SvX[{|}:^vIj՛]&)7[dԵɴ5^˜[+ccbX?s>1NLM @\/vŪV;:ފx^Y#uW֪خXWu{:zY'ϓ:suBq%}$gOg KUīg\S깏ԳI\UU:kޮ<5 @ p=*KW;^'~=%~ս]cwc駮yiWݟvOlSNz>ƫdi/{;*V%I^Uډלzg=U楟{udOUg^]Ui硱>O @K CT?CuȜW;ugnjN?s+^*[Sgnrh,syZ7Ѩ7K3zWx)UODxͭ+V5YYc[UϥīN*ɠ @ @U{ǫRsRz;KWԪMn%wum~ 8$knK֫~VUZ>Wmnj @ @z $gOio=Vk􏩓ҮJս5ULڽv/[s"UJyc9[.ȭVjgﯵ{KoUx[uŪ\ @ 0 jjXyKޤӮ:UoکO]U?3x䜭$MϛvA= Yg2Vu'5&2^eQj^UWIόgNE @NlD*xڇey~vK{oZyRz3~V}gzRܡ~KJ걝XIFs[>P*O;uSN]<5 @ @` SjM}h,sz=&|Μ޾_xϼXkcpOe8O,uWu^XOZOgk~JI_M @(CqS$^u}Ng<8~㷭De`k1v_c}>ϼ;W<kfN?ޛ @ @?v^=ɼīߚ[?{&Qu9GM>0ikcb}N~޲eKlvXCc&@ @^Cɛc2oiXUx}l+UW?#k\$֟9}UIu1>glob:퍟56 @ %pLZ/{U|kdz^YҮ%~t=&r~pcZc~7uڵSoxU{,ߋg\M @\OD^XکX3XN;s%~0[]$gRׇc?s&sR>g˘ @ p@O$enq^jz_uKc'nsW9S~~K,^UÏ0t{̜5 @ @F`+3~vxꊧ=KJ{l|~|5>k @ @8ci9}h|oŷ32ۙ[y5ߋgg36>{V<5Zh㡳c*y<C>whMc @ @<{>Yx2'uĶl{eBNVP8{{qc @ @w y{x[R;[Z_}'.gǡCًnw33F @ܝIόQjok=wN&bz-Cc<4XW @ @894ucgx[/WR17[z.>u @ @%pd1Ϗs~;o5+is%oc>\tloֻg'@ @%l=kX?|\Y}U1}֜ˎZXW @ @ZPXY.;^u}?Wx'lg=kЎ{#@ @%pD1ϝ5]dI֜g=fΈwg5  @ @["c9fN>y+t7$vgSslE @ @`&;\Ss[Dn%( @ p L:y @ @KK\: C:c̶]D  @ @ \/3T!͋UJtv<^hś@@"$ ِ R`B!8/)%Ma:;8PVk,rZ<.O\ mp)27Xl8őI h Xb~ $ OvV@F  ~8G NYW n~x CF!!t b8"D"1H"C#@v#/ ,r F!PTG#8t.Gs]A=^Ao=Kt8*N gŹqQd\N[+ƕq\7'x&9R:|~?ߎ= "" E2>qy-B?=H"Z݈a$b:qqqJ&I$ɆM"IRRi; :L%!d\F>@>MN~FQRU2STR*-TڠWEREbAQ)+(zyC[*jLΤ ˩ԋ^':͚HCjh{t:ݜGOKs e;e2WyrruW*J*f**T TT\STUR5W Te.UT=zGuXN%$us`uzs} Ä0V1235,tCCΚ 4{pZZ,L ZGnk}?oIO=YO]ݠ}KS'X'CgN#]L;uN֘53xP=kEz{ 423H7bp`ac(4bxSd3ۙCFzFaF2FF#+PLML N7]lZgzLL`ͬ샹yj&,:tK_j˛VD+w V]֨ jj#a=0chJ;4[<:^;-HvMvNMijo.{8;;thqxhqtDw qZƙ ej6nz7S*;/z<qcfǪ37" M=I'OxךF'+Oipr虂3í}muf/^pÿE'/y^:qr+W]㝮ܮ5wyttO>}A7.dݼrkƭޙs.{^ϻ?`CG=מSAW>y{G_ ҟ=3|VɁ_,SϪWաYC%G߬{ޏ|(q'O??YזofX-F4- M = (u2^c|rx--_j_ fӰY^2DrӜI[}R WȎѯ{z@kx}.&Zh:/Rc iTXtXML:com.adobe.xmp 1205 966 ,@IDATx u[[!$$!$! 8ޒg-Nqdbo덗kg2eƎ 06K6/ҭ^Owu,pvU:uSwB.#d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d2@F #d~: 1{v\vF #d2@F #dNqzNRM d2@F #d2@F pspy@F #d2@F #dDd@rl&>jC%D2@F #d2@F # Cu85TrMxh=O4ߠ2Fxs|e2-#d2@F #d2`Q-,=uyXSKكjҫы2j+@F #d2@F #d^zSietʟUOO8\ &Zz^Xb<-^Sy hd洌@F #d2@F #d?N1`q#tho4ʹ22>ۯ'?.d}7ZH?U [o Ӳd2@F #d2@FV}hU yS>Ҫū-,ӊy;ÚTTMn"]\YH4)Ͳ7Iõ9d2@F #d2@F EAP52"Z'JwCdi),oLOyVFKWFsZ3@F #d2@F # @PV#34t)id2@F #d2@F7oҴZ f>4L]uա<yBKӠh?l]iIK.p1*cG> ^׽j̙/1bĬPWg~L/:4^_-nωq|tk^;?R\͓7Ynwz5~4,`e>2]+/p'*V]7}xsc\smkWE0O#hEx0W2.郕tח|r.>w~yc\s_l6+U2y.?:Å;Q=UsNw| ߼uؾ?>e0َpZ[[l߾7tGS81| /KKiRDŽ?G ^^5^YJ(_i5>ce^{ퟏ3"ejhh RV|bRWWL#4 ]ᱲl,8z/2Usg^|cj̋?Zƻ2fE St㿂VKS)KYǠUsg^<21+bhb?9N_A+ %ԇ18p{-^]>l(4DӴb,^}PW9 *Cَ8a8^7ON8R9e*ơM'?ӦM{ E*[I(E6~J'Lyq9-]h[KyȑoC7ͲIR7ݲMs^|Ã4|By|Ҋq-.}64)0w}9lYc~NiӸYM3}cZ$;?E'~J' jl5MK2#/H\4_Kq샙æf?ܒ>8henZ[W8s?7M+ qǿu)ՓTG<Mc۴Էqẋ<迩wvv&M:/~qHHg+q%@xOvz>$g#,o>+'2nٲMMM3=HQzo 8q4+[&te|i{6 :'4LzGO,:a1υ3byҸ-m'/b:"y OZomZYkY#噏tS߲oiLs>qŶiS030~<1F)i8ԼdMyow#8F%o_ckp3OPj7~1JqL)%oCB4Lzy[Oqn~A'lOu~ߏi1JqL)%kCB4L{SO?}fPD: ^TȓI+Op-qxuQ3(1 e4#p1^'yNï2Uܶm/`"HoS:4jyvďץӰќF48n^Cgt|\]W]Z7w~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ'uMwB7 .˄u%nrť7u~q|,w 8ztyR\d~Ǎ-tR1pZL.]W.-^\Nq. ;N^7 ' o̗r:i8|p\WGHϘ' ʓ.7T ^Ǚ/zqhic•9<(oxVѪxaL'@ᔿPVLҝmea+iq0C>iHp.e໎) Z>ZǬO!|I:c\v+iL}u{˲#eÓ֕TX?i4X7wYv5|.-+r)e໎) :g+W>bVlHI.E LsgK;_UVRP̗ ;-a(@>$#^o͛ofyGx:`;-S:a84yeE?g9$;_jd[@9:V*|1 >OcLC~."G8MB/5i^!Xv~g;i8d\\&Ǽg(R3N\(;|\cgsTq ~.tHw4-? b|1߿2)FaEcltg\㛷XeYiΗ.0."~-S~Qqq.?q߼粣Ky/taXnZGS>=siY?]siZ$&,|y?zzf$ XMCq2wyy eEbYNi<t4?o]|\?c:Hw4-? |s9?z@7ap~:srbbo:lp"?.2zZ.qxp|)Keu*++crMLp,VR*iiTVAw?KNe^7Cˆq |oYN'a!Y'(8ק&nyi,恎C>4iruvM4i+rfiy:;u%Jt|EurZdCy08m.e9/4.x1&e:e;ekRTr]iry7t򡙎_Ls]4O#+4=VB+"Cʳlǹlv-yq,NjF/m7,y- .^r\gO-/3ytb\Y.~ZNw]_wzPe; ?e[%nY e9^L-6zigkYNw𚆰7:\ׇx&nyi\|h\W:ruvJt^wˀ4>0qKo8C3"iG8]Wiz@W]'E?gÏsٖr[BrY{^nYZ]!,M.![^Z/g~@!4N\˷L|.rRʜi-<.ZZ|t|IhE,$# iL7FN#_JK_O~g;l팑浟~mL#ivゖiHii>—h0A3΄ ' gzO]Qĥach=e;k3=-WL'n'%a+cL0OiC&|1iwy:2Hq?E]8@gҰA_cxS\Y|3˄VLO%lYqr+LLKt:W):ax_OTFJK!DLሧ29}Wp>DŹ/vΝ;bOyabt|RWiDŽ !iMs/-;t2heuvvtPb𝧣oc^C>a@ B^;q>"|L >G2눏\9/wkw;͟r͏Fȋs[/Ms(8ѨQ´i¸q"HYO|t )Fe1^q[Cز]󻾎;(y]g|iEyrS9EKeZz\&rݻzzX?ySt;#?iOi)S\׃1}xpcƌ 'OGc}B(c޽}c {Mzѹ|Mww^7)OpZw1/eg&Lp y!]#l3<Ӡ.;fП>!-as_Sېew? yv絉'es>O<m6z9O=br(Dz\ 9x*'A32G#Gs?8<#,uio~n\ǩ3pn}ionnM:5GɖIY<\#6iLQ5m?2]C9NrRt;]ZVy;fY&MDRl/ȴFR[6w}?eu~.uMiqEyrأ#FN;-;6;82pm<֐q37 Y8c7@K WkG?Ӎqi젹#l6=XAA7ae.e_>a9j˪(#:w]H]kiHX5(hu7R"vpIu7neG)yݪ3嫌.M9%R QOYY!Θ.cTਯ7mG:+֫6l˞wּ0j(jJ}`$ V-q= 7n 2͋k8IEC;g6W#گ b9z lFQ!ea|oܸ1.d9'9Bx7|נ(؁փaӦ#؎y͛{VhւO ?i)ZێƬ QiӦjD8gaԘ^۩n9dƌkv 쪂I?e/cXzÜrA'߅l F즦0ykч6w #7h1B:NqA=#F 3q33>6mkQ @R6iXs֏FFHjC5iM/vH=&=f\;׮]7GhxaO ߡhż8{:{4uk^gyfylXk^h֐#5wE]Ij-d [n mmm}zd\RU״Ξ{f1|Nפ=ZnxXXKG`bۍ.qK+xieß{.ԇ￿ol@5y U v>7*ȓZ,h/\8IKÎ'k~gCw7 vzUu"w>r ;pY' w.<:Ue$VBk8zP+- 0EC>ٜO5H'9 z5W':A8%Ra{1=h&!1k\\t-Ļ;EtCDHo<’_qXSX ݔ8N?Q$6m߾=Ɲ5o/5ި?z{M~݆qO'./XhN-z Z#4I֯>@8̘1# 8ǝ5)nLw }oxkjhsYZ y d;o(0-Qe}8pa֐3eeáGct~qkn~f'~OltɨЊC±st; /}SZ'#g.C+uV| +Iۇ0~v웝^feqhXPQ".:>uo[*ׇ?QΙ~Z>PkY#Ԥ`2A^;C|]?R|ǍajpἩa퉭aw'F+%U&1^9n[n%ԍMf 螰maa҄)\nٮ].>C$=|M:,C;&pgM6MmDcZ\1a&&'#jlG>YLXD:풱 ԡWl, a up,Z UI/~ߣN8%]&c X's㈌%5 ~^:'Oatm;d:Z1*bN\6mFҡV6MYQTu+i4agy2[yT5y^cx_idsWu<'fhu@LAT O}zdOY"J'_֜Ј-DŠ+"EF0ְQ!VZ۫.8ybX/{+_o=: ,[}bjP_S>L8>l\:3pZxcllGk??oG{"ś}%_! 5U:N)VȊڹQ ҈։ZgkHC'l6cCn(? s=ȯ{NKqbyG6JgWnuyryDzt J)?zKiCL<Ьq=y<8[V9+ԉ9r$t}:. c':ӡ.Űگ^Wj+ C3ݾé<)4ŽM~{f}hꂅTq(~"B;p;$,/ü%otnX4.<}a̳c][TLٻ;|O׾M=I7^8~N=;9sa|/K9>Nyv FtԘڛμ"vBMkuP6<@aOThXa7JİHnj(*إ4l/qg]*ZGĻ<:|aS#vG $X'Ĩ )BŦ:j;bgT6~ȉÇ N3A>3VFa?!$U܁ԴY~5G,#aWdC̴"|ӎb #5CO(MMbu1~ukUqaHAm2!QyrNwMfMi![)9yŭdeaUnSOrΠxu \X b_[x:6|Ŏ$| `oT(=tP튛>sհ<)6Lп=OzDmCF4%{ R5ШE|ᄑ;[`dXybjP[TuZH7G6k l3/Fpk!BƍƎU9MuJMQ wXCi pB*k GkҡSe;XӿC1ø!M:x`=ڄ ڇv@: Z? #E!G؋膖ES'9_l6&Un}#c~vi;~8vOǿ\e;ߚ٫%/F^7p^!t؟Pa(^L,*״'{`XI*=ΕK4L'CLsǡ]2D(<6Uw}, g\hBX蟦7/w[oݘtdV(h`{^8L\0<+=5Qh Ɵ{W+M aq}#wW+_{aXpƼcKxJZg%~U«^Aj,=hAK+?h\|%h5JGzz?sv̷~cW_#UQ¢-"sH zpxݿ|1\ۿoPt,y-a/q'ًWفŻSOQ+5hc`"AQyIȭUbSHzB6n*QO詃ɒ-n'.Ҋ,,H.<])6`j?dlxQ]Oo+PQD}5&\Nǻaj,cuK=y԰0&bv#'b D[v { K#¬Ma,Z_7Pwj L:%$􈋱/z&<aݶPL[CS 3'ÚT?Dgokr&NF;naX 4Vx}}8E׆~{Ԋm854Wpp2`$ 0Q:ְG_p>o )LmcI+GX/=W=ѤIl*}0WyKF<]f"ɾ@< ,l07) *L]o8VJrhХ!XP,>Y;1I{`Ke=]iC ҝ֥4ak#F= H5;E?iZݻwhؿS6}c6UwsÓ'-?T]h8yRx]mǎXc޿"5`[u ؠ@qGC{[\vѝnY,J^~7hOS&5_sx FE]翢?k\TGc _pBƎv X12~'L)Z=gSk)Z=6D^s .ҚYk"맊 egb#]a”I+?XCa^"laĜ??>9Co1Z?Z?Ob )=Bp^KB+?!pgyGgDx(ײZ_G# ΏUs/9;/rAG^rxE tK?2|zײʕ+W򕱏^GG?"lhrT PJ4N<2ˇ|Ms~n>JpYVC|S>#Lw8j2CǦMƴíO?2,ևu*OGCoi=tk٩,SuXHݳrE:YAVʧIaȖйy]h%y*Zgbnfgw~uꫯ?eNs:'xןRO@ga:x= a&[=c#@2ijx2ܱ*0+UN MS'kiÀj߭ףm|Hk=:*d޶|S#>jk#t&W356 Qy|>>S5UÓ}7jX 6;nǏЪGtqE8?|^Oel9Kaxˈxa<F=5>tqG^O0e)i5ϬOWhiL{ߺ<,9wVgפ54j복Z4c{D_3q)w%Z}u_د_8̰jVM{w_f? Ae_ hR:٧YgSm0nXٜ~lR®aXch;yM2w \/i ks_>%??i6\c)G5ȡ9 Y8E` R;aeեXH'?t-7}s!+"\ysΉBU}k,q:~9(%ވ-Z)evp Nzǖm-ad[kht?C -p 7h-;Y+$r,7N;}DZkqMUD4nXGdrQ7zd^a-;:n9BkPuϚ sd34|.9ݑ3frt_Dq Cnc$7pm7fjbB;8Nmi 窺mv< [wp{tǫ^ vua+.V;uksg4$%"Ey-tN)ܼ]Z9pVB|g$.5zMlcL ؾqg'ѓԯU=aݚ5VÖm?? ʓqkn?O_?t6G ˢwj;<-d5/Z:yzA R'M OH8>}A_}$2U>Da.z%Z<WAViuxƸ0ƀ_mR9DȜ&;dhoj"Vӄ2-eogp@-[nDhN>.ӣ- +z(.QkmkΣ1?{@#V<7`:ґ+o~2lDW_n#?Y>1L ~b_C5inMٳgǾa g88F wB܍kauû\7M{2wi#n0>S:&I<5> pZSgS35tk&BSGnOZ2wΕMټaaьMmkvIW/M>@&[op_?zlG뮻.s]]J'+5D_-ݩ5G'"gi uƺU˾'7-#ŋ,W\[E֣d?dw6OOax25Op=%KqOC5_Bgع3lv=u^oDcͣqGKo)<"n#s" S7x?.>4X+5x}ױO} >O}ߎf$xٳ]bq;t||3&T"DqԨx!~ZN,ivqx3 sĴE'= ;xFHKbzΦsq `N<(BNI:KɊ&ºq\hSt-zy4n1IߤjԓT\#Mtx+D%eRa- z~d9|Dғc- m䈑a葡Yi׎0[~}l]cPk*M&wvoEk' ꣡Ǎ c zRgPK 8FM ƲGOZ0uy$U:H@jQw⁔6=)̼ЩZ&6L<ڳꎢI<]n-Hd2}<.QŬ@SdشB*'>1gCFQ|ŋ O~-!;mƌx׾}a9#'? w^xW=ihБ;ZV_3`|GݨHBx-S{=O ;aJa~Ƀu۷zZDo۾Vi(?htG13nB#tqݲ={h(T#O8g~2a5bYD9s'.;ͅ.;$D%c۱sz[ Mz҄s|+Y߄QDNF 1ۘJ n׫LA1wwŤJ=zWun-4u+* 7&ႏ/L^`-Jh#OVhU6{6T 8'w|i?5ټ㿚+:G|黟1Q~?v3XkY?ި8g3Vs"kp">At53ף{$+^xDȃ('Qm{^?|?ZFGSժVHo߻OzDxAk;5թamIsU>Z˰ŭ.c\ .k_VaߡGKԃcaq!xeرsy!;'TX `U p4 ~C/bbozU rU$ld/ ~q-vyߗϊn@H} x[u A4:=9P郗p4wNTV*5iv߭;N#FUB~鐫^z=2rd@b^qO0+tkM0,V='[&)ç(=ެnmh:~c$ ̞=jk`WIw{`ia6v m֝Vhk}j^ɑe޳(,:{aXpQX@עgEVxj+f:0R\2 O]9#'WuӟG= ^A]WO-lپ+~^b+keŁY\@PW wd:GlZPmÝE:zIƿonpӍ?|ɰ͉vkXy^Ԇ_:5vϬ.,X% 9`m?XWHm0Qfm[I?~XCTl3"63Θ-tEʊ9{[#'U7Un+(JF.w:˞--/n{[ŀ#۪E׆'߱*kMyw+,.z_kcͺuzC*jfX_Cgh,H!𞭧_=6UlIoT݊WH^99!^IVb7([>nTKx3CIo;Z YЁ o]P_^?Ё~[lȈWU-JQe1W 5V]we1^fL g9=`aW[ ̜?7G4?]K. o㗆/H?ҭ'ZXp‹_p酋—㾯PW&oO+F/>l.j?OhعMaJ;/O yYԞo7JkYcEV_).0gNz;0.Cw;2^a7KX1ftUF^.ձӆ4߷{bR*2U-b`;f<#nek]W|C/#]e!yӦVIȞmЩ0Vj~[acs]Tޣ^͎GlMaꔉ«_@h|-W_.Z47_ptakeo>xa>nYaXWicGaj׶]jQW3fa&{s*2EO½82 ynMo=H¨w'kt\bk-rX>lϏ.l=Z5tak8OWˌ?~p׹ORa/.{ixɋ. _}/{?OytNsG;t==G6{8ĶuOs cw0=^t汯g~T۶?p% g/~_x_+Zkq"YOAmҤ ;l|أ9V>pk7T_m_Å8W/ ,ZС.+ 53| qsc֥ׄ1_?3oݶ] ?ۿn':3lOEH~Q/y>R߯íjo_^8,abAL*'yF׀FXdsflX޼a͢H2䫏:yn qN;VY쁢$X70ŋfR']q ˇ*U8½1orL+7}9^ONrEȧ}:vVVh(J?mYnhak6V]hxbry;d6p<98i?ҪӲٸ1M7ezT;哔 7:' & L)o5G'M?%g0vv a}Gکno7Fj)^UyT^6~|n1-!\?lޛ/n}sh.oU2)3c#x#ga{4rwM? m>u櫾NrVë_wLhk 6nݼTzt'="< ?Qzc8T)CwnE_SuXiulh,?B&L'NW;oY1Y;"^GG7l lܯ_\7O@bKW?@aڰ[$~-+]z =}SwcW|Nƿcm_~7*|_0oѬ>^Z۵/|?*|mᶇ?ޚ~ L7O]Gƒ, ;}nOke/~1?Zt=aC嶛il]7ư}V1Fmx*o>>F_3;wdM!OEi^Ok/El>eG9l߯ ׽,4~ת8ʏ,՗PM BY*`|JY#YO)N LUhطjsWƫ$+ G~)9/oo-[7Wvi)WqSBlTCүTm N8o9D6t>'{Ó+oKe_៯ѯ*w3W_nM8?܆ Rw>oTyr٣V}VACocS.C"_q[}A Cx#185>k_e_0A8XeޕV!/y"x ql w র}֨Zr0186yzgoǫ~Z@|<W߷{7i}+]AG6/=_-UOܥrp"(;@>ci>I翴Ӷ;Z|:ְ8a:|?&|maG:<֟|0&Z{+6=eM.GU-C:Ne[0uryMOyi͢A8C#/Ys}7īnˏYv=$>ְaa݇CWaOϟ>OG#/uaK੬Tߴp/~so<`_vXw+?֊kcӦѭٸ"9z}UaOk]O} ǯ {y?t=?]3swD7]ҥޥXpw-U0]+Fkhdڏ ]WPdž/<~@_wgtY7^7lj?_ˆQZKo%{ݺIL {uh{M?;oZGcifpDi +/6Sxe>þnЖXk1-%^Vp;(њ?Hv̓M{R2q_Pد^O{ _94##8' qb'Szp@#\>l1/<[s 8YΠPguHyh|i/ҝ1kRV V(b^g j9Cv=Zޭs@h.4%? ił6}qvxxeg9ho|2gƼuDJk غaۣz=Kkh6*܁力Hx/SrEVu¾`56 tWZc;4'g߼!s]?k÷oab0W'2LlDxg>^ʰ~}~'esp״[lʆ 2a~[X*ܰ;n=m~򳟇w|LDiZLcd0Q|# +X֬z4}>5Z,^uUagh.Md8:/냞:`/G{[]|H>T6o`񝯇=Ԏq#C÷%ztgXI1y4=ƒ!-~gA4~m@co ZQ>ᆛo ZtNxW-/dW]ַǟݖ] 9v*u]1rhᢳ}DV?^~Z$CO~Za] d&(kp2; e[|h~o3gL x~]wo]6O'uZhdžvX# ~8_| c5N8M}o^aɕH}>ra˖⢠n?67ƻY𽃾1z]WK*ŕ>оbm|\4xʸE-ϭ{EG^LyOWZݾiGF;n8v!;6mStdS!\SHgV?Z]V1Θ?Osv|~ceԥim:jXbs)wq@Kd=LyQ颧a +w9" m]>?kzEazm5!˃_^x+?]E$۲iMM !D4AAP@Qi"(TJ`@H{^ܝݻ/o7+Ν;w̙̙g!NVؒWة,ypN@UF$)/|e ([l{3ly ɡw~=(+'PxZ5ƐZ?qdGVi1_S6m; ;wY?r)f+XM^Wr^\]-Le홟>DžL[,\p֬O<5H(KGnus?~KMV5aQ},o$&8ou - f)oiə68HK }u6>o wi\.[grœ\gwb>wO&f>9%9hnGjK 0Xj]cy'#l̊4nyDžOjYZٷKQOY-S캳΀6_.?e KV؝eSgbW`TX{?eQty}qcm6 Cb`tq-0=ބivo_0~_s0s[Rr#YjtSv],{eVYs 78k?I_D8M^ۯ(?֜ .fh>SnQG}bHs}/{?Ǵ +Op%}'5)e InI~zG5V/Ayj/y+!\ BH=H ᣪl|*e܆0zXIIGðPu*GuR_*U^ؘ띚Cg]3]{.ݵÇ{7Zp#z W^ȳPdig!:+Bt4!G] R0t9~m6զZiVnh׶eJ@8zq8[rAIUGimKmۊ7mֱ^k̺];֍;l]MB@ ST!2}_3Xj:w;۴Y+X7U/oz{GmQxJ!  @%gI[t;1v~ֺluL$5֭S ֵ؆ftEqoC!d*a^!oOL9}N~{w,[6y]WlEm#oKys>_C@y1D{lfH1QYưjʩ@RA3s 6lm(- A3ۿz^v#̮7x#e g:]q/ .2l`vhhjQ^x9)ʗjf{`a|iͶtWraF8vS|tWl߭ŧ +`;e1[l 40*6g \f*;z(ѵ7VИ_3mZ1{lJr^j{zn _z>T[4%_gW?}a֩M l0ڹ]Kk`뀼`*֞mI)z;0b= f"?<}6K,Z"0$U&AQơ_sm5ѾQFƕ, ? fi 1j$m@5W-bf stWj]|4Z`أkrp]ݰ#1"/oe<y6K/=vޟO{_Y:8QJMHla;ydKPu4Gڂs䈑,fT{ >⽦dL@Ќn0ѵ( \ʐЍo-6婥]$9TāCW߂XeRc'Y~.PYQ,Xk7v{) O[ػ3lclΣa5SUi/MbKkBF\OC-AY?Qpmx49ʘl 9ΫɐU 9O|y(vYC{p2t?ǿ?cފ߶o{n+svC_q٣QOEM#Gc}{ hECc9Vl8KnЅjZ?X2-<3s"XIF_ݭi6vׇ- lӬg슴5>QKjhs tuO}, :THrx@`n,VKՆ]Z }҅.#m6>|۳e[yzR3Zf$! Tf"Ho(}6. [ymF"+Z^FZn~/R1]2uJViƶ_DBVy߼, ۀ`;vZ%6ߜڴ%˭9;`'NY=Vo ޕ[K]Ԏ u2^4CsEW=ߝhn-R֩/j.x7_] MQ֙ͪfZ5Jع45M0Vx9{PKP+ڷ~z!y50-G!DKJWG͚kk \R O~y=>Z{SX*Ȏ鮼B9p!.~~qn[pq26q"d6íyU@&)yT0#]2|T?p87so xb> ,M;qDwKگrTlf5[ۂ;0hՐ/X FaI,1!.Ye?B(fop }rk;P_q?fY=˟! x$&&WbvyR:"`گڰyÆ 6q$^uZ_cr & ay}N;n+yh gj7NU]ra8/ /0q?/kp0aВ#AK_}8%Q_0bƖp:C|e( ͇i֭<iї)&j5Rfn-vltȮn nMYJWgf d/=s1_nWnڂ)C߾h_~,g_J>/&aZ^jx%]9: zW`0QMsiϲJZj'n(`9G{uvb ߽ `w1J8}'`[{]^xBdDJ g9`R,8ao`*G!d4o|aKY>Vcjb;y6/]l^}r:\axmm_ 9`^(Csz3֛l!E5?~Tnk` xڅ mdH_hJ*KH:ay^%l쫣ZIAW*8` - %bKm&oZ޵wY^Qfc~imLyƷ?09I;XjWbX"F- //(@k()Kb}3;DNa?e\`RC%V=S>y΅R*(Rŗ!β[Qߴ^~ǎ;~:wiv?/~~NmD".|we8/OS`f۶p$ alh;L>ygRzt?':n=:iw%CkY90EkB)2d4[ H$ ˡ]m7n&9y:F;r%nGv:wdhQg?/]VbEm^v+)9= Ap wgLll_6WֵoXBΑ|(=~V>}AAN#:޻zY-12f0JȥgYzG4ӡo뙖%K$>dgR/Ͽr꧲#N3w0ɥ/O%X[Lnϣwdܹ3TAx ZU-kab袞8zy*A`ߞl`l{xVbzuܫ\SI:fD2 :Y;:J£j~``@Y,WYKJ ٍiok}L`e )XPa~k8 R2#Q_yQ~뷟Jڽ{;bg?佃;*nMґZw {ͨ7:gaGAw+Ae7[9ay-"MWeiW>aGN/gUW~[lO?;M77{ٶr*Be:GGÇ )~& pNN;%-rcɨJAH4/20)22ln14JcTcpymw K.e\upRN \S?Ѩ _tX^T@Jy /K򅆀%0fV##y4##M}o-Z8ߎ34Φ?J &SA_U-2+mX?xDZP4/I'm/-M7ߟc?Dr ՒbXw-vۄclb? >\oc֗1(*,ZFM})CO*Km+Y;S왧&Fa EOC? ɫvՊДjht |$/nRcmCޅ&%%~m g3j::^-|:O䋾pcNdZW}=7q#ZT 8"XhF`DwBqܿfz;KS>ka>ڝK$(pz4zAܱ"& _˳-b, ʲ[inYnO Z=CR >~=c7t{eɹvWJ[kOy~A YcqX1Le<?-_H?xppH<,n -?1bعݺY*x;yx$HL݅Uv9vË]Z8/X1.\46Sl]u؅JdgD--w+9|p(V_XfϜk׬F0*VT*95_4_lBGn;vo__ªGuɿ{KLJ^]z1o}˳;d:h(zŽǸ4/XyNPv_>)^B5FkH'8zR l'm_sNvK ~ߓb<!}{ː9Nп6Y6O&m]L5R f-j'!CMh|ygݹkeOU\XKƣ?WJB-3 j҇7ZرcG{7\4#e+#<{'ؗ;';(* &4yx[lPSD-O}ɐE[R.C&Q?[DEsr^ݐ}+{˖M7A aӊQonp0~ZVX\%OUq"MQ^ hedA%$!Ke8pT;Z?MnN^oWtʶo WG5\E:Ā(]k}qfgsFz_#ܸ߉Jgk$,*Lpo';]h3 T}*%Qs,diE3'|?-N\{,5K Ɣ,ڿl2[d[W4tH[J5kAQMˣ#Z++J,`$4@IOEgt+<Ϯ['/Xr:M iV./o=ڳKcB(̪s HsHYoUj=4۹c֌5""DE%t't&.R^aC]Lx%ʈLI-2'/Kwbl࿄zOj`tJ[Koη9Õx@Izi F(}st~C|mJ:Fym۱^+F~5jr<5#^P>\%5kVh/G혨X24 n;I  ៛M噖#>r7=Wn{v`_mwE =Xc r_H+EKoZbX-}ܸ[ڵi/֌0ǔdm1ʁC%*'P"xlc#v3c/9j<`RYh_qy۹6ůE=0:֖\z{kG`CL0ed ]%/:,A^=! Y3h |6iKVp?}T@m"NOZip23 Zq9u@+:xb)Vuj~>l_Ro6~GbDiɑٶe tt 4{$ۺ:n1(jǿhJk[Q*ɳ͝ff?␅dގ=^]=IƁ+B:'c`xfuðG[<O(Eo@aIi@Adh__ОCG[oA)1kkO>e_^O_G8N_ZD҄f 5D-ey4>GG{M9QvKď.4SyCx _kG!9<Db`nZx*-<ggrK ek^ݱO<-m[1^"p=R|9?+k=~g哺҇pixoF?"__ 9cQo(a*#'0~Q/9;W/m*.)]OҲr;+޸yzXnٖݺe[8KnLѬ=$C`ܔ%\ޗ6 r)Ѻu+ # "/)%ҧ m]gQ ,έ`XcB &q1VhY Mjp+p8{Mj Djդz_}>zS#4@N _Wg4]|A(4^g"ܧZe)_AWi26|ס+GLLoas_7>]۷)|R:LRYޗ2H&Pc w=*ClkS6G{megve=kq'UId0r@3pAS1r[/)'=yv q}\oSЫ}錳!*ЉۇyB q=XV~puδvmA= J>U\Pb)xk% LD1K6, +֙8q{],\Z b;GeZ g;*FV־M{+^b@0p#" JZk OhjvTv-۝`w>7 &y@?7mm837k+(EXE.Ks"}o&n|v ̍]0 hV vvZr =Q2X:cnuēk:Fsp_W/)WQt<憎.h'0PWH] '4wsڎQ+zg?Qהk,گ  |I 3\ey-ݗkwxwF2TjJJIUW -kq4V̸ڹ'? _4S%jތ%1ʨfdPtρ?\6vQFu)և3wA+]-In0)^_~s=pWP|x{ӬE:]zwV,z xF݈ݝ*;2<*#>[0~-*$%&s!rB0*򮓇D%tIp>Qqny{={0ΑO<\L-ԡ1͓=NO2 Q8ixqߓZZW}ɐҙl2uP.钏 =¸w2G' hfU.^scֳjKJv@٥՚}8⻒8Ef3L{=r v"^([+_n/wˆb|:ͤ]3϶?B/(z4rs! Xθ7qSkي"iǕ%gıE%&v A:/3Rt)?m2:okP=y)gumcԎpM GK)yQq#1< HejXsu!`I|+72_nXr1Pc 4pR:7vٻz0"? xߞ##Ӻtf+pF׵Fڳ3r6p֔]LEP|:ӿ@S;>_bt89Yأl&敖 h{.>V60^.1n#gx'Z_. t<^v)_01lG2&ZIl )o601yCZIuwuVz8N 3mڴG ?Fأ:ֽyddV:+ C4VgzGg_Ἶ}GyϯTY//G)BNP[r!t_+@.%(غu+.3ԭwe֬qe_Mì4h ؤ4UV_(DJYQn$JIB, АOSAmZij&6Hj A<)f%P7䐊4~)GۼctAh=DJ}xplC۪5kWf]bdQ>[/ZfeZ%w+0Fסʊ;|fۡ 0 J 7>V归c+UP''y|n5މl ~fUnn<4#%}'Woa=w`xK6iv~v۳aZ|'z(:`l_7m6Nn{kpw7K&F 0.͐(RI9ڱ`۸ct h{ꟛ0rxܝw|'t3Ե?G_omGU5#Kje۟KP76 "^@mИι]-~D~u-[h=諶jFG_V *#!*SO8<|5kI neI-[yS݈Vֱ3yeѸ0$# w JAez~&pFlޅTR{r'&MPhql`Z_ >c rRY6x|+6t'Dad 43_~t{|@C;Z^T{hQtP"|͒R[~eodnƒ6:QyIm˖m`Bnxɣf\8?6vZL{878ENp`LƐ$?i m0E_鿛vrfW^xvCKQݛJv:.(βCZ+o_f?[gH5h4 J$^ג$d2/i\DzD| eM$hQmٲhTw˔p/Zv/lc#@Vq؍_ObbKS1Ғ52egC7R%?l%Za4[4Fk忆ƿ`tx;6mN#oA.CͣP"//f#Iy^++ kkBkdHN%H!BWh5gDLOQ^wkAXZ.H't]r n9bmF..q&7y76u{Y$bF9+cb<~mFR'sShٷIxp?p 'W .f}g^G?wg+bڀqV ap &G5ickeX>aqJ_m^:d(Kbi r,\('PMWÌFw6yS7 [W-{9]h֥KZ\x:Hu$_ŧQ?jȣJ9}~yUzIt(]5xG(PzYk?g_kP Q!$Î!?77T)]ϽqH+HiСo물>{+ݧxS^*ק>< L^A>w_dḚA7Q2X+\WݮIӬBO]]t)f uζx6_p !(e@j3K,4JClJD$(OW7%͸*,l _s %; JDucz?OAU,2F`V^TB(o,ҵ?\͜ 4oF12\?zϗtC|ݫ,۠{\Sd͔Q\`v"QIr,gfƪ؆fFk[vujkMzwJ<#vO:n(З$ pWۇ+Pq;_A]'(/6Hъc;=XL ;%cF)D͗icXh׮X<( (S;| }>7.m'c(ε#7hu͋Q[>8O .~I"nlޮ B Ƽ/ơ^Zڷ غ Dufv[dY\l][ [YvA?૿-q;ߔ_.IDoN{pd^L*{k~Td`eFڄY% a <`t \*a7eK$.yAfsFKϼBG՟zz'{i?hF}'};AO1L!HlX4][UB"InggNu] j`lRY('Cg#A+% 7Kjo{ݚ= ?)#Wv魖͎2bXLu(GO|T*X2$q vz,'Z`LBjZ6ȵ<*ܮD&Th:%h KKf %%Fege&-- ^f5%5e7'(c@'bftZ\B.2)CcMk4eBYf4<muY`kmdOc?3udwng9UpOء/j8>_ 4CV۳{1eT6(Զ5Gư'Ok»ZYk;cc,۳o7c-Kyx]cOP=oG׉#{wv5EҿQFӐۊ] 3YƫThߔ7i~v?ރSBmPd+5\6t?HC=sͻirS?boW_2ڤ ۩֭#N" 1ӊdEƤx}%z\ INA*3.6(YF2ޗKޟjB~.i|6DpV}p|uvC gYڗ-?k\E\Z8o仺V{ BB2C#R^ xdʧk=STBZ4HI*O^ eRJϾ<}9>F=J =Sۥ{=ӽ7>Qk ˘Mdy.ҝV̟ 3h {w #l3}DzXƘOU63+Q'ECrD*8*ء Tn`{Z jAM8R19?_g1a/O-JS|9O??R_)F-m6w\KKO0m//_B|3b uf)CzVBеף}^1''G'>M:t|J_>uNyu8]ךiV~Qp*DaG:g|9B0=|~/-G<&*z25`yko{oCwtxx/(`WMqcILvx1d$(rpB(+C̉AKQ@Uqu_X3JSb`jk%:2PJ w}2:wzfy=R\+BAw?KǦx߲ x(=_MiS?-5fLFlRLH)?E H'f=K^%vbiS2b@GE8NqM<n:Ő3K\徯Ь$,@jh+_X@$cX09 :8Yny uLa Rr-ELtO4]7y8%E߄0 (DJ^sę\KEj( @hjaX/zEڵ3˚|XE/5m*X?q \R3LxKcT<2s8o2fXSR3a$uoJz͘6Ӳ!#<"ӴG2?~J)OGɵ ~M2Y ΔwȐlҡ^ ֭?/[N0OS;v~FHI[?4iw~~Se[|{?`WKpZd^gw{PǗN>_VpZZu#}^<| 6B:nt@(佢LH&ա#O,z!UrtUGbϿ=Oi׻>^{_o4 2rƍlw}+˘"QIC {W^b E+jTmySE܃5"ÓvR)'n7 IP1JHy.ORš2`"s+Aŗ K  W5ߖm!vKFd|}ij* 2VUBœ41Bq!LF4x19R!F\Y/V¨ѕcְ&xMO@IDAT6@Bw+%mFf*($ڢ% n elh;*O~vZf(}6WeX2.#h|lCo|B po[^tZ0Ղ]5\Β."D^=o_^:nN]xg)ZoW, O?:K[Kg>OoWFxL ~zS<-d!M?MC8t?i?uDtL?߇=iGTCFskgP=??j>Mgk=̿GwcG 1 @ hK|<ѽ0*N# q0ga`7ÁEQ>$b$N;$J< 2iNgRnYo衤"-S$o"JŐq ULJMbm%2 CB%UaJ2١܎|-7%4%Kf/Q/K0Q#E¨KP׮^kW,l\;bA bA &\~-?覟qsdI OY:;J s>Mg(Oa<>|u^JV#2Bޟ_:}p~Y‚;GSH__HwNW6='r=x_T'Cy.,$ӷk'èS=%.ImwֳR uٵ4swR(BrLYI#Qcxk1zTCg7]L"ӉVVZf% =<³0ZV$QDQWO"m*-z BkFjIĴRy-ӓS Gb* -` >:Sym̽<x􊇉aH |ʵ?T!^WƼ hH}7^%`$6u bM F12-i@Pb00b0!ğNp>?5-HտkԒgҽOY3suD+߇ϺwZ<4]92?釜 @~%i< Z,>ý{hm-vҎ?U̵ U\+) %EBB';@y(- /v3iv@4+hf)CutJ \prXx }Ki'?'-ŀR[%X(NfᵓTT[W f\ʮ1bxk1zَzM9\ ~"Qd_#M|M!l7hɡQxx]qXUkpٍk,0Q&URzI^R0-7Q:F9( Zj良Q7qJOv|-v_&DV&Vw%I[5fDbd/V7#xiqix?111}-z?~O NudgG~ =Y? 2FaJ* ;{$#,@%AFҏ#A2pIGw1Z`Ջw]pZUyÉ2],28!)!J"(ΐnvn;|r/eDg)R!{vJmVAi;e%&J>A݁ߋ(ZUhvx?rKL>G12>i{_ /~:?GEWpAJ]y =F~4%s8OkY:tֵdzk9ާY{}wyk%IZPUGc1hV[Sɭ;V%f+j5A-Q1iI[M*<6VhVh[V TI N*W'_%a..fDDŒw<4SN1N=&+uha%w_E08Cߓ csX9/0 b5kZJr`X+ݮAwQ7 `D5v閨`xTah'v% `D=U7=j ;&Qޯ]@ F%Fr=#OVmX^zDo2 :oeTɸ;kOQ}xh'/UJy\K="bxk1z$ٰ_|,%6&䣘| UHB_=#P!TI!&JKF#u?]Ģɇ>7 @|JS^ֵtSY?7v2@inD;K|{e{7|{A6x(  QSjgR*-իIfҧdnL΋ l ec.xv aq>2x]*\gX~Q)c!\rsNc]ѲDE~ހv"`WJdAާk`ՏP 윷ߖ'J=0*.lݦ-VYVBɁ;hc.خp#L=eY̵O<=T`SrsPbh(Ying->|rKYM ~/xA;l>2l-5T:C'> jخ@'܊f@bx$k1z1 bQLG1(&EYvvзЬbz3l"JPZ8tȡrC 8 Qpul,t ~_4XRx[ 6Zn'O)rr"ŀʋ (0!QJ^C <+,NP-|?ѣC>ʡ+7jΤI?Je=  V\F%侭X|I孥`QI?6z'bPY\+bTAWLǂ(a&wu粜۔6J-{kR~F#v.hpl02BjLknnlECj:eܡc0!тV3 bdTP7x^z_Xf 222柜ϸs~0~< < ^xKj]/ӱ8cnN;{﹗b^ssNTAf,BUMx0VԶ3LϭՐOp|טnc5TڵT:TV6X?|v,]L*T< ?ŗ85NddW}mE\sO|b ˿S P,k zq 4o:d&h9(ƍY.U˧(?yؗrey!' ˄7OBUftOG)9w[&5)Pe6M:N tĞw|W&cX|9Zn-[:wB,^8;g`ϯsǜ/? [Q3bևuc0i߾}xgk0~[><^r C= %y\{%Kw;wZI#!bm/vn/ڠ}%"VEaa1\x6u\F@K;vDg7JԲF)ry;ƍ Z4{<:5{_2-(v_^gt:{ mT߼߅02cKߍ\2X7\j{E-zDxO ?uۺmI &P*eb :ziA_aᢅr,*\pʾYko>* jl ܈AM] $O#8uU>eh CwM@Re-{^6pտĄACw[`=Go/^:n~ sCЏr2{ę|Po|$x.0Qtfx{A < .cKA0W$ *Cn⎋W3$g.s&Pdr\%C?|%9r=9MW?V1!9k(i(vXE54(SsmEDw- C&hiBciyݮ(*ރΝ;bS}O8MXj.駵ikccu1(>Q3q)TcE{ZhoR|NkVZ))Y8[EyM*um#dNFJ?TZm= .nГ&ևHC[_y,z,(xp* =!߄zeJ8`>z|>PC+Ɗ[t@]q~tݠmy.ZN)Æ:밡q>H{İSK@D@D@D@D@D`? |eу5q СC8c${!re9G k'L6f<_׼Oq.H1uƋp}&x&p52 [| ΁mrjZE?YxؼWΝ2WRJ!?P\-"E[^t0.q6<F*^ 5 >⍥p IDn+m ƪիЕ- zpe&hQ񴠵S ?kRX<)3qCfnfǂ^0U,V WKKaZ׏ebs^TPp@NQ@W/XgHĺx횘6L|3%*L.Zڵs=L`/#S}~a-%G^n\izFv_VBŐ}ԗ_Z ~+"Y\J%c`ު]5پj9򼕹1`ݘOר[ v~ǧƎbl?8'/_kK }2ήOboS p':TGKH;Y}fWhGY,2 Cԫ^ ṏbK(b=)N=`wKq\BDK9?)~/0 waAx Q8vDze_܈n_zF+&СCq뭷ornܸT>4Yh!7ﯚVƛ*f@ċC y"g{Sz4 w_Iž6*@e{31{QXP]Y\fBUݖ_X=p^߼?zꜿPܤ Ht.zLOuA =܇w&=t8XT\ްb_qkbc<Lm&d^bL(>(W\1*hǮa \Db{hjXf1hQe^fѵnZ~Ca!X"*11IZ㘎mܱcl߶W8K kc쵏=S.0Y_ e6g_ŊspBt˦쇩3\%͝ҭvne{3A>׫+96'%',x3~ӻw~0~t Ɵ\OHĮOD'݈~.e_#k}R@(;K[€eabp*N){'a]^csO׀ߎߙ9P0e[w o*ķ /LW[r1'kYQ WH jvظ5/ ՙ.MQsz-]]BKGtOE[ 7|BTn.y24W'VצWiCw~6c,Toa6>I(Wӱa"1WW3vA*Z 柜8umls :#G+z-Yjٶ ۴:rxn/A?s_߼2;XMj8Ń_ sݜ3uyX2_9t@ j#Hyۺ':bc*zR Ҙ)ؘ &韬XI n5J1|,Q7$Zh1LBvQ2K*[;R)g8ZcPh|l }ҎuTE tHIA>W}]~Wxd<+gM26o|죈f}cq9ŎJ.6lYN)(B]O HS7?_~I`k~6=W7~OA ~3wU2Nl*<)UvN׿F>f%WeڙxFn ]i?Q:-%ǟK'o1'qĭ' [SH~eEx7Zs邟[6yd1?3_nh틟cPZtyOE]$ނXG,ĵы^~(F~r]v׼J8X犕`blƉ{x iLD@D@D@D@D@ ߟW_}k׮pw<~).d<,3$c|Ɪ3͢iÐQ |RwnCs(kƌTcO(*Lͱ97]@KcN#cn4Lԝo?>hʄ6r!L2mٹ VZ͇ͺ̘IdQP1KdR+'8==tλ$<0{a'֛4{Cv}6?43J=pZ; aP0x7P8LǃfCe(ܚa)?bPXHNlB!^ggl8l/<=w R;uF35o?_-΁&j܂+a b938A+x"YYFrcyT ;tJ΋Os/}o wJQ" " " " "p w=xYp%^g7 ˳QBc(D-Ĺo=~ dsڠmFF86x;@`Q7yUq/8:tޏ _۟9*^h,6ZpcE3HBԲUM1)bκUdb)'] W3H|Ė|aJ0dZ0]FE|Rg 9~mE-a>`XL.jeYܩgYi]#{(Mą[:R?УGwy.q26ɺkF{l:os`kAPLyeurnmZE9_L1λ^4 |~ $$fLNlp{< 9qY݇}\aLza9/0њC2cO&Pj8)P4m֖U~:򴳌2qj)8qs3=E(d\={B1`=()4WG>=v532D! gE[ZVh9U - i%R\[0 R ۇ6풐FE,8 ^c -z6|0ko7_Ow1̝rKj,Ȫoۊ_7 7N[(/{n0aq܁8e|2VonJ&YZu}\FH4zv?[T !^[ 1eYbs20x@7,RB㪾yDK9f1J \n O3Ea$U]Z'9}]e)\}q Ac-h4XԄQʧu ۶ƞ}EHJNBi\JKbXx3<-h5 _.jO.]͒,KWBw~Y 80 8>c:}7>Z}73W|VZD: o̼oXrRC CN}0:kՖZnZK5:­SGx/S$܅%O R ?I8Vm/!"R,Y y_Zwm;#(`u*xEƓ +[mϧ$SP "(Џ+sWr׬B;׼[!WJѧ )_ƟtOlE9'LK.'PM,l@vdϾm":Q2åX>bc=T4}Vz$HSo♷W`K}fg/0p5Pn~7_^?ޝX\OJΈR+V;#],҃jeu^?͂~Ӛջ~}]'0@okT] )hmp=Y}K3 r;/;^t>>w >d...x572 脁DNp?gzFa,ȹЙcrgpbͧ]tq&?6BLLi+'BCg\460M/UMұ1m+W)0W msMk޽{'ڧt@iIڵ>vMC)t+rYZَ LLn//<TK&M¶(ѷw_׿OzD(Vt6R;Tb;k2m.2\:}9т>Qhr#t.4/p*"u*k-gTs> 2F-y\-ф4ckxx~>>(|Ѧ,E8Jm?e;q! #K ]t=\;aNz ^ً7aPSzhoF\ zbmS֟v#i7 ~]>̂*PjQHQן]+Z=]ڿ8kOa%U- ඞV*ozlA۷|&C_w^Č_:1bm8>˯8Xf駟/wMpɒ%xs+&Ln:t(EG;uZң y)l t߸ex\% EO?m`9^z{>~s cswܴ"]0tbuqEL,`$eW#J╹bJ,pւn ҉*#3۲`,Mk 6Ytd~p5#<+ѶmH+a}2$ZGÓ(qLFr%صkZrUs|l-qLrDu':VXF->P@j5$B{9ئQ_;iC]4u+[BV>jqNx} \a4 N#K5~_hf/c6-$" " " " "pDdgg㭷_OO}={6rsñ^C6O/GΝk8_u+wbI}QywލIi f––1C4XiIeA?~GQ|P OU}~EwM~Ə՘aHΜ۶Y~cyYm-R64i^W"t%?+,MbmO2A*MXt"wx9znSm0Fӕx"p]I,5c9ag[LWLYgOy3 5nݺa)#S5gcDF\=qhgmԲ/߆QoODk .ԭ"DW׌c;EY_VC XO[Oڴ0S#3'qxĬ7q\RU+ b uߢv1&ſ·vQE@D@D@D@D j |n_|v~#Gz8,^8" 709Nϼ޻w Zloހv=OBE0qnZw 1V $Nݝv<$kYhb.f1#9$CP -ߚ%X~q0϶u}^6|ߔ9 ˜qS JG3ɊEϬh+Ň#JiBhU,LaX',A2W;iU&2ev2 FTSnY937X] V^M-2gASh-E\+̶-ȼ_e_Ps3,g'L/5k-6`.. ]+Y\/CSظiZjTӜW,+: TV3^s9l |JhŴlG8_/~s=0nug#{G N 2i=,?c<16|EgCǙ*||ͻP0EɺkeVHz, Ws62匋ex~k4"*Nq,cY$ .i~&yvl̀#/o]c"`u-N&mKRc̋m5M +P Gq<M]s\t& \ob.ƘO߬*NLbƙ$͸hZIqyfg/-*g heV[40nV=>;<)9R2J"U$286䌝sdEpw_;.k~͵s&6?MIQe D7,l@ea5aɬX,cG&jY<9- Ƶ_>&KPdU[%ccx{XkxkR,-Kx6l4z(`Ŕf9_>oZ8N󥵶 <ֺf˜12F"D@D@D@D@D@D@D` ؼ V<4ﯚ/˦X>`{}4ʤ*(@TbLqfZ^^jE((U Rt+w~54Y|qUxS> g觢dќ+b*uǀB" X,++# lC2+}?9 0Y3aq4blxL e۰qۙdT1%i\ǰmvβ*"D@IDATX̻)hnBrd X0м(H\f!j9$sxe1+(S 2*-ʩbɜՔ RlŲb~9e*Ŭ8RĬr̽n. D&є+*OV[飥U,#?-M-}9X@b-(eRQz gos@fqeilˬ*(ReucB],Ü PpXmFty}H퐊۶bݗ]L(UP3gdcκN|#1vBH/Yg鱏fYfc1Fd; s $9T32Xwbx.֖5F|x(B.Y\A9*#gル>~wA~{xm{qbHZ;[Gmw6aw^~}!7\u}uH ˚A $¢p`_1NLpnwTbG!"qQ0`RpB8b`z,й +3qÂɛ٣0GCft 4CjP9b!b s 27H\w,'RQyL CE&,T/8s%0n͏2.a|5 e"fCĨ<އ}%~tHc;wf?7>6(+ML2F5z$L{kbZAW7͹cUnش1|;ɶ2&9l-X{l7pvl˸[U,LsClʰO踵5+Y/cc3C 9rz}lpQGRg55_K{95D{j߂KsEBYq9,Fn疧Mเ.tU?/)BX8jEN-6IV5d䬝LVF2k!uNF6+ZLPe)6pyJi9E|$Mh|?Uiu&Śi]Zffi<2((Ld2ֳL>[Tߜ`eYy(Hцۢ92x k/&!95knrl,,n#1swMG5GHClE4_Ӝ6zQ.5 K/^j" " " " " " " "l4 Q_l67T@Y61@s" Q9mUD@D@D@D@D@D@D@D(4'XE@D@D@D@D@D@D@D JHԊa@s" Q9mUD@D@D@D@D@D@D@D(4'qi@%бcG?Dzz::u|AhG-m۶!''>,o~hDN" " " " " "  Z=v֭[EZjX@=зo_x≸[$l5RVtZD@D@D@D@D@D+ѭ[7gxh:+" " " " " "`V0fFmٲ5>Kj$hbbb 4fA@ID@D@D@D@D@D@D@D@"4DqR)Df+" " " " " " " " # QqR '[oŭ7\݃6H떆6 Bj_D@D@D@D@D@D@D@@788ws.h8zA/lgZYxE@D@D@D@D@Dؑ9bwֿw g#O0ۻN@ַ~ .)v(NxW*)ԆD>sj_lڴ+ɣz?R{s޲ O>RuD# Q[/uXSBDbP9Ք:q ^V0^0i1  8cF\ֈc{%%ؼfjlq*W& &a0g'$vcK|%ضf1:О'.}qƌ.}f-:F_aݿ\/bÐ6 moۈsO+@m Z-: OGMao`Sb|>7 h[.)GZ ݋Ķ)0{ea3jk`>iHzz&W [ξr]2pA@VAنzLV][E!1-%^;:pH=faT/zf1+μrsDb\kttI8cqU`~qC ڲށ6uȂ<- O?2Oh+" " " " " QFtn72Jè3x E{zo濾 ];EQ˥XZ],]Y a2αz`ʕcbZ [VZ3.mL"8yE8[Hk#J@VCwQ&e(Q~rz%&bԄXD& 0Rں5=b|e5f ?@X5zŦ-[xZ>/"n{LZwn/s.FЩ=vM9MLVm׮[idxlh'J\Fшk'ebc~hm VT ZvsѯO,'Jвoۢ_[/J,*_^AWu!$uB'.W56#`UŊ:>[+mE?WVLH%W¯M Z5Rsf,X 0 -( c"d.6C~\@g(HC%NwޏpF;g ܔ{ VR\ C"{  腴Զ] d~Vg#S@'U,mBrroxfG fm%#hv)#{\v,ZtFiX:;lAzZЩЂXj5>x~$$T]N63^kD?D xEz=1<.5m 6P%w_B/:_ݶ99>.:G/ͅ3ū˜|ra`=FJZ;t: \z"wrJۃ5Y}q-r|a*W5~uK=;a]B )pӵ=uOR|b pxeUu{6bN͘[3|X5 ,`}⺏7[ iںygxwt," " " " " C 9 >ŶOQEy8 'uB<|yw >]>uo;dXز=~xE :ݍ-_E8y: Ą[{ N[Exba`9yx*!US@=rI}?ۊU4蓊tt ╕qVJΞ 1˕l݀>A~,~f&pT cЫ)]&l~",LJdhJ"+~Wb]Mtⴱ=h#҆d8UJ\ 8. N 0atoM,BY+-MDV (~o{XWZU؀{+{޽[N H?Ҧ+oG,:P4gcVmRJ5)!vV;X7&W i+M@L#Z& 1Z~Ïyc2m)Cs, 9W^3XR к$> mc 2z␧N;s wru45M@ V x%t`6MkOB&!}+:1m[?4%$%-?%(.6z" " " " " "p_'Lム.#@p?~).aÆ?Wnm?cf32qlmT[fvlky·y@D96X^۶6+BbF ČA0>^pœE;,\[B5b-f -˼m;-f;(@@VCw*Ks&a/^#0Ok57Yz74N%" Q!|xE6:?b ᴌ^hkJ 6 E^cZh*!" " " " " " " ͝DB|JB }$" " " " " " " "pxX0u%hR$j5ۥΊZzD@D@D@D@D@D@@1Ws|Q?N 0:x^l߾=:sG!Q0U" " " " " " G?\"q+ԋFعs'rrrQyռF/" " " " " ͂3<7oY(Hͯ=*O@GgE@D@D@D@D@D@rr-+;F4h#`ϩYh%ÆD@0w]DC0r?s " " " " " " " "HjrLg@D@D@D@D@D@D@D@Dn:," " " " " " " " QKπ@# Q2uXD@D@D@D@D@D@D@D@&G :wTED@D@D@D@D@D@D@Dh%,D%Dc9$" " " " " "bbb~r?[@}T#' Q+o(" " " " " " " G@VSHD@D@D@D@D@D@D@DDZwO5"zk" " " " " " " "}$jE=ՈD@D@D@D@D@D@D@D HԊ[@}T#' Q+o(" " " " " " " G@VSHD@D@D@D@D@D@D@DDZwO5"zk" " " " " " " "}$jE=ՈD@D@D@D@D@D@D@D HԊ[@}T#' Q+o(" " " " " " " G@VSHD@D@D@D@D@D@D@DDZwO5"zk" " " " " " " "}$jE=ՈD@D@D@D@D@D@D@D E5@y9*keeayYފdoWi̴0mX5 }a"xfS~O̟ܷq:ĥ8q7՜D &&>^3~Wnm? )oۺ>!l?YZmh+Ä%8v`uC܌NY; ϛ4^rט9FL5/Z9G 0@CB@!FD@&Ţ.Qeܛ>]˛F#|MqYx&+Ye`]XD@D@D@D@D)PLtWhf7"i0O:tOV-#2#r{>޿,j{ q,kpEH5PE,dE(?sυw#4tX8 <5*" " " " ",UC)Lp?|Џl['< RL-PjNL-/_73-OüǯNJusnѲycT`qͬM1HOyvL\1cVz~~g9s%afS#SH3e4Ao,"ppA =CuZuƮٸ002W[YК_eM$؛5sGx`bV^3緈Xhz~x/~; Sp {WghO)3J5|f=V=7XhrD̾/ ̨LLC-k-#9NoQJC"9^^/׬0+*w[V-кc,,[ 9'vmh*C"QC" " " " " DoR6==$͓@ yHAZh(g2RB Z<5+ \4I~iDQkVr̲<X:8&uB9{rN.^1,&+@'YUuܣ9\#A|5nFͼ1ctS8zH:{qL8iqz[gg60{L 1㪻ЁBDa&__[}XvI8omVݣ1ex#sSj4r8*TjH laUv άO ۔|͞է}9p%3)g 9 gap=eβ7Bv'MVaa)suDaaH(l%hUצy%гGn,hY[]YdPw;gk &-jX" " " " " GS[h]tR vM3vg;q_\5y¡Zu;p_]uOKkOj~/kf-{c&n {:: [f"/<1fp:@j^>. Ϭ<0cIjuZ" " " " ", n{ 8+{Kkq̡HpަxuT ;N%_yYä!ťjѶe<7Rv$UX"F !},/c0.]5nZYSc0c&\Q5JO뮝1x0F lM8~8|l)-c8,Z: 7nNӁӡzL[}ӽPM4ǦjpMP+O" " " " " >Yj=HIϾS:ܡHf)|L h_%hYgn ;`(.c܍ȧL +,ߖn5\h5wE>Z[ᾷ6cĒoP/f}ŔV͓@ػ0;AݨiSV&q=Ɲu*z>w`zޡT6q=SԴƙ)KZ|V5dZVs]OmޜF~ZO-l e`s1튀Z/Py$j-P/+ǩUB-yRoXq'M&,{+|SN :8[]~̅-ؿs+=V>]Wz'ofvۚaca҅k yk0A`Kk%Z5qz(BtLHf$&ZVHY/ >U?9 uruigx5BV=|ځinA{" " " " " 1%:\kB^LkǶ(ӶRҏ1%)rvJeEW; ֗( xhb/MmVTTq`9-~8,W05Tݶ}(,6tW(;{f; $ }Xd(ۂUlq&feYȄʟu=f*W_mڼ" [`fa)j7V?Vubv8󷄩D2(-B{ N ¸b6ekM?d T>f-Uy9\S0ix8*He8Db(OjqZ+JyY쫆җ=1d/d<0 fUa=Dl' =S0W2wo28;T"vKM@q}NM{#'YK3#(cNn~|[u8ǛU#>׈|c8PT\9,}s$؍GCc8 rYSscbyѿHXOM2r?+" " " " "pd H1GºZ 60`СoPչmdK= E7Qk/KG2S`mo'~0v)W_FQȧ.&30vMB<4)_ Q1 v7óu_[CpR+5qzHd!.+'l4]c v+u$MJ X#Vl! hfopv ~9#;ӢP/@RR3!^g}6rNKJhV +07u幜},滿Y)P(@ P V>ZzZmUo0*`(|k<<9~]_3^zba||E?EX?[cLS|| )G.wհa;*m~[ BxWɨt0#`3I`+5YWz}S APD!!ӹWZK`V_)̶`r9uz69^/>|M!ְaP= 綖LPwen!.NBaɘτ7(@ P@wꎞ[١Chߦ(Y[VASS"dz "'kkW%[ U|G˯uM/oiU ߟ-YcRz⣲O9FuݎGN yQFgMam4dN ,m+0cW|a-Ga#R-y6S! `U[جG|Xc[:v#ѳyD?Sno3hGnj?%g.LmV*-0W=pLnꁩ㐴.nw/ľPT|yQ>vF D=-MSki n7e֞E6Y_ xplS)X^﯉֫ҶaBsWyM[~Ti0 0-QZfsΗfQy\c{Y^ڬv4 4_V;zɖf UA1Ñ^,͏[ 6;Fn|/٩}OϑW[{Zx{vˀs%b2tGe4ܶm8a қ=D>3lDZ). j<&oA4OɈ[4# P(@ PwP|JGi-utZaPŰ X=үydnF1卦:g6y됾p6=#/h~qd| Nޖ^1LEFM<,djo!y;<yOC\yQ"A? ^cg#XRi:ovJ;d՞ٌq }wl9“z$'dVy6Ƚn~ϣnR(@ P='Z=gɚ(@Oqqxs] mm6F˕B{\Dl"L$jy]aAiTuo,hxqne,"K%a1ɨ,K*J[5Iޟ WNj^vjMM~ʫgITijOl,}omY0^.&ꊧQ(#/qQk+͞'e_%Rd^ln5>?k@ P(@ Z, Ԕ7ēxe\KoeLOG)fLi%AF` [ lu(-xOb+8Omz19Iڮ+Vw|oJVRo9J07]Sojg,-)) gl\ i/%qk!1HDnu"h(@ P@ paߛd!Hyo$w0ؙ2*s{2ݥW-ؼ߷ƹ##JHT=Z!eHT/SroajYu:rU-Fvv(@ PFAq](0B~;މZ#Q8~ z7l(>~i[Y˫"7칎Zkaz\R6Qb-L`,^~ݧ'mLJ{N *qݛ(޾szd2h (@Gc幛>`C~%˴VG d;٨XlxldIs<(@ P(0CPK(@ P@į:m$ ~[Yx(@ P>(>6/tOGm"lx L d=7nL$I0>(@ P(@ PzBAPd(@ P(@ P}*Vrf(@ P(@ P=!VO( P(@ P(@>`POy3 P(@ P(@`P'Y(@ P(@ P@ ӻfrʠ+;J P(@ >i1Z>@ (@ P(@ P% P(@ P(@`P˭ƻ{o)@ P(@ P `Pn3ՋҬ(@ P(@&V/>qU;uYꇟsV/Zj P(@ PZ/^c +f>Ojovn/܍UR(@ P(@'0|uw{Z޳ҍF\y[ jlރ#CJ&aCu@jKlD7nVavU_DH(@ P(@ P@0#JZ>ǯ/bw'u.+C$(̍ s] P(@ P(5HʳS3NN7{ΞhG5 VN nr orm$ӷe}(@ P(@ 2zzu`1|ހoz];G^צ$Ι省d Xpv 2AFoԎ{*.Ȳ2?#H(bǿ]ce=jͱ ǏqśX;ўrKFx^u}pEa .xj(@ P(@ P#g_X QNj8)o[c` 2Ԅھ "VC$˵ô|+]EZ|RS䭐V㝦du6WrGڬʿV9TQFi#~}-[Gd*PNP(@ P( ju9e@KoeF#4?ɥPxxjQZ?=*У@m2Kȑ9Z$HZHyޫzvVxcʡg GL(uxTFj~x4e z]؇BR(@ P('~؍yTE-zRAr׭oI|Ȃx \'RoGg7d ^>jj^Ԥ : _%U^}Q5+#"'tSA2LjmWo ]G}FڨП69O`t@IDATYn`1%S0q0Ƹ- P(@ PGjuzjb :K}қG"Wĺ{1uP]тZ7e_QA3AmU+ZʪLjTWY l} -~n Ԋ|vi :SmH~=u=Y-}Z0KRob(@ P(@ P:2}vNр_J“1vT7u^T.ȚQW\'|3h(NdĒ~/xKZ껓 S&#Z|uv?BҨohT= Qa=b9 T}ͮܴ7\d'VFn蝹oķƩ>ܧ(@ P(@ GjuIrM+[d.\Ч-us5.|K-1_ZwP#A5zm+o9UY/ `|p"GhOʹ*QB57+ P9-tLKckSo< 2 Ñ/kǗtɏd{=y=VM5LAj̔g*D P(@ P _|Ff`]_Xn=QF=T|yKD?[ ]DP)Ǩ)$A`ɧ&Oe-5:_dm ҆R5UL-⾷"'#Pj__+r݀yv/mb|ͱ<(@ P(@ POD=G|uX?m}k5W8xn< 钯G j z٤ne_<81?F|yݎq2-(mߞTZZmMJ_̲PVaϏ"Zi۷a(@ P(0@$v-M?+~N۪}ϏZHϣz^ڶQ ԾQ}}+jΩu?eH-O;_Oj1e}NG@}N;VPa ΃v.5(1& P(@ PSA-|W֫vBq7;M 5b/Dmm4{J PQ`4iocsxk`P?~#иxw~v@[555x"/V&X(@ Paq9DDD 44jf5`P;z,K Pc5BK|A1Æ zfv(@ P`P ܻwwȑ#QYYG}X|! (@oԔÉ'bԨQ/R%L(@ P/0|p :T]Z#cߕwhO@!(@" f@k ;g݄Ols!,j^q?o #eJd.ker>f_! ؝*S\!sW65/Wj,h2X13(@ ĉedVOkj@Z},E P}$0ĴDHFf‚R[e谌|xAL*D䪅@GuJ.Yc| 0(,sy^" ٿaVQk!fGcaU (&@;3UE cuW躙o̜er5d_F-89SP4R ĊT'e'?[e'QVR5 (@ P+V0ݮף(9 J"16^4?8<-Gq3Um`ڠ:#$&LG/DeS2r' FJ(##0Pd\Wdrk9SGA;2ב*T}jF `9bYAx RfX}Z,]3 GvVF;/ P(?~?==aPk?Cc3-#7Pkr+YAx8>Nes jaQ/ge(TB5 sehTS:U解:,GՂ:I]sdMX-p_#,UlUt樌ӧ2iY[|uWKwL]mc5N{I,U#2Kg%(_3|βއb-Qa0Q(gjZ?K-.]~}`P D P@(H_Mӏ,>kl]>E֣pG@K=99FL먌~:/L‰FmZv69D*3KW\*˧zS&YcL X YD6HsMi*k+kSc{mݳ?ΫAZ֘X0xj򮌬N]st ӎCuSRO^uo~t<b@S(@ ƍFm1 v"W*P?U߹N P(@ P@? 0O]-Z]+SWD d͍ Cu;A.X(@ P(@ PhMAT:82r8RLOjnν{i U(@ P(@ Pgic>u#aZƯb!&36]PNjs_\&Ĥ@jz98s{KD㝻Z@S'ċOz6~1P"STPKW\զ4{r]G粆= HW-.gʈ?Y×X3`{=rʱ R8Qƍw;2do!&|T" i7(@.0qD?GF@@{l>(@ PiFXV<>8!|Zcsoh»,r H5}Tq_'2ZF״5{P%Y0SFwSu]5UF;@ђo9Fu5˃F-V`VjS_wRl?ײiK0Ysz]jĖ 'Ж˨0=rVv1QWA~;wNAc(@ P=5P/?.ujfPS\A5-~H(bl9ɛyȪ͇,4OQ)v?~vCΩFGEM {C~7m]Sjwn( d*75z6Ưk >QhM*7")*볗Q}Q =n Ѯ_ߖ^Lرcj|駃}(@ P}.P#8Zۼ!ZmҴ}AMkK*3y~o݁*o?z{EG"W'&KTP`gڪkRA5[F=ݰE7(AoȺU*_W1_\R__1\GʔD=UAqBGzM6ܯp _|Ae)@ P(RA&%kTuk4c1֯ɴB֧I_pWCp~K-.\ZEb*/ޒ-Up.T- zF[?z,`#;^[ ;M62:ND P(@ P4eWvנ>*`*ӓI~$7[@h9Rc(,vAR 4S#UH_deմ>^gg*f$lzςp pBe^de,oa2LC!Xk ;r8ús(@ P(@+VZ\};%F؟[ZS ð?pw/?u&YH=Xi*@Tocv_jtOM?|CZԌ3C yT{[ A2EqR?E \֦^VZL-CF9 P(@ P|G@4:Jy}ϭ8:Q=sjGhs_T9u^ymz}_?նϦ_SG:# PjVXX&LaÆaP$Q(@1B~S=#ݩe{@A@d(@~R#/TL(@ P}'~R#+++Sn4@ P=wB-{6l(@ P/~9r$5G͠<6(!C|(@ P=,z1 <(@ P(@ Pǝw(@ P(@ PZcQ P(@ P(@`PyW P(@ P(@n0 <(@ P(@ Ps[ޕ|E قzB_iыUg0~ "'r-`hz%p _xlTlȜ Zϙ 2e,B|n-ղP(@ P/8/y/ P>#`Mdlڴ ɱZ ұdgZˆ@Ƅm-GɥQmehOS(@ P8Ry P$`!ѢČY`r$%!~j5.5&#ؐD&0HNk^d"MX?Wڬx?7{ ͸!M1H[ԥ"|xsX`CΆ}m& Ux?s3 u9X0iAD"vR+9-Eص%%Zpp$^XxvX1Uc׮BĴH2]iO 826a}Үxkn(JC2WUExXf6vak3gjKPnmD@h݈3';ֱm+qzM5W"R*}ːv&فJ#tdٓîmqLk )PA289eC҈JX+㵶m(@ P?^QhW\剦fycV!"w`K:e֥Dˡו:\f\czXeBRW_&:bJ*-G|T TjGrxS@KR+/̥pӥxutLK68aغa 1VB)ۼ|V7osi>VGxc}jpn|-LB<SC9CkQ`@NQLk܌yx~^JB^N=XRn:av14 )/*Kw^7SX+V7rJ1'ϛjce{{,^vOZ^!xk+~-JAPmہUQؿqq(@ P8*D P#3CD"L`@J'>h[K8cObz4 OS8uCEl-/>3+1ZEUi)kqd^pY>&1wbs\٤nK!N|M)v1bd|x[U_Z]X8.{ 6'lqD v+gC=a ! ؝eܕlCjQ[5È281Wnƚs?bQ^_ϮDrV*AM{9۽xe&2i?\Z5E2L~]/mk)Qh<gn= P(@H-|(@v`QiAl M:CS(S[uyպBdX!dTV`^8{ޔ) Rl]zm<=tl%hMK AXlU$L pxO$d$Xn (TZ$)?_ Fbf &>*2UE cׂ5iItVxL@[7&`۱MHt&(sSb^*\wġx$Jʡ&!?ozٙLmQݯQpVg4kwt寭RQz҈FYwҀhjE P(W jdg(@ x'>5R2JTGX(õē+n]rI!=٨菞ܢγJ zF3*@$#21T-BaU,^Z[MA3(=՛չO-UOKMy'+ |z5F[P\u,S)`'U7 H-q:*>ӮF%`Y8c<Qvnv-hE(qRQsL(@ P~-_?^v@͗RJ_*]-lfЍs E25/ S 0a/(Hl̙ҙ2cO.#y/ŀdBu_5?Yv߬|5yGo8 KP+)cq}j "<%8iYgMΈdU6NUHEُvAk^!,%Q~n}(򍊁A*l%vE%Y UԵx\5Vmw9&O8N(@ PgQX0H *SO,];bՈ 6RLɲL+Lcu'd=+Y]WiӁ4mWȴ$W`M]_>y RcG+x%k!1T!T ZZQ6cc]n/!.8# /C0CNX $mQݻs7`Fjϐq q٪_ex9KZ22짿X-)@ P/zG1u{Զ05WT9u^y6#{{RRZ6#ØCBdJaIգF:GQrނ[_E,S7RKDBo;m:WkseA3f` &i V"+])]Tm:J2Bg1ٙx~yR~>qu8vt_^(@ P ܾ}O9^~6dȐlzunվ[}߳^^msʯ[9գJ[sZϯFY(@ -`P*)dܮ9*V4˕퀗{m֢Hϕh"9{-UG=[h#;QYׂ>T'n #pI,_3A%ؑW"!-nmFq(@ P` c(  ` s=IVn@T ؐ-&ckػ] mWTX<ɒ- P(@A-}|(@)b\l;[ݷAX)-F P(0ԺSL(@ P(@ PP j R(@ P(@ (s@ P(@ P(0p (@ P(@ P`P?(@$0tPܾ}{M(@ P%F_aPk>86@HHjkkgk P(/_ƨQ|%lZ(@ x.]ŋJD P(7w*w1;S &(@ x+`0?555hll(Q(@ tC@M9T#bw2`P[@ P蔀%GTf(@ P p=Q(@ P(@ Cf)@ P(@ P 0oO(@ P(@ P@AAE P(@ P(o je(@ P(@ P `Pk!QF`6 F05 PP*u93Fl,(@ Pvׯ_Gyy9ɠ<6(ୀ &`ذa:+ xk|(@ P;#FFjdÆgt7T8LǀaCX2cVו v;M K](opjiƁ̹ЖRphJf)6 ^J 6mـ%v& Z=-ـ>`AvV crl~YLhZk*gڥyg!5"N欜,eKu:9iK%^ڲj_3=wVFvz'^(@ PTA.>%@Y7+P w6Cx64"M5c Z0RtK)C_a_5Kc7(#+rjG +eA?,Sol8),E_Zt, c|R`p$(q<=!1jC}E)*+ΆtO#Sr&+2B(oCZU#ؑQ~RZQvsvb 30yDSj4½3cB6'[f(@`P OtlPFJ@#%s魇 Û8Pq?66Pk3W￾S߾F AfFfĕw]P=+`!Qgb,09w5VQGRl"x$h/K&+ee [hւ5dKqRV><9,0!gVؾ6M@RF⍪z@,|jF9(,hP|$GII6]rC q1g{sKuCLSܪ4̍1ڇ~}bIPϬ$aX._M)q0Hfe!_aӿOA=TiiJӃE ݧ,MI\;Nk|;_AA \Ax|KyC{ X)/[8tZ~dbTJl\/Wp*ʗʱV~oXM^I/Cڙx7gCg`MK=1;g 5"!%6IZ݋荛Qv8Ķ -YfiGWI^?kfhGN`l[aEƅKcB#tF,lq0FŋJDQxlOVrNF";xc'Ԝ[;vDzHx~Vզm}oLGYZ:UC*_l_[E8mUc6k6qgWb8]~FRf2ef#Qyv: PB`_;:|_{7b7›e#3MxP+;V=2bD9Q^SS)s[ hK&C\m '5!&i"gTp^R ilu^W*pQR'nXeB rNFy\O겳|An:VK@K_,: _d#Idʹ KYdžeY%B=WOSm7Ų\e)2u(-xKRJ8Mz%=g*H_{HVp'/>_pk2E LFi2 k%xCZ'`Եe{0k>Sg/_UO: (V@L,?'Wޡrܔ `צQxV dLZV EgCϵ'P5>AںSnV"/'MQUئUbJ",JVe"]iHЮ5ڙV\&kbɩ$̴, h X(ށc#RoQc۶)o~TGwcd=6s۪2nGJiM:$9 Qo1[eT8VC<(@ PC}~N6t6S?> |=7r[_+e﮼ 6U7 aD @H % FYXA<"9GFPqnMUwz ^^QFLG`]_#$"R}4K=WS)|aZZIM vԣ56Ƥ(<ܭ-2zN9cM%zmm5jʋ\wZB5 2Z5"j+kQmԔ''Jc&>*:cEE8qd\ՔOMKX%c4D̻38R[޷Qk(f2C i]qdt5, H)@O]U5OG5?ݼzUMmP'rrvXVXejiqvSl&o3*}۵6m+~OaT\#;Ufe8Now)5-(@ P'4ee~4j"t 1PUv*`uE+OW#49#qK)_ ^/y.6V<<( 5(s,$L5PM#L1i9s̗EcO.#y-g@\j2d(TʺT*O_ÒMNgΎP}t ^-Üu8>6Q,\.JQb!>1"./Χh87+XjlYO^ufѲÁZ,0M{\w Ϸ|j" $-&q="y.pu4hLgwwd 3){?LhkS]u\ًv͓xiBRmpoۛ:TNZmκjP$51 H9Cqr<\5'.su_QR"e;j9e 59Bʴiyr{֎AZ6AogbjwطjUK{k&"7{,ګ'P^yJx\C P 4EXkס3Z3zQZ_4ogoQJ} 7$8JF Om6⥛2Zc8GX~V!(@^0LŦ7pCܦ@u/hyxaVe`{l,6d,+Q0՝@rx,| ¦i-u S˓/gI% e4%5@Juk̥fS) ,RJ1QjF*iK>~Tys\>shBAQn#IƮ9QF]ռfc|-ҖgDZpk 5/;Џ'pUP{$P+5Vjk2"~),p+a{s~ӍqH&w2ê:+ CbYI֊,޻Eu_ F$b0&b T1<Jv9b^HoI9Ix!j_9V9 j$b 1P#8I{003u|fw}65Zr9#IR=\,$_:VNemd⍠1>w;#?!;2%@XMM!0ծRrNKEmXU쳦h9 ./e# =Y. n9ʐ/0ۺvF0]27e,uts0NZpimد~fY9.4IDrs8 @#`7ud^{ZvP:K3t9@$Bba0dDnT  FM$N G`&^Z(}bl R8e]۳|v<] 6I]qHN g-u}o({107b•6R16TT[2=*d@51oe!< 03V݄-DAކ!1}RԚAQޞvjXQPG_Gà]BR{_ŮX܅k4ZDpiKV)둞ؿ6 KQ-Pyon]eb^zF`~Xd[2`P6.,kLXk\b80(<犵Ja3q,ʣν\}ӫSo,ޏ7׳߮FZ#Q%Cb74؏fa~~-}Krd̗Ebbd ]کHHHz>^tɹ=x!G;Tzs{:QT:6+C=Oee"Ҥ Vm|=?#Z@}S@>,lCֆ[UʈG)0E#EܖQk5+Q(ДojiފZ]-:Xa6Idb~-UVK>&RNDȦIBiQYoZ[^+;v,R2wj 0R/,ٗn}dz|4*WGMϞJGIʪJS9M+c7m$@$K +C|!0r*6mG@$UJӤ"kB"!U&in D E/:ʧxza fe%QP ݰtQVuѫoo Z[޹smi\YtХ{^WK̥-SǜwɱW`ޫ/z0hF&{<"Y~K-MrC~4t$[?xsbl!^Z!d23F$@$@$h+HIHld ͥh3Z K|>D!+K6֛H;H޲ŻJ}V%klV̏pUcӆb~ضm'v[y{ós0ujN$@$@$i\ozTKTPܞ-}.9T !~G{.?H =ސ@ktIJ$@$@$@$Лpc}:K ;l20 OQ˧.%       Ph Q.&       Q$@$@$Cn6IHHHHzq_4VQ @&$#   L0`@tF-߹VԔHH0bTWWŋPO HHHH:UQQS@W xK8<.]zo @%CKSZ]  5rVaa    i]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHzzEfIHHHHHHHQ]QHHHHHHHz~/~7\_:xx.6q @QZ1+|PuIWn¿_Fyrr` &HHjga$p0`1r$Y p\+IspέiF2+-uԎKa5Vቾw`јvjsOC#a$bHH%n{=!$$&۪,GݎfõkpӰeo( uQ dLHn뵄>饥o߾㚯prfA  v$<Co߾6nَx) _Ro{ȑ#v@BVRk~0SBQg7nz7n'6CTw̱we+5dw4{o_NFc|x؆JIz+ʱpgMX<}}T X4v}&Wiv eS->ԗXY*$ٯo<`̏[b  hgڍRuXyzW/%q^xvս.=Zx=f~{LoVPƷ6}t**mc΄g߆=}G.c}HE?v|*yꆱ?CͪFQ/ԇb0ݷ٠/COX}uԋ!mNȮ|%p%~956MT⠾_˘a/D'_J> z }sk5ӕэHH] |)zJHVb.$ovׅ׀Mcm5Qǝ~~QFߐ$zUk/8Zxf S]w/Cm{Y˟{13%ez|,vw`R#c$ÏŰڕz1AF7%YgC˨ͽz| { KO}g_<Ǟ 2L7l:,q  V["+@pmpp7$q^DHVmhZ L{i=Q} <9<9vH̿ 2>jٰ{dDC3RWmx0x)!wGa_=2ȈC ZQ/U_F_>ڊ(6QZL0hz]a=VFz,?C/&yJ$@$@$@$@$@$@$ЎhԺ+_ku ً둑Tɖ(&Q6iWqԫBBGЗE@X-47P/=8׿~C$ dcd`7a>xr}'i.G1{%_ƻ%W𻏬x[ \o0,6kR$@$@$@$@$@$@$@$V|e-T8sEZnT}{H2D=D8TAIyFT{^+uIVPECJ^?XQx^aB#csH-w:2熋k" :7       h gWݩ˭d̀c{/ ~xk30-i~`0|s}xoX Ew=0~ >{qwb:^}WL} _xo+ثjU\'2~t +C>)\>wiIR)@3ȵT$@$@$@$@$@$@$@$6Ժ~GdeV _ B[hƛ5_a}w a1~1~Ked[ 1i,Md3T퇌m2<zԏG]ŏ 3?<$^Z6:7 o61}<#       !@O[Xp^Z)Tڿ*{f$ׯ݀i@ LU]<ܿ ϫO' s?~9F6o4hU4}s0?Z?ǜkxجQycq`7 o*zjK)JKB (ixуOV FaqFjKQ>K_D՚I}yy EbB}BRY Dd).=,7ܘHcV[p\&' c"1@Ve" I^H@",;SͫP\f W!eH6a[f& W>ҰD/ZmɈ45Yy9 a8U" z}%Pdیy%z($/H(FayfTs =?9aďt9{`lue$,KMh`U5z&^j!F-ۜ"zOXeGMhB0-U򖻕-$JϝC"c&#%kcG[E^z4?;EqӱulԗፍqR !$<Ͼ8are$uҎ#i8ިyq g3cpc]زv !KGLF⇛d׾='n_DYR?a-=AQ1X(.av.ji>|E#zXUXRd˜(5j#j dPZ?w__* ɓ!sUͨF۫]^;_:J{]BNmhT`%f'4_R{zi݁)X>{ xXPUn*hKDŦ)fEХX0;~n.r/ìC%24imI^V>_ٱX.Ѓ̽92muumAà2V/±ҟ@faLƼ ܁^]_)Hv`$@>Nf/^Rf&}!!!OǑMؔzyWð!Dئ Z{9EԞ*2~b#/2u[Ԭ-lK;zCy7â :lڵ HUr*=Ry~ ?]Zg5q6%)^iˑᢱ}$15nyZm(I?/tpn~lWO MlG dW` ̐k5c켵@S1G|zwn1hjߗE3T O7=I-b潾f@x5)tӻn o0OZD'S2\<\pw4{3y~0(RcNCEA+ .=>0L|l|>sSVgfiF.Μ-0yVg c˫ zyx@$@݀=E $@K*-[4OVWu. <{Hr2CaA3K4.ge.=T%*醤e<LIY*ƹFzd $sYyjS iu,mU<ɜ']BbS>(F!1i,KMZUIt;29 0 ZbۚF1g]T#Oy3k+䅌 6cKqe-5UG''p@ fk -8~Njh7~ovQ$^u/Su"6X(gq̛Z*ڋ8(z??ԕG-up @7'# ߛȓ q=փ<ĉ@LRvF;&.@9sY0i|Ke&云Qi=*| ]=V'M73bbD7 hW: ,a2dexf5XaNnyx"m Tmr*)SdYEAÖIoy[kDIڱSHLb`eg)=l6{T;eiH#:3c QkP!]bt1E%ЮHcG^!kJ'kCr KJ6bk$8^GReU+ij=/?]BsՑ6 b˹1qxߘlcb9UOQ;;w깾 >0!,BjCV0 tfY祇5Xq &ݶ/c]i "O26tDt ؐdkb3/˲\!tXm/@Eqj/`ф0F$@K;7[#aBܕ(/Or͠%6h\3'DZLސle0G?r㳰ilڴKEHjER_TVlE 4lXyM6-Xꤲ(eKn6˅\6v.Ec8+ z%(8nWZi(^б:/H[*<ؗ;y/Vb)- g 2G|l,)KxTyL\1F٣RdCEXLK~~WqQ v `ž &}{H5VȘZfWs9<%tMSʩ%E9?9PꘆcB8n>=d걺Bgࡧf#-bz1s7n$@=z_O$6*ӖX8Pd/t\1DI WƏOP Y{&aH)òWln€]))CP V.No M[H)ldWVs@-sarruAe+Bj Y^h) 7-+Qw̒uLg"F u Ys2|SyrDlܬvSi>t~O#`,*ܖmh1. rqs\2Dl'!r{tW;e; !X /3,ؖ'cdky$@&PY)Y:arZȪi8${64npA`6E=5` Um"*dvFE(Z|׍W+N㌼D$k kFݹ"88 t!zju!|6M$3.Mj:@=ST,['pXRĮXH9{]`,D)LA+Y EfdڅDY/iGWV*/SG)j&LQOmA+>e=v$G LAU/2uӔ2k]U(R}iOz͓Xm,% M܄H3׌^Aӷ{Ǽ׸>\^aǂI_*vĬňܘ%K2jTK]A${vX6{ĄĞuxidn܏ᓑ6+ SG ^@}t.c7=ڍc*қԱO_#OƕwU^^&N=b C*Kcӓ:bUo?͍*f2!пy^;8_'@GՒ 3W[㑽=QC(^իHv7ZҶ6ҥZc˾0S+CV2t ˘w<s LS{LYceKKK1vX>ֶ:̙WF0v8v@ܬ0(~Z;囷!}LUT7oĉ'ukcAOjo\A|}?9F*<}.+}~Nf OQx|eӧO\,v/qT񦟛NeuձWNy*n(IuTi*4=:i~/RyN$@2:ɧ巔HoKU=s,I- (tVE:_ ehskKptKC|Zc*F8ɵGW x2ە36]NOVh=+Ā|Ʉ/?xsblQ,OGAKVf"ސ@#jm\p]>0j߫cx{1 @O&@VO @'e!eaQc; j݇I`6lZ%gZ|Aias])WmNXJ g{܏u Em/X W: Z)8ǛR?TG7=cKPٗ:Ǖ!~2M2\~(z.?Yד!e.чeI=2+e<{5eH_zCea         "@O].*K$@$@$@$@$@$@$@$Шſ        #@]2*L$@$@$@$@$@$@$@$@HHHvmP2@O"^דľ"{fWI y)Ш}5!  QUU /|2 K*SWp@ ϥQ\ jB$@$@ 1ոx"SBeoBV $8.U$pk8oկ#S6 @Gxx8Ο?K.}4DjɡRo|e_jԙn[֑hHM$@$@@@@9$S$ |+XHNΐHHHHHHHH:Z ͑ ZmgH $@$@$@$@$@$@$@$@LFNHHHHHHHHNF3        N&@V'gs$@$@$@$@$@$@$@$@m'@VR @'Q9        Q )HHHHHHHH Ш @ Шv@$@$@$@$@$@$@$@$hdlHHHHHHHHhj;CJ        d4ju2p6G$@$@$@$@$@$@$@$v.HHH:jg3f[$Ю0`1*H3 p\Ll筮cR4jD$@$@$ {AAA dZR%fõkpӰ6f8.w BuH p@(F[j$@$@$1tPƝ:!пSK-#G`J!N$qa)bhF-PD$@$@ݕ@mmvtͨjc tQ{]jC$@$@ c _"et+]Qa \ϵQ\ jB$@$@$@$@$@$@$@$%b$@$@$@$@$@$@$@$@݇ZZP        / Ш%(#       >h>ׂ xIXHHG2LF a!C(O8y0p"G`C:?˥zM9=dR @!`qSpF6&y'%OӰ&y0aؘHʀz,ϡ~T/04\(b:>n]"0KÅ8}uwBXjP1h# X-Xp!]B֮UdvArYN%ZQz96۰`z=B]#бdxӓeJM#9H|$&nJy2hEcב 930FY4H^roVKk8t : 2ӥGCb`0Ԟi蜙Xs-Ċ.ZATFH:Z˗IHGq4Vh4Gl)JMP)fD fԖ\]\JD#=Un/Bo 69*yMF|o>@/ (RZe9_kA+8q=&κݚa|˝O⠥=Z[7C}iՋQڑzl}m^=鸫; e_[L釠AR@Qku vRWBxr3gF=dORͫP\f WP2$E-3yz6|aH_rX= k62 DXt&8. rrTɈ34k| q&(6 J):B>*eK8X)gx8lY{󟝀8غv6o` eCx|8?iq Q!n^2݉ /bqpA%I'US6cyA V@V\_ft9SbnKke)rVfDƎxIés 캑 F2l-^6IjF$}.uZ~b&Q)XUg.01}867_|u1[mRq$-Y~ٌŘ0\=-ز *7(qɋ< تPm"^\k_dhèxz{֞OyO.BtzsҶh*QoP(f-z3>n2I.Bce ʥ#xinx5 {IEY"\ ٚWx$h4j F ! CjIg['!=q WV^\w64 QUZ^5gɸ@Mi) ńή#.-݆i9iTt4KJPR3O'LCk s0WޮjP"mC>F+,>DaA{!yl:Ź{#;V2K%{D Ue]9,WaԪUOeO,I)圸QZ}sG=0HLo?l3B  M WZ#*>G7aS^$֯añCHϗn?c⦎f@s"g-QHހC[ѵʏ9A+8{ñcGJZ"&MvaCIy'tpP<(IjIDlxi0#$lvd̟E%v,=ɋդpނrUQ] ZX4#O^+Kl_H F"=+K,Vj>x/kOP{Ddfm(t5wȸԘKjjjQYkh#=ޘ|*X\r;67ݏ%HdNOkf Ș#s*l@ՙsɳ?[^P6M+eL(G!1i,KYBM!2/xxIe*zGu,IW7~X:[caKM:Y*ڋ8( O-X@IDATIMQKWp:m4.RZi1 t!R9`dmP^ctcnXLA5XpV:5csqsuV#̜vSQPX%U=2}֡Q9v/ϗW{H06"X\U4ȆY^X3t$َ+B``[uPzy!F[-U'oA8c7qq!s֒ai6UȜ&˛{ i@;1.9uGaU/Ң`0'c0H 4jyEHH%) `jK1%W^$pMCfFe?ѣb)rj䍉R=qk Ye+WFV(R7oYX>;M^pXhՂI{bT1<3ʨ`O^tХwzm?:qJPI!7.s^//>B _ko̔ czuZ&E-i'7Kqh6磤FVOa0Myx91ؾ)efB ZWp[_WVRK$țhxPDV>gcYyI46KSy6K&9Afl{4 dYrrZ9L0;3#aVBg]}Ks!O6/\=!| fzYdmD*㷄_(楧! m'E=\:CqظN-s9n w y h}\ozEQ;Tzs{:kcӸ2ĩz*]ee"Ҥ V1aG|6 nvj,+Ov4RԒ q2<ๅ-Q*;us)75a ؞nxHܼy'N@Tʻ[ZLxic̕fxdoF+W'rmY&0ތj=omܶV,Ow;c\VxۤzY'R xu6&<0t9˕n닇tS#M'u~2'j}8zt._%dN |iUS{i{}ulS?=n?J&GU MiZ_iK<' 12"53"]Kc)b2JuYzyK,{Qzb.G $j7G2p OH qryfc+*#N,o;-X#MRڦ.ݳ /k.mQ:V\0J$&4j + @&0||(bHz),;pEE$ yGHXN̐HH:ZIHH'@ۓȾ xA SEQ!  v$b         "@O].*K$@$@$@$@$@$@$@$Шſ        #@]2*L$@$@$@$@$@$@$@$@HHHvmyiLUI3 ???Y!P%`:p+Ө X,J$@$@]M 00UUU]'v%pe 0]eR t˝E@!y\ ϵ&$@$@$#P]]/B=%d _&+**i@H/^5LF֭qZ:R8e /t۷J#N$*-7H p\ūFIp޺5nYFK$@$@$ ȑ#;@2E ˷BuHH )HHHHHHHH Ш @ Шv@$@$@$@$@$@$@$@$hdlHHHHHHHHhj;CJ        d4ju2p6G$@$@$@$@$@$@$@$v4j!% t2:8#       h;ΐHHHHHHHH:Z ͑ ZmgH $@$@$@$@$@$@$@$@LFNHHHHHHHHNF3        N&@V'gs$@$@$@$@$@$@$@$@m'Я"(HHHܸqکߩm1    =2$@$@$@$@$@$@$@$@݊ZrP        oШ %!       VVTHHOjNԈHHH݁]ۧHHHHHHHH|Z>wɨ0 '_/S kq)j r񪧒߸e\޼;U}zS;XHHHH ШL)HH??v-wn|yǨlKpمQsэvnԹ$%o#އ_y{Mmoծv,OK~Kr;;Fnl.X֝'G$@$@$9hlHH/>_ˆ!~W_105Fʿ4@ɘh"0?>X2.^z1RG=EyQسJYXZwRƒH֝6C$@$@$htlHH@;Gc12X|x?CYVu?z8;h.|z6SV(z~8}]-?gk?$zJ2^^z1«^*cܟbŧB7,0yvc>>XH[?(>yۥX+c!o όds8,Ǟ٭ɾq}:.N>$ǿǥ}Wphޛڷcp{|;kůଓݍJ8#_\/s+I?A&9<%   ḧ%HHHžAӌ5}_ _֝#gk*pH1H 4[ 2`yWԪ: .yHsQ[rݠ/8L]Wbo&W;y0q*&$L\?QO{}?,=3,GwK1G#GQ*G1l3e]??S 0NV <أ9)m옋G dv/~W!$/yK3y}icA>>WӖCv9[ռw^ǶŘwS_8/>HK&RHHHZI_+˳8 @/$Pm)Eij FXT "C;k-'QzւʚZ3! <ܟZ--u0lL$Bc \3-|4dFw~U{]߃9Ex^e~b UghyŒbz;N{|s.Ɲ ߲?[ )?fKWw>ǓaJdC*%j.7kZK8Qx׮K@ oyD!-A;} [7>k,aAڑ_$@$@$@$Z-l$' a8(3,EWR4 ˢVKànFNag$GZBWʨeo}u+Z4 8&e>_{Ԃ,` =GK-Ԓ`b']Jr$ kXF؍O/{7O:Jy!qC".+&e71*IʧG# O)cͰJ E1zd4q\iEANE] Z_sL 7#=~=nc_7]Py[Oic$Q    SR, :ke ^ħB~2$$$`نؔj@s"cyPY %m.Z}W a$LpڞvE;y"sDj/9I{iMH^IHށ)Q55yy>K?{V?^u?".C%㱤go.}>~>&e#@/7n"|pтF޿ʆվQWqv](үqE9#8,T-F91(=OZCr~USd$]TPQ bMK˞Vs_K+7Ox->w^vP'/{-nllV?W7KIl&}fLX')"4ா7bZ(*21Q)둟[m?2{fP\|ѹ8? #ow$sd·&5#i1l7=X![PL/zϊ<&>}z }vQg A( pf6|O1T;k+;w0W=^K^-Ɯ#`QAϩ:WC"7\vlmCbT:lX+ݶ sFCpRl][4-~I[25n3n\Juˮݸ~8$eI7l7Gt},UZ[μ2TêQ9W|)LE2r .뷢eu]/yk9_x(_2! C#  G%>}dIz8xӏz=n?Wǖ>_9婸$irQ蜦hEODxN$@$Z՝YU#Dj@ 3{vkp^ϗIbRT%0Z ['#R>BŨU.uJ+VD71hJހc }T| Ԕ!֚3x"_Xy{쯌#Z6$9OF%(Wƪ&ZE]%eVDS.-YFFM?o`UA6i|IHHH3<3b  GIK哇Q{2݁Kc4/-f@GTCTnk-׍D1D- 6:u`A4&oYhLrnD WgR+t$OJB|es͍ښH#;uĞˎ)dg^ݸrp[am $@$@$@%@Vk< CLRfJ!_[iknV0vX G,kFעA%%iMٓPPz ge{覮3K&%1tȤ6ijȤw,q 2i?by v"+Κ;at0yת`p Y;%Vn" bCulCx}cKBll:콟9G'֗ m8e@[#>9"[˨`dīmx7l!Id}7 ~"CDɝ #gΜI8t !u՜=[2&`L@%Jc&$0g RHQ^|8\4%f^yGԓWp.L!Ki h{6\: ]j/6a8G7J5QXf4C8"GHu"5l,Gm '7f߉HM5|~s-7ôénLQ'D;2@&6n끟ۊpVq"%G{s75^/AVjfSQޢq2& f`L $c,4PFcJ4i7, ^"A}OmQ_]m(lEo1MKasWe.S[2V#9l؎BAAKрWiz)! ޻q0{㾰hÞb秎T<4 -n=%P} C >iC:PmA,C^^lf̓Mљ,9aw6ҏ. z`L 0 N -mttc"?jo<v 2\X$Spj]2^.shY_F_]~ly)>!]dvFFy!$LzvOKZ_ہ#4 8h=S+~ %BJWO^|pv %)=Cg`3j㛒̝s;aӥf˔`~7tY04A]q{uKn{`Sp _\`L !TD>?jC^aJSXQyݮMRp/M.h Sf3xn6err+1/=%g x24Bu1Dlۍ_t[2!Ϯ¶CͶj386j,\f8s 4m1$|xm z D\ ~gUkf71WeK#zD{Е=rGzCz;(Qvl4F,ֺ T5_ KŹh:@fa}9VѥfB֣Q6'|zXHŚ K)6‰Lm0ezPe^&o-U!̭Il87QPR KZڿ/z֋5tܙvVGxcaq3'`L 080&p^۱7v~,˘p.NjfS-SC@ݓBТkpXUxxjjW,\+ǰt OfPJc AaF e/Voǁ8+IJr(/Bxͥ oM -yxn,J3a=|2PM6Jwcy Vd߅/ѾohhJ aLǣYJUE`G!t&3:֔,ib¨m9XPK#vm)B'$}eqm֔ /Zi+JPsal.I9O. Z,[^܊mv+~p`L 0&RFL 0&02˰j*2,6vnJ{H `N$rN >#6B ^M~,ng.xv=d8$?@Dղ}:#ʄS!ݻ5 `m7NJ_M),q M=^Y2*t eI (i9,:;c/]`Ouv赡HQ u$H6R 3a0`,&f ;K mƠ%v纍fyQ y>4L4ZR즍Zn3zW\rV0$?3;¥L 0&@ ߂`L 0iI~xIZ F|]Y8@hˍ G[֌UAoφ)z#$d!^Tu-jС(-ˆВ邐%V,T`, jyd8FzS&u4~>PKÃD [:">ɴ 10rjbj@gC-Щhƙ!Ub?|B{;sѺ >q.dL 0&R"0Rj`L 0K_Bķhk0cӴp;<0ۯ,iWJ, `uHy֐4@糄DqpAKCH&SB)DžKv,Y8D.}CSDr!CT)NclzRbtiO-25Ԅꑩf( Ӻ|sDf.h?$h-mxMO=0#6ŠM2&`772&`S@? Ay{64ob%OplCW3213, %(]GঙY{hw#xqSAE)/qq>핓/Z7O%jk?o #.HqiVؓ0e|s=^Z$Tu\A ^v u6CH/܇NN5tE<s&[K)jVoVxuaYTrҹ,=S]IS"-2[ІN[ hMcQ<̌T-ϷqۋBJ 풤KtmP)?:9Tv'-L"%vK`L L[i)delndyH4?A Be+"}ƢE"nh$ғ -?@V^ln &<@oȋU_Xډ"q} {(Ahk=*v$P-(`ŷdrbDA(cw n8kf85=,3Ǩ~_Ãد#Fs`r5 5`L 0&Bx! L 0&!_>bV?ƫteE>V@mz;(e~^иg@εxx0sXgan/yS7} _] c3ѻףX5V?\zۜea1¯Zjp"jLk ȿV&hxN2[-(Υ5da{=%հlը)=xnkRg.ہ'[`@arr ,*l1=S)0&` Lp 0&T';{6Xp0&4(܎&-pdk/` #?/z|$hx>_Jٜ(5m$x ;JXW=(hl$)(QoŠ6aPBRt'RUVؼ" @ciĮ-Eh/P[5e^,fh(B{P# J{`sI4Y+ r Zpŭhf"pXUxxj7ފ]~\MøO 3&`Ld 0&%p  J=ih'r"Wցk% ^ zͼ(j0c׏пQ̴ǒwQQyYLNv赃Y"!{lu`T.3= +C_e`4A+;y!;,JKr]qYh> taʣlV}:6pr n/>@Yt$XZlďHrIȠa'vK`L 0L `L 0I`>xi =]n|{K-I>܆~RhBZO0Vp.~P ^s~vD0{Xf1|ߊ(_ FANJZ|H$j 3(Ӡ%dZK(MMQC-k3n;pJ  ا~H[+7\z,jˍy /k+Ɠ+p<䎰`L 0&JF˙`L LyC{-MNj8[RCi%s짭6>- F݆w5dNFJteNJh?"biu_Oj>/c&L{q 5&S="uf*fk}>l6zoZ2NrWv;~&,1&`LDt 0&$@˯:ZpSΝ/4y>%<%Ӎ'q4C+=4[+n{-`L tXā 0&f1k>#I5fMM ZbjݲCBTl1*qܬm0o-m4S )M:^.hG#0&`#&ֈqE&`L Lr\ԟinenhC!{8ؖ 0&`퇃(8`L 0G@-j'ZaOCu x„j;_Am(}l톇:\{mta6<ЂE'+ Kr{P؀oƭJ_؁$8>W= W QP Ϊ6CJ*]hh93ǰKBI^rEDž{4h|[Q`CdBo)FSW܀-ع37b.pX UBlM bG'ľs)`L 0&0FSjX`L Hޣ9DC j!DpķW߉6cK4daRz4qdt|X݆5;6I` Kh&Iz%` ZCEwIީHE!۾nҮT,3CՒD w!===xd^(4nJGN T;Ir[ )q(ASO;ːYYX?Jd6)ǩzaMq 0&x<$&`ϝ8wGs4H@IDATK`tZ8'Hi -\6>Zq%db\UۥxRݝ}qL)D5 Ր0%C!Ce54\u,.؀@+>Cm*dS6qʨu~h9ێSnTXreٗؿA8I:K8`L L9:tBNyQ%Q=g]Y(&Np6:=%f6`sQmGǩLӄO>^BAŠ( F :\Jndyze:,"Y[f`nl^"],(I-G`L 0&0 Eo;ኜD'DS7%2&`L 0&0XM`L 0IBr<y}>y^ν^ ge!dkU`L 0&`Qf r}&`XK0;Џ鳇?L=l磠 c5`L 0&>~Կi&|F%6eL 0&`7Ogj`L`>n7w`Kڑ5`L 0&5"l\ 0&e6X &`L 0'3`L L lSb(<&`L 0IHI3`L "˟Ql7éS^Ό{U z땐l rR_`)'TRO p|ǜ0rD]a2!M{|F/&ok}|&@Z|+0&.oȑ#h>]0NBÓyh:ޭGsB;}6mF"YNC^^l!c3>O`QÐf*A g؍tCׁ:Gݎz>|~R}WIS/Χb3taۖ}_j23\Sȿ'c}VXԚ`L`x.:i=KE٘1@omP:TaO7:0@ҏf[UlJ|L3ЯK$û_[mK xf> \ݍϨ٫mn(|:`6`6hYmpB'M8$@YRlE qd~l50 Ԏv{F{qI:\{8ꪂ}Sf&YF׍LF ~8OiV<6bm(G,|1ИH4y;1q3{Q{Q,W QarTw5Nl zB߮U7OWO*DWkJx+ )P4UD?8MO:Jc;TJ;ݤNsd,cuWqj L=lcgIg ^4|iE :.6d+L߿Xc<&p 5\bl`L` }Ař޽{h LBSS@{+vqUqяYh}Ӆor ϼ} Kd "ƒ{_;qsz{#V/8PgXVt^D8gjnž=^,ze~D:#" ђS ^ƞPސ[m2Cٚrt|z@S:/DAuR*aف--c'VP Y "j˰ %yYsÔ:1[oFUq6jC{Xy'4BKs#Z4u"r.щ WfZلlc:燍_RBC1<]Zҿ/F&VIvXf% RUVؼ" @ciĮ-Eh|D# ZnG{/ܖY8ךczdP!Ѳz7Vy d߅/ѾohhJ aLo~n]$qv}XEdG36/}Z)4>34`TҟjGVrEeV[1Ϻ\8ݦ2z>kq(l:߿!`L`X)9`L`ˁଈgqq4(3NcHѝe#aȠu'v;ILBPmFXkHdhTZ}AQ  %Ն6Ѧ hu~=" ׃5Ԏ܁{824.G Ehz`1Q yNJʲ ,3EѿuBhIC Xn_؉@2Jǚ"Vj4Mv\gZS8~2II>B2 T)_6 یCu5]XnZ5:K&nÏ+B .J ~ju؋/S](l(_Yno[>?ꙋΈݻǝiI*=ص8h{𯨭zo8|&lUXNܑrE]-xf^/>s Eh zqo[4߿C,&H#0&`H/;`(]{i١vG:#XTkW5xF|TQ#C}-kFD>-?*$2BdO?{MU$ 1,) >kQIzE-UA"gG.u ˕H"Ift I‘uCP҈>cC U#"Y a^i3n!N˜(󺩩Ѕ ߡMhw,SDhZ%O͎J,Ke1:( $|tw6@B['Q;?bҨ}V[sPMe?yAaH|etU+XyF{7JecY_)=٫ywQ- qJR~EKI.܄2&=H|}Ґ ߿cd&@FXM`L 0&01 WB38b5Ӓl$ݎ_m+4ա_F|(P.h許2$U Xpg%\]CS-4bE=vl`5iZE ,Au~M\eKōNɋS;@0 ?핓/Z7O%jk?o`/` '%/Ji { K85Л^'գ fX,tҔ|^]nu7^ژ]Mz-zkE6wxuaY8sCHXq+Id@TIB^eY)6xhS 6bwSu46;mU(5E fhE4[px$H',EjOۅibNQN|5&d%e?I[D^q ^V(33Cߔtz3?hG@RDI GXJ|h5IW$!C#M89kĵOUW忂n︷ 'WwSGpI;u|>q~ ]nj+;K'I]x%}ԩLKB>Gyɲ>,;-\}Q鎂Vw:GH>>vTxk Ք(=7}IkƶԊv.'z]NjS&f_<>#mttc"?j⟏D[2Vmc+Wl#;L`CVIǁ 0F@J:ǬawJI>hѢ?q4DϚ ʾUn[y!_k6,V}a9wk'~ZI`g}ǢxT?o@ 6p 7Xj'CH `hACZfԒ1JAmjEG˜ ?-A4)0[e<$tc6YrB%loZy"V1z]6L[q)%ꇗ+#X߃=M -G!(=*-v5"ࢽj,@mj>v4֣D‚N cShv*S1 /[Ҁj A( qL ՏD| :_dE{Yr5~ |DU?]t͒3I"8h"9}<_p g t㾆ǃJC~]fRl<1ہǡ̿\\PfJdJ˘I̻ 愴E$t! UmԴzڪEV&!մSҎEqxb3 1+y?KaIChjCi!y? &ofp|v{^Vn{ ga{=;K |.$!σW!6x-<'%7ַ@iAZ09?LՇoGO.)z oP]j/}܁VyUD KTVUsЇUf4K⁌w +wcuE>UhU ZZS#`L``Qk\H`L 0pg׿7I@Z ^ƞ\hhSZZaͷ*!!G\((\:S:/DAuR5vc QK U)**+Vl^k4bז"4+Dž{4hl9F3Z`mE%1I\5zmԏ%mjE1͜&fBI cإu$/ Faɦ@v7 [<m#[iy>6'Sɠ&nm;/R9waK=BvS{xl+ 'WoELekܫ kʼ0XJ[׹#x[pl$JHEi֖۝aRɜRq36/}Z)4늳!`ԡYKJQj̊?tFg'kg].n`+P^܊mD_狅8_9v=ފ]='KޅI(_YeXIM;suji8hp2~^˃ŸwgKp|\H_,z/B.|ǰt Of$ &Kx$L 0&@2gN"qL|b0!v/\N u-iZW)ވydnFׯnHTsoGЗul*H _[Bv0MNlN7KBc1Ya~zKI5 f Q ljälp)@lDIIюܴuak*#x3/h׈/Tc%e+5[8\6 ؋2 .ɻl(D,e$;@F_%"$B.,dMd*%v([a-pS؏84c<8]ޜXWw?例بǰ,32%|܊7cl]-xf'O%F3ĝ)D˂Y _.);2K *;#xLR k֋Z?A=>3z3˃ϗ 7J)'veefFtq" MX@_ =0їQE y9rS^ 37CP;O_;4*g \3"|pp7 ;=_9-?: $2-̺*|'ĿF!`L 01# PyyYpxAAT(2Pم(ʖP_砖)f}bɍUrdIu,KH]&I"ĵԟޘT\v++yg0&ҥ;S,SEMpl2 .u9j%"O$J `#C\Op2_1cf%oYif҅ |^7Q{wfV"[:as{-Š,w9`6>- ݆wxMteNJh:? d"$1=$ ZKx}k%$c;<0ۯ,iWJ, TH?M_ `B"r/]H~֐t>K< (P.hL L$D `L 0q&pYꑖfGg?[w>/-CCob/m.)vᦉKK ;dRF+AKhwJ;\嬇lANLWߏZ=ވ䅙$/S%b!DK~hyuWvC 3SR+TF9d@n13ЏRSz:ΐk;ݞn\Ɨ89cgLOUW忂nqoNP xMK</܇Nړ krx'(1jE .uaYTrҹO"b7]^4jW6wҦ m`CoJ;(W6ft* v$ ۝xDL/s,òCuG(h~Ǣ&?ut$Nx$|-nggñ]Ȅ=/JrǩSQEϗ 8g \rnلNH fbYKͨ-M[ۆ/|"~Lɇ˽~Gơx 6N2&0aIUqL"?\qCe-D"Z&ҪMt*tO6Y0br &N͍p}_B:G'9OxĭKo7ߋ7hqZGmp]:?l kC 3Ɏpt Snou_v<E؄ga)Ge~eG]ȧn7/ a`_ =_FjSL`HKKNΞCVqCUmԴzګEV&!մSҎEqxbHeOF/m2eM/J'hTCQo{=W Zj@\Ɯ8 -&0D-e-3&`l8LnM eZRW,zVd|0\c5-UC6Ͻ! G\~7̛;Hr h>>7^Zc h4)o .cij!9qo?GkF 8[Yuf͒fHr$mxB*QZ5R^~8^&`L .^~8<5&`L`|._?6֚`>;L`4 >)I ډ=i4m1&L)L 0&t#)k܋47ȑfط-7XL^q'^:P|n ~WP>T=eѶ\ӪCё-8o+`L 0&Zq9`L 0)Hܟ ܆<ObŎ9t>Y:){a[ 䠉kVxPZW g X5bgn૪|)OIM@4IxV| )u:Ŏ'r+^0CP5Vjj-&uUf\r2cs rV: @9'99 H4>k{":*[Mn٣cǎž ./F?Ph )%@P+" 00-[qxi8M;?.mZцUKÞ>KJY󟲑SlK>+ HMfYke/,SZ\Ki?hy ;W} ,KLVPÆTVZ* kXz@VF*~jS`U|Yjʗzi.}j ZzVF XZ /;~@j%p 0,{̽^Jg^Iؤtmj j_'oHZ?ƽӣo\?Yo=_WO-VO4q2#9=HvasI iѦsú# z邋ֺmvv}O[Q &}Şon6Uk僮!c6m]!_R٥vu*,8t<{BzcKh=I.WUniwgo~fuȮfW%jm.4iuuM/PR晓]0Oi%zt mpfU35熐Voڪ;Q_Hs2UE,(mW*kn@53sVUPYIFj2@@[ݦ  b5_QSk łKoyYw4J߻j͊ET]!旼A9ZE/-WҰ3UceU1o-h3e7cS z,x64Pg?niY%Dg5)??c|nkrѢo\^VWz-M_Xm+e}Z"cz4=¹[ |"Yk}oi*SU4iE*v)C~ FZkt=Ns^@%5\E6U l*ZS\+̯r VZpoҜhhw@8AFj ! mЗ-qs*l*/t_Bx#R=rjl]rFP%ΉڒbD}34'ɧ=nM5_VB;;r7k:ֲEZ[7L,yK˒Tkxnϛt=x^X-!5f66M_AFl,of끙z躙z㕈7"K5V8ѪX@'iJlׇ vcMSl$Nj"@NPZ'm m,MɊ7l_QBW`|VXǗYHD/(t@.x[vָwG\h_%Ef˥G+')]I;ofW/rXB[cޮU6*mZA/v֤W륩[K5nz@[}hW=ӢF5{UsT3EN&u_A,5֤hYh4FbVOKRljHU嫶K+5 7QU@8ѿt[  e>[/ޤhSpuM#5(uZ9wq%ݖm7A->;o6hlOb?[@sDݱFbf<an/8`wޛlߤ.zɍ ;]unXt,?Jc|қ`κ -ZuEzimoNqf=e=l{M?|2=tQՅ~bҮ4Mh^ o5Ba4زl-n o5wln5Fv m|[?[=cȦ"Q[.1ZUmuՔ+`ݑ36@8ya("1O8yďKO>}OWjw퓏5wϓСCwX>6N6eff2à @ܨَ6鹧6zk,;4qSoبɓ'wIdlڊ׺β+'toU[S StK743wjc"[j6cOW=Wadlߴ|[н-ROo?='QIZyz[5;v|;Tz^~efVU5}zᕶZB//HW]˼q[hUUt;.M}lbmrNѢo 2ҹEevj( (xJ3׿3ճumm uJ.s@Z^+Uhܾxq1ːcXrB7y{@rKOxId|A-`;jӟԊ1|1u;Jom6ʧ:46n+^F7#%;Vh~ZB^{/#\Ťc߀k Up sCb[(쀭6vl7"b--n8~q^?,cE{ bMzE@H7#[RrGwlqm a%u{sWT<^ar*:oަejzgSfO#n-޶**jlMHUYYl4{C p#@@@ZwW L{uZ]sj(ܔe-SOvR@@pSďKOxaa_Z釧u@|'OJz@@`zR  )~t&dRh5&b8@eS) `E"M6E0M\}kotwB1@IDAT{\E@p#@@thyKǵnFmܸNWnPnSjkk'l*WMĂm)lObkTkR^&T-oV t>'{@R )@Pk0u)@!*VfhW[QjC'ڬ^\MSGe;osZph}תp * E943lOSI XͰ"Z՚iRƠ:Y|) @ 5 hO'Ә]/k ݻCۇdQ6T۔2@Z(ׯ*k+-k|~aAպg0~i?$  HA@ uFtkmA}5?Zղ/F['m#aU&iz}&jmТyY\WHI]͕!Mwf&MJ.SO f`Zh.*W{*KWET{ZpUBk TVݠ@i2%ڽFymWsZ4fȣQ\r}V6ti@6<>-ߞUʝU8'}dhm u\2nFays5 ./lCqیG?TbⶹqK5Jc4g($# 0(V E@`h Og:~{r#N͍ʲ=FX hu^zk{Nf(g x7(V:h^^TEKK!˃s򔞞d^iMQl\UtM*6m..KZm>۾4ͭԴ7)[Λi"OLu>y{} eeeki\fڟ,S"q[:O|! 0|cj@@`H ttOYC'ب/;9S be!K\Xi˵H,%GqhTrw4 LOa>֔G$?Z@fƪnZd "V[BnuUʛ3GsZA&{ەf?\]|RJO'iYvA͎9^S t#Qs܄",|Oy{Mc@#b&@]jilֿWzTnm >V^{AnoжHSfkl]sy^ldWų5VX{m"eR^zm]Yw:^.AhI[FB G" Uo l~^Us#ZnԖ}^|#-V=AKtĝi 7oRt mkP؋K~)_"?lS3ܪv۲"6=?ݷsWo~7\z ZA{X0`Z.U!lUOSc;i6]sޱBuTb.X8ckыy|\)ۏ!  ~ԟ'~\zǥ'ܾ5O>vputwϓСCwX>6N6y<pvbܯƏE}&S_ MSukllɓ&V=8]/'7&]UʎTk/j-Δhppc[R6ޭޟ{f!)lsWjݢbn+M|sn١ r;o5RЦۦ-\UAҹEzЭ^ۮ]Z+Jmm,1Օ5+>UܰBqsnI[Xۮ}ZҔ9i^v(Wخ[﫸kG7ܦG=?]-Urz߭7Wj)?s=}sF6ĹąnRǶٴӺx*+^P hMn/( vtK .G8]dx@RWtj2ۛ@:`ք1t/nz vEu.~cqon7Gjl- hy5sWЏc= CYbC@8 Z#ղ TSB"ki)oTB4@# @@SK 7[w2NtS7-H.M~:@z^"@P]?hW1B|>leMШ䋧jlUx&Ըtim(dE/Oݷy&_/i|y9`|@U釽p@hyKUWꗿ?&|ڸq~/zǂ[lu3 /RT^^V Nn +?/o­'ޣ U媉D'^5w"  /&2! ZG[ZttwHk:N^xμ+֜/h綧CRk,ѥH[ j4)c0FiIZnPZj2NBUTD܊  At@>h7^eXUѬI3awwZv׊ťZB~[m=6?_+/,hҸZ/ =tصI޿KswZl es_mxuAieݳJ-]_1?VT'ʼ6ܳ߻ŐS:b=GP+y~굡I{2lpfچUW)+,SM8|2UV +*)R4%6zҎ߃ =#&ݗ5VX=*i)iGa5թ;7y  0Tj   @Y^-G ;jwYvܮwdAPO}tlM̎sv}r,T MTsjIzh<,ԫf`YGԤǮʐ޻Ez&k]'7+sJ&UԸKzy+4aJVo?hҢޢ`- F)K`6:kЦ=5gE󶆫Vi}>)U )PY*]cTOWYp@bbBs@|t>gۨxpdpx_؂+t%р+뜋mtjMepčUVgom 匏aWTZܒP~^wh@+ Mf$FsE姻?Њ2;ޟ/yڦuk,-ʻ輇 {)]j','z#65iHTySy} >i :j% ][eu~׃s򔞞dXĪ;{ЕÆ  -ZC?h  *0<cG a55oWh̨~\+i^|!Q*V卤H Ǧ)r-]jի!virlw[(|>غ!>]q짛zFtw4Fk X<ͲڨքB׏|n -|nͷkՔp٥7G"jh߭kת }i7!F3UnYb0?f^0̕mV  0Tj ՞] @z׵X);M˻ՆM`vm:璂_'Ԅѹs #OmA+;jkΝaϊ4HX۶^lUųX58|IF|E6oo{52}xA}\קt?ك\XZ-bIFkTA[iuű*ué;SlhŖ=E-)ҺklXn|ٔ+K}_6/61s4 BmSjtSswPn6[oGe㮟P[dٷl r+7ާcv])3WS"obW.ULӴZ{TFsCڿUis 4`Mfs_+r.e}b.WQ^T{2rwۮ]Z;J4^INѤi iS#b! ~T'~r|Os>'@\;I\tС;,@[[233OA@+s@mߘqFM<{@}E֋74mt؁tôi֪i[T~[pV\MǙankЊ+ 4g^8Kfi=}lمn.yyCZw7'RIA@ 0lذ{ǭ9aq1'~?=}%\s?-+]ےi^J@H`Ԙq7H[oSmV樈l\Ɂ>N`Vo[⛖ b_}\}K:^uԲܛMOl&~[@kՖߟ<}u@@`0j *e" kBv$ݎh#6WU˼ Ӂ] :2~VqY:`cgkrllV'  '(0u%'T?ďKO>}O)._|z! `<-.I) Oԃ  8` :Aoڷ%aߖΈ|>zc} lm"̓SV~8 (@A@hyKUWꗿ?-IEu=)ycWM)o<uno4jpo5/W~^\O\5(`(@"@P ' G[Zttw'zbO8}JPewx8hNYPKK#XD h4)#ܟhuefĿQ6+\vJCĢ9F@A!4@>nf}YV&[_׻>&={R~isq--k|~aAF6{fEsH\z2cyVؽO_skK/*XXǾ٧mgIYG[W,jb~!b7v|ϒ=SvB}miomhPuU~2Մ>2UV+*)RLפUKekex`ivOuȪh,v͡UVOJeZj;_QksX uujڷ{;7y  0Tj   @Y]jz>icWdkseHSݢYIR-,3:CS/ĜZmZ4O#+5:iU~9?SXWuMzE^Pˍ;s'z!]7[55'Z+i~<ٖg]6Ae6.E}5~j4̰66qyݏm+58,IPrԪfe ȨUYZ\јU 5lڴR+WjZu]UҪЊUv.|֬ M[{V= yW|ŦP fj6˺f H+BV  0t7 ! &pF^axNsr#.Y{*?PN{vmi)._kÁzMߴjKB=oWKF/{"ZۥoUgͻJ ;QTqyt.ҼߕoLV1pae [g+;.xTC%I6ʿ4]s侮'eiΔBWAxz5f'"ǎwƮ tE#<_\,sG0[lw#laQ:+P34UY >ͻ[XR-|Vi51V@->َo䇂u{-l[-^cPm}-/͢UKUQF%7`ɧdg3qͰ,̼*vhʛ]pDڵYJ_l[-R؂ejmQ@U)@@OC`X?*M?Nǃc.=ғin>]sc7,~$y.:t SFMtl p Q5Zvoғ};)H]b].u=~ccc&O?pc[Re򽶨|Dt5ŝbGSowD).*d^u{FyPf[~_YT=:sjͻ1,5VgQ*-#M~_ױ=0x~U[3ja-&[P,菎jn̂iZxپ2ΨTK(4^:@+kM*˵4P(|oΊhIfhkKHMuvJvj( ( 5RpL Ei i}ˢ?7#@}K־W:'rY!ŚZ;Em V:-MckjPɕCIIW&*Fe[wTDz z6p@8QZ'*}  pZ ioؘٚ\<[&8-@@OX' Nu  9ӃZ6=# [ @@@@ REc@@@@A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@    @ J.    x@@@@RNVu F@@@ ;    rRh0    A-@@@@ r]F@@@@j    A2    @Pw@@@@ j\`@@@@Z    )'@P+庌#   @@@@H9Z)e4@@@@`  :iiihc'OGe  WZ"     5d    WVȇ    0dj !     _)!    ZC+h    @jW|    CF֐     _Z"     5d    WVȇ    0dj !     _)!    ZC+h    @F7#@@`h4jx-F>AϚ^]eu >!)֦w}Wϟ:eM0A9r`\eE?^Kö㺗'/uh]5F7ϹPL?)֏ď_.=ғingx'@ϥx}Fqc ᣇcу_{` S&{ァ&`ɨQD8|۽矯:ko.uݣOG؇n=zTGaG l 6^z>GQl?Gď=}%\s?-+]ےi^J@!,F VMsCi=*Epj<O*~Z'NTZZHh6pǎ d7T^^ާ|Fh96\GpDq?vqiu??}Z~@-W4jĨ~' q?}Qn瞫~^p#F3o{Fo~Ii'މPpS@@ EtO_SD3h-.;%@`PZcƌ!5(S <\ \PQ>8]|ܥZivlCZCh  [GZ{tQ6HmZ@@>eZr` qCH     ?Zs"     5:    OVȅ   "LL8's3" @*|QKϪ=k{I~:Q}鵺tpzS~xM@TvR}#]6v|s~hhמ}e_dikWHc)_Hwji]<}䌍Vxue^/5ܮ=KW-{}V)uH#}s:K*'!P7/y re|kd]q^ƍ&@lzSlg{yl((C{a͟bt u:2ψ pz SȞޭAQW=ֲ7t{V~jX0cKQΙyE%[HhŋfN׽fbnt&|v{K,X~wwggGm-~@6mX`e)tm ]=%u_) N!=\jL.;! վ }so\ Kzp:\9ѽw@v~n/x/vءH$.Hcƌ9R-sTus>OV_] xΙ"wOMxtyNA@8oLyGF#mÚplRdM_o䋺'z~VsZ_|?H?l^3@yAt唱:^[tzq5[AݗS^FR'j=:Z#ڢ7=Ojӆ;Z_Yǫb e{"Ej߸E):p`|cz6{:||OSz:7G0iiiѓO>E}B~5^@ ,4ۂJ眭;/ح{^vt֐ZMoժ]M3^O^ۮo[8B`j &E! 0ڏV:kٿRј*{tIZ:Cd~`ӉvԻ睭Տs׳~wr͋vDJxo|-/Uxo|z+ܿ j_Qh(P=o?qL?(/k2G}35^wo^b\_=C}n؝ǂ="t5wXem,>*6{A%bxKPTEƤ]6jgtM76+®wϘ1j[S[cH])]X a5*tw]qJ{Ve}4z}^wl]yo}5}Lg-%qٶ7г뱇7z[[gy}|ѷto~p:w}FO}Wnk}mK(>VKzvڸG|C/_l.Ok`>IDAT/l~ު . z>f g|6sB_iIؼ+>5q]#3կwӅg؟?|UW(TU1}1s]ue/'>Ah@=G^=CmguƸtKhѷfO\`_mڴ~j~rt?> @"\Tg>6_pĴhQ?\ƤNXァ<6-~V6QϛeEvٿiK {a_*v:Xza]ﲵ[}ukxCӵJ_ Shy=SsbۛkgRyﶯ{-&t߾x]ױ6mKFU"t:K6uzþ}ojׂ r[o}͑ ?Qj{xwxDYlh_|D}N ]-/H.>kujOQᆱH$.^z)%ld.}WMR3ҦZ/xPxDFk֟Moֻ쿏gѬ bl-nғsZ:Ɯup>ߍҼ huf{W;}dѸγF3ηv[um[@˚{P>?jF?~y5Kců?5@@S_*أxr㬾~pѩO>lL(ߏ[JkW?ܫY_T]ue_К2:rW\F]řsxGԯS)}fI6yWF{5#ⷱ?}r|nx߆U[`Vޫr~Mz*6՛[+KǏozW(" *huqcGWʗPwyXo;az7zJX<[X\h߾jk?˞gʶaS[zj_cu-WanVf,}@S@Ɵ=ZDiW(R<]BU(XPGt -:K_dv轈=V(bj-@Cv=ùޟiIWNs=WwSz{ agAqgrl}o~?(>./a#T~Ц0ѴiY&]6`~F@FS%#ޖȧ9KpB6i_.y{^xOWOv~̋Tf#.vy{e#ⷱ?5jS! Ѝ!Ц SHΑY7EW}隺Î^>ׂZ9~њu6Btm{>kcĺ{yw3jk,(X{\Ur}m߬߾BxlHoeطQwU|WYGLM}W*d#^Fא:QQ7cٛoTNbv`dEFQv<݂t~/86V_UdA-ޕ}V?dS0Z[W>:&/i uV[ϿE-t j[pyW>wېܟi#-Խ|5?w^ 'l yPg\8Wr5iKjx5oq.}n|#ton6>gSEj椳3tY#t޹YUy~HA0D!/A蠥 84զ쩖bL)L tUC7 SUt+8ʠ](%LIA00*h"aKWM{ܡvSч44ژ]8Tkn>cA n3 @q|nmnDC;ƛ>wM[>ƿr#/*UttbggiM<+Wu))?6z?ڔI[|rY?̴xq~0Sk/u-]VYNi ͼĈ[;?5W6|$?6uXZnyeGK+L6}}St̯M(hsܔgSK_^N:7^A=1>x_C~q~>Uem;'WVĹW|z:bUݗ?V>eJ'[ߝ.tu_I9+9+'cʕ/GJ?uO{o:9}]H< OO ޢ#=tbf?6{7FCN<.g:0VgBrm t,v<6MOcGgKOhՆx}C/_XݱO?ڷ]NU#j#֧{=ݽ=򳏦9~oY:]iCldom/{XZhla|'BO7nH?o-^5禓VYW믽6]Y׷{ޙ3}l=q?K|?t~,s'lID73?ZvTθ/'uvTwP;Zˤ{Mv;5_ݑk)ڿLl讲'wItU:yX~}?Ov6쟖>?cJw^:[V. P zhʡ/?tɿ:|%=c ejh΍{x~KΫ^90ǥ&VrzMo8/g+B"}٩c귤]zHeYg/Oߚqn:u,?Ր?o (W|`y>>yd㚴4N6qEMKknJ7uy/V$J[w|\cK#qO{?Vs o"ݔ?`q|;%}濮IMñnM~1?zkRi>W8M]r%9wx*?XsfQ)}s_i爍;*NO }ܹ}&eÃ.tuv`a't痯I{NO_zr3ы^Ήo@袋7$7p.t٧o,6?qBJ/{Y:bm~Ϗ+Yoym5zi+Sq}N{:=>=?M}|Njޘk6ϥ:4]oQI\)ۏ.OdY?ߒڦE .i3 '>gaە~{妿 ,o\s韮$.tWN:i7oҚVJ~)"I/^uEg/ύ>kytV܊r%sBcKy2>u/e_:]U LөKs^8Ϥٟ.^2_G[>4_!"IlhI7>?l.x㍝㶻7~,5ﯻ*}W9geam?ߖ-V t ;zyr/C9$5ƺv^y邳4m>t<')m^4N]nh姚̽t!3'ֳmm~lLq3XcnI2&tf-}=]|ה5o۶\ǀ!#GB#p8qo KߔV'l+=τjNHo_qjzŁ3~z:߿yzcVޖ?~ KⅹAwM}mvZі緤otC`֭ZDqiŋӒJFswlM[=~lX[yչ -IKjͣP[s{6{{[ׯMwt}_[>xfw_~pmõ zjMmmҀ:+|~53%qWnvX+>ͬA^y=yOz[8m?qZjX977_|Ћszn[}۟G柤;ZvXzrr^̟ݵ^2M=$6o~si1oiwu+H;u!as_$OW)nw8u??#([;/t|e,]C\|?y˕!@InQ-G]ztʊ-M?zz:S '}:]vz{nh%q1>YFг^ ?M{ܻ/roӦeaÝMW|ixjE%gN]g6K~ۙ)woqn`!;핆wӟtS[yܛ^c{LZ^kmOwhꜿLGjs~rg6 j#An&@Sk? a ,zEsׯaWa 0 wMzY;%?rcW,Y93Y D錱E˷/ErYmhj!@xϥnC`^XrU`e%-9%]p) Id@u9OfN1 @ @ 0Rhjb @ @"@S@ @ #@Skn @'wޟ^$߼g=eGwO @!1Ob tˎY>m۶yq- "oߞ-[.ω' _c52BR:3ӎ];@ ܽ33r*@`{Ovm/~mذ!)ƪv e/Zq% @CCoP: ^Hz1ww΀ P#066^Wz(m޼9G}ZbEZh>'.:9^I!' ;vй#p@[5KxH/ckMA9?8仦Z[q+e@`yz@`0On{2p [~6qTM@o9Zjhwq}ϣXO<~_/L#tz:Ko;ܗ -z7'KO=˓沷r':Ciy8C]S}~lƾc{lӡ:'߇4YJ(m:勛SXcj iH2&t,չiES+`,l4!@ "Zj1 @ @ 0Rhjb @ @"@S@ @ #@Skn @ @ @ @5r C @ g @ @`[Ɔ!@ @hj3@ @ 0rhj-c @ @4 @ @94Fa@ @ Z @ @ Z#w0 @ @M-~ @ @FMel @ @? @ @#G26 @ @ @S@ @ #@Skn @ @ @ @5r C @ g @ @`[Ɔ!@ @hj3@ @ 0rhj-c @ @4 @ @94Fa@ @ Z @ @ Z#w0 @ @M-~ @ @FMel @ @? @ @#G26 @ @ @S@ @ #@Skn @ @ @ @XMFa@ @ 032 M ݇ohB @ D GF^'jXtm I/!@ @B&CZx_6 !^C @ ̌@ԯ>39{.ZMV3{NkCω@ @ &{"~Ϝa.ZM]L~6|6; @ @F@[ĹټFY8O\l^PS)@ @)A!ehK1[MYT:_|ƺ8W3K,c!@ @ 8蠃y&eĻ}k5jujj䠐bAX+OuϞ=5e @ 'u V+NVʧI>vklP̾AAn'xFmrZϕqH>ˇdOk1޵Κ{D @ C 6$*s5P,=|)swgJ5V~47> @ @Tg?Z>bC+۶\35#jqz&l5ؐjzX'V7kj Dz~g-~-|Q\, @ @ { jWpޱ5[ 6/v6Ş|^7jԪX D-/P6c&&VSN,[7e}4鵼Z @ ,,O+&[V6N뗺4þrq7E5ltԊ'бuαhm:MXus\xcw,Ú)ù)" @ @ &9VuK<'Q~>^Ch2.ugd窩U۔. 6y|A*vhͨnR|Vy/Ω^uFٷVLmc!@ @XWX~غllB|i>\X#Iy4JN/h=?4ScFW̒桹iHwξUk51:g@ @ PAfE}i/c/Xkck+u_4۪n T0Q}[|VW\NM)^n[ʵֽuYw^!@ @XHSҬۏVs爚㚵z1Vq&?/7MC| ʆ5oy)5ϱknp59[jlJwum/Qڮ}u.j @ ,᫶Zl=7l/C#sMjW4Nr<8Ϻs6:qS9[͋cY 4\cI,ksɚ뜳鈱Ρz}^9{mk(aۍVA @ 0JK5\czG3&_|הSt֣mźFN6Lܬzڤ}W^ϹFZe]cQ64GZY ǥIk5, @ @ їZͷ&4}x \:ZJ_thcm7;9sVrN7FP97ֹsW%Xo]Vsz?V빮}Ϗ6{#flgM֚;֣ژ`7TPξS'{ΈtNiM6:1 @ E= _ul;:n`i}Y J]q5<~͏hjiCnē[/kjub}5 X{~xpJܔSkVj @ @$PB׬5!߱:7}Yek5mkV4vW'aZ:頍8'nBtAU3+㜬nz,5k>Cٗp܍&_wMUx @ @DYplu^~S]m-U#jwxNlZ @ 6&Q[.WL:W5~f A߫W^v^m-4@ @ Ћ~镏{6Λ4kG?ԔSA @ @0~SksfA4H Z{iZ @ E`D3H s~̠{;z @ @`.̴4A⚧9*a9i^ @ s0va2Mln' @ @Հu*[}i>4v5]fE@ @Fj. ڨ5'?, @ @'0 Y͟x͵{@ @"0WmOzfu. @ ̌jJ !@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`_U_m#IENDB`pgcharts/src/000077500000000000000000000000001315737174100134715ustar00rootroot00000000000000pgcharts/src/config.lisp000066400000000000000000000170771315737174100156430ustar00rootroot00000000000000(in-package #:pgcharts) (defvar *config-filename* "~/.pgcharts.ini" "Where to store pgcharts configuration.") (defparameter *dburi* nil "PostgreSQL database connection.") (defparameter *listen-address* nil "Which address to listen to, defaults to nil, meaning *.") (defparameter *listen-port* 9042 "Port bound by the repository server, exposing the HTTP protocol.") (defparameter *pidfile* "~/.pgcharts.pid" "pgcharts pid file") (defparameter *logfile* "/tmp/pgcharts.log" "Main logfile for pgcharts") (defparameter *document-root* (asdf:system-relative-pathname :pgcharts "web/")) (defparameter *js-root* (asdf:system-relative-pathname :pgcharts "web/js")) (defparameter *bootstrap-root* (asdf:system-relative-pathname :pgcharts "web/bootstrap-3.1.1-dist")) (defparameter *images-root* (asdf:system-relative-pathname :pgcharts "web/images")) (defparameter *highcharts-root* (asdf:system-relative-pathname :pgcharts "web/highcharts")) (defparameter *codemirror-root* (asdf:system-relative-pathname :pgcharts "web/codemirror-4.5")) (defparameter *d3js* (asdf:system-relative-pathname :pgcharts "web/d3js/d3.min.js")) (defparameter *hallo-root* (asdf:system-relative-pathname :pgcharts "web/hallo")) (defparameter *fontawesome-root* (asdf:system-relative-pathname :pgcharts "web/font-awesome-4.2.0")) (defparameter *header-path* (asdf:system-relative-pathname :pgcharts "web/header.html")) (defparameter *footer-path* (asdf:system-relative-pathname :pgcharts "web/footer.html")) (defvar *serve-from-cache* nil "Set to t to serve static resources from in-memory cache.") ;;; ;;; System integration: configuration file. ;;; (defun expand-user-homedir-pathname (namestring) "Expand NAMESTRING replacing leading ~ with (user-homedir-pathname)" (typecase namestring (pathname namestring) (string (cond ((or (string= "~" namestring) (string= "~/" namestring)) (user-homedir-pathname)) ((and (<= 2 (length namestring)) (char= #\~ (aref namestring 0)) (char= #\/ (aref namestring 1))) (uiop:merge-pathnames* (uiop:parse-unix-namestring (subseq namestring 2)) (user-homedir-pathname))) (t (uiop:parse-unix-namestring namestring)))))) (defun set-config-filename (namestring) (setf *config-filename* (expand-user-homedir-pathname namestring))) ;;; ;;; Defaults, organized in sections, with proper use facing option names ;;; (defvar *sections-variables* '(("pgcharts" ("dburi" *dburi*) ("port" *listen-port* parse-integer) ("address" *listen-address* parse-listen-address) ("pidfile" *pidfile* check-file-path) ("logfile" *logfile* check-file-path)))) ;;; ;;; Turn CL list of lists into INI files and back, and also take care of ;;; changing the dynamic variables values. ;;; (defun read-config (&optional (filename *config-filename*)) "Read the FILENAME INI file and set the special variables accordingly." (when (probe-file filename) (let* ((ini (ini:make-config)) (conf (ini:read-files ini (list filename)))) (loop :for (section . options) :in *sections-variables* :do (loop :for (option var check-fun) :in options :when (ini:has-option-p conf section option) :do (let ((value (ini:get-option conf section option))) (setf (symbol-value var) (if check-fun (handler-case (funcall check-fun value) ;; allow reading broken config (condition (c) (warn "Validation function ~s failed on ~s: ~a" check-fun value c) value)) ;; no check, just use value value))))) conf))) (defun write-current-config (stream) "Write the current configuration of pginstall in STREAM." (let ((config (ini:make-config))) (loop for (section . options) in *sections-variables* do (progn (ini:add-section config section) (loop for (option var check-fun) in options do (ini:set-option config section option (symbol-value var))))) (ini:write-stream config stream) config)) (defun save-config (&optional (pathname (expand-user-homedir-pathname *config-filename*))) "Save the current configuration of pginstall in FILENAME." (with-open-file (s pathname :direction :output :if-exists :supersede :if-does-not-exist :create :external-format :utf8) (write-current-config s))) (defun config-value (option-name) "Get the current value of the given OPTION-NAME." (loop :for (section . options) :in *sections-variables* :for value := (loop :for (option var check-fun) :in options :when (string-equal option-name option) :return (symbol-value var)) :when value :return value)) (defun (setf config-value) (newvalue option-name) "Set configuration variable OPTION-NAME to NEWVALUE." (loop :for (section . options) :in *sections-variables* :do (loop for (option var check-fun) :in options :when (string-equal option-name option) :do (progn (funcall check-fun newvalue) (setf (symbol-value var) newvalue))))) ;;; ;;; pidfile reading ;;; (defun read-pid (&optional (pidfile *pidfile*)) "Read the server's pid from *pidfile* and return it as a string." (with-open-file (s pidfile) (read-line s))) (defun kill-pid (pid &optional (sig "TERM")) "Send given SIG to Unix process PID." (multiple-value-bind (output error code) (uiop:run-program `("/bin/kill" ,(format nil "-~a" sig) ,pid) :output :string :error :string :ignore-error-status t) (declare (ignore output error)) (= 0 code))) ;; ;; Validation functions ;; (defun check-and-make-directory (value) "Check that VALUE is a valid pathname and create a directory if it doesn't already exists." (ensure-directories-exist (uiop:ensure-directory-pathname (expand-user-homedir-pathname value)))) (defun check-executable (value) "Check that VALUE is the pathname of a valid executable file." value) (defun check-file-path (path) "Check that we can open a file at given PATH." (let ((expanded-path (expand-user-homedir-pathname path))) (ensure-directories-exist (directory-namestring expanded-path)) ;; then return expanded path expanded-path)) (defun check-log-setting (log-threshold &optional (default :notice)) "Read a log threshold setting from CLI or INI file" (let ((threshold (find-symbol (string-upcase log-threshold) "KEYWORD"))) (if (member threshold '(:panic :fatal :log :error :warning :notice :info :debug :data)) threshold (progn (warn "Didn't recognize log threshold ~s, using ~s instead." log-threshold (symbol-name default)) default)))) (defun parse-listen-address (listen-address) "Change * into nil. Don't try to double-guess hunchentoot on what is a proper CNAME or IP address (ipv6 etc)." (if (or (string-equal "NIL" listen-address) (string= "*" listen-address)) nil listen-address)) pgcharts/src/front-db.lisp000066400000000000000000000034221315737174100160760ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Database objects browser. ;;; (defun front-browse-database (dbname) "Not Yet Implemented" (let* ((qdburi (with-pgsql-connection (*dburi*) (db-uri (get-dao 'db dbname)))) (table-list (with-pgsql-connection (qdburi) (query " select nspname, relname, relkind, string_agg(a.attname, ', ' order by a.attnum) as cols from pg_class c join pg_namespace n on n.oid = c.relnamespace left join pg_attribute a on a.attrelid = c.oid and attnum > 0 where n.nspname not in ('pg_catalog', 'information_schema') and relkind in ('r', 'v') and has_table_privilege(c.oid, 'SELECT') and pg_table_is_visible(c.oid) group by nspname, relname, relkind order by nspname, relname" :rows)))) (serve-page (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h2 :class "page-header" (str dbname)) (:div :class "table-responsive" (:table :class "table table-stripped table-hover" (:thead (:tr (:th "Schema") (:th "Table name") (:th "Columns"))) (:tbody (loop :for (nspname relname relkind cols) :in table-list :do (htm (:tr (:td (str nspname)) (:td (str relname)) (:td (str cols)))))))))))))) pgcharts/src/front-main.lisp000066400000000000000000000053261315737174100164420ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Main dashboard ;;; (defun list-queries (query-list &key (title "Queries")) "Return a whole web page for the QUERY-LIST." (serve-page (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h1 :class "page-header" (str title)) (:h4 :style "color: red;" "Warning " (:small "The delete action requires no validation.")) (:div :class "table-responsive" (:table :class "table table-stripped" (:thead (:tr (:th "") (:th "Query") (:th "Database") (:th "Description") (:th "Chart"))) (:tbody (loop :for query :in query-list :do (htm (:tr (:td (:a :href (q/url query) (:span :class "glyphicon glyphicon-edit" :style "color: black;")) " " (:a :href (q/del/url query) (:span :class "glyphicon glyphicon-remove" :style "color: red;"))) (:td (:a :href (q/url query) (str (format nil "~36r" (qid query))))) (:td (str (dbname query))) (:td (:a :href (q/url query) (str (qdesc query)))) (:td (:a :href (c/url query) (:span :class "glyphicon glyphicon-stats" " " (str (chart-type query)))))))))))))))) (defun front-list-queries () "Serve the list of SQL queries." (list-queries (with-pgsql-connection (*dburi*) (select-dao 'query t 'db 'qname)))) (defun front-search-queries () "Return a list of queries loosely matching given TERMS." (let ((terms (hunchentoot:get-parameter "terms"))) (list-queries (with-pgsql-connection (*dburi*) (select-dao 'query (:or (:~* 'description terms) (:~* 'sql terms)))) :title (format nil "Queries matching regexp: ~a" terms)))) pgcharts/src/front-notebook.lisp000066400000000000000000000007401315737174100173310ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Frontend for editing a notebook, thanks to Hallo ;;; (defun front-new-notebook () "Return the basic HTML for a new notebook" (serve-page (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:div :class "editable" :contenteditable "true" (:h1 "Your new SQL Notebook title") (:p "Edit your text here, whatever you want"))))))) pgcharts/src/front-query.lisp000066400000000000000000000341211315737174100166560ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Frontend for query editing and result display (text or graph) ;;; (defvar *chart-types* '("Raw" "Column" "Bar" "Pie" "Donut") "Known chart types.") (defun front-edit-query (&optional qid form-style) "Return the HTML to display a query form." (destructuring-bind (&key q ((:d dbname-list))) (with-pgsql-connection (*dburi*) (list :q (if qid (get-dao 'query (parse-integer qid :radix 36)) (make-instance 'query :dbname "" :qname "" :description "" :sql "" :cats "" :series "" :xtitle "" :ytitle "" :chart-type "")) :d (query "select dbname from db order by 1" :column))) (when (string= "Raw" (chart-type q)) (hunchentoot:redirect (q/raw/url q) :code hunchentoot:+http-moved-temporarily+)) (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h1 :class "page-header" :style form-style "SQL Query") (:form :role "query" :id "run-query" :method "post" :action "/q/save" :class "form-horizontal" :style form-style (:input :type "hidden" :id "qid" :name "qid" :value qid) (:div :class "form-group" (:label :for "dbname" :class "col-sm-3 control-label" "Database name") (:div :class "col-sm-9" (:select :id "dbname" :name "dbname" :class "form-control" (loop :for dbname :in dbname-list :for on := (string= dbname (dbname q)) :do (htm (:option :selected on (str dbname))))))) (:div :class "form-group" (:label :for "qname" :class "col-sm-3 control-label" "Query name") (:div :class "col-sm-9" (:input :type "text" :name "qname" :id "qname" :placeholder "Enter query name" :class "form-control" :value (qname q)))) (:div :class "form-group" (:label :for "qdesc" :class "col-sm-3 control-label" "Query description") (:div :class "col-sm-9" (:input :type "text" :name "qdesc" :id "qdesc" :placeholder "Enter query description" :class "form-control" :value (qdesc q)))) (:div :class "form-group" (:label :for "cats" :class "col-sm-3 control-label" "Categories (x axis)") (:div :class "col-sm-3" (:input :type "text" :name "cats" :id "cats" :placeholder "Enter categories column name" :class "form-control" :value (qcats q))) (:label :for "xtitle" :class "col-sm-2 control-label" "X Legend") (:div :class "col-sm-4" (:input :type "text" :name "xtitle" :id "xtitle" :placeholder "Enter categories legend" :class "form-control" :value (xtitle q)))) (:div :class "form-group" (:label :for "series" :class "col-sm-3 control-label" "Data series") (:div :class "col-sm-3" (:input :type "text" :name "series" :id "series" :placeholder "Enter data series column name" :class "form-control" :value (qseries q))) (:label :for "ytitle" :class "col-sm-2 control-label" "Y Legend") (:div :class "col-sm-4" (:input :type "text" :name "ytitle" :id "ytitle" :placeholder "Enter series legend" :class "form-control" :value (ytitle q)))) (:div :class "form-group" (:label :for "query" :class "col-sm-3 control-label" "Query SQL") (:div :class "col-sm-9" (:textarea :id "query" :name "query" :rows "25" (str (qsql q))))) (:div :class "form-group" (:div :class "col-sm-offset-3 col-sm-2" (:button :id "btn-run-query" :class "btn btn-success" :type "button" "Run Query")) (:label :for "chart-type" :class "col-sm-3 control-label" "Default Chart Type") (:div :class "col-sm-2" (:select :id "chart-type" :name "chart-type" :class "form-control" (loop :for type :in *chart-types* :for on := (string= type (chart-type q)) :do (htm (:option :selected on (str type)))))) (:div :class "col-sm-2" (:button :id "btn-save-query" :class "btn btn-primary" :type "submit" "Save Query")))) (:script " var myCodeMirror = CodeMirror.fromTextArea(query, { lineWrapping: true, lineNumbers: true, styleActiveLine: true, matchBrackets: true, mode: \"text/x-plsql\", theme: \"elegant\" });")))))) (defun front-query-result (&optional (title "Query Results")) "Display query result, with tabs for different charts types." (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h1 :class "page-header" (str title)) (:ul :id "charts" :class "nav nav-tabs" (:li :class "active" (:a :id "raw" :href "#raw" (:span :class "glyphicon glyphicon-th" " Raw Results"))) (:li (:a :id "column" :href "#column" (:span :class "glyphicon glyphicon-stats") " Column Chart")) (:li (:a :id "bar" :href "#bar" (:span :class "glyphicon glyphicon-align-left") " Bar Chart")) (:li (:a :id "pie" :href "#pie" (:span :class "glyphicon glyphicon-dashboard") " Pie Chart")) (:li (:a :id "donut" :href "#donut" (:span :class "glyphicon glyphicon-record") " Donut Chart"))) (:div :id "qresult"))))) (defun front-new-query () "Allow user to enter a new query." (serve-page (with-html-output-to-string (s) (htm (str (front-edit-query)) (str (front-query-result)))))) (defun front-display-query (qid) "Allow user to run and edit a known query." (serve-page (with-html-output-to-string (s) (htm (str (front-edit-query qid)) (str (front-query-result)))))) (defun front-display-query-chart (qid) "Display only the #qresult pane for given query." (let ((q (with-pgsql-connection (*dburi*) (get-dao 'query (parse-integer qid :radix 36))))) (serve-page (with-html-output-to-string (s) (htm (str (front-edit-query qid "display: none;")) (str (front-query-result (qdesc q))) (:script "doit = true;")))))) (defun front-fetch-csv-data () "Given an SQL query and a connection string given as POST parameters, return the query result-set as CSV data." (setf (hunchentoot:content-type*) "text/plain") (let* ((dbname (hunchentoot:post-parameter "dbname")) (query (hunchentoot:post-parameter "query")) (qdburi (with-pgsql-connection (*dburi*) (db-uri (get-dao 'db dbname))))) (handler-case (let ((data (with-pgsql-connection (qdburi) (query query)))) (with-output-to-string (s) (loop :for row :in data :do (format s "~&~{\"~a\"~^,~}" row)))) (database-error (e) (hunchentoot:log-message* :error "condition: ~a" e) (with-output-to-string (s) (yason:encode-alist `((:sqlstate . ,(database-error-code e)) (:message . ,(database-error-message e)) (:detail . ,(database-error-detail e)) (:hint . ,(database-error-hint e)) (:context . ,(database-error-context e)) (:query . ,(database-error-query e)) (:position . ,(database-error-position e)) (:cause . ,(database-error-cause e))) s)))))) (defun front-fetch-json-data () "Given an SQL query and a connection string given as POST parameters, return the query result-set as CSV data." (setf (hunchentoot:content-type*) "text/plain") (let* ((dbname (hunchentoot:post-parameter "dbname")) (query (hunchentoot:post-parameter "query")) (qdburi (with-pgsql-connection (*dburi*) (db-uri (get-dao 'db dbname))))) (handler-case (let ((data (with-pgsql-connection (qdburi) (query query :alists)))) (hunchentoot:log-message* :error "data: ~a" data) (format nil "[~{~a~^, ~}]" (loop :for row :in data :collect (with-output-to-string (s) (yason:encode-alist row s))))) (database-error (e) (hunchentoot:log-message* :error "condition: ~a" e) (with-output-to-string (s) (yason:encode-alist `((:sqlstate . ,(database-error-code e)) (:message . ,(database-error-message e)) (:detail . ,(database-error-detail e)) (:hint . ,(database-error-hint e)) (:context . ,(database-error-context e)) (:query . ,(database-error-query e)) (:position . ,(database-error-position e)) (:cause . ,(database-error-cause e))) s)))))) (defun front-save-query () "Save SQL query as given by form." (let ((dbname (hunchentoot:post-parameter "dbname")) (qid (hunchentoot:post-parameter "qid")) (qname (hunchentoot:post-parameter "qname")) (qdesc (hunchentoot:post-parameter "qdesc")) (query (hunchentoot:post-parameter "query")) (qcats (or (hunchentoot:post-parameter "cats") :null)) (qseries (or (hunchentoot:post-parameter "series") :null)) (xtitle (or (hunchentoot:post-parameter "xtitle") :null)) (ytitle (or (hunchentoot:post-parameter "ytitle") :null)) (chart-type (or (hunchentoot:post-parameter "chart-type") "Raw"))) (with-pgsql-connection (*dburi*) ;; basically insert or update, depending on whether we already have a ;; query id or not. (let ((query (if (and qid (not (string= "" qid))) ;; update existing query that we have the id of (update-dao (make-instance 'query :id (parse-integer qid :radix 36) :dbname dbname :qname qname :description qdesc :sql query :cats qcats :series qseries :xtitle xtitle :ytitle ytitle :chart-type chart-type)) ;; create a new query in the pgcharts database (make-dao 'query :dbname dbname :qname qname :description qdesc :sql query :cats qcats :series qseries :xtitle xtitle :ytitle ytitle :chart-type chart-type)))) ;; and now redirect to editing that same query (hunchentoot:redirect (q/url query) :code hunchentoot:+http-moved-temporarily+))))) (defun front-delete-query (id) "Delete given query then get back on the listing page." (with-pgsql-connection (*dburi*) (delete-dao (make-instance 'query :id (parse-integer id :radix 36)))) ;; and back to the listing (hunchentoot:redirect "/" :code hunchentoot:+http-moved-temporarily+)) pgcharts/src/front-raw-query.lisp000066400000000000000000000133141315737174100174460ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Raw query allows to easily play around with a SQL query without having ;;; to actually prepare and setup all the Charting jazz. ;;; (defun front-raw-query (&optional qid) "Return the HTML to display a query form." (destructuring-bind (&key q ((:d dbname-list))) (let ((dbname (hunchentoot:post-parameter "dbname")) (qname (hunchentoot:post-parameter "qname")) (qdesc (hunchentoot:post-parameter "qdesc")) (query (hunchentoot:post-parameter "query"))) (with-pgsql-connection (*dburi*) (list :q (if qid (get-dao 'query (parse-integer qid :radix 36)) (make-instance 'query :dbname dbname :qname qname :description qdesc :sql query :cats "" :series "" :xtitle "" :ytitle "" :chart-type "")) :d (query "select dbname from db order by 1" :column)))) (serve-page (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h1 :class "page-header" "SQL Query") (:form :role "query" :id "run-query" :method "post" :action "/q/raw" :class "form-horizontal" (:input :type "hidden" :id "qid" :name "qid" :value qid) (:input :type "hidden" :id "chart-type" :name "chart-type" :value "raw") (:div :class "form-group" (:label :for "dbname" :class "col-sm-3 control-label" "Database name") (:div :class "col-sm-9" (:select :id "dbname" :name "dbname" :class "form-control" (loop :for dbname :in dbname-list :do (htm (:option (str dbname))))))) (:div :class "form-group" (:label :for "qname" :class "col-sm-3 control-label" "Query name") (:div :class "col-sm-9" (:input :type "text" :name "qname" :id "qname" :placeholder "Enter query name" :class "form-control" :value (qname q)))) (:div :class "form-group" (:label :for "qdesc" :class "col-sm-3 control-label" "Query description") (:div :class "col-sm-9" (:input :type "text" :name "qdesc" :id "qdesc" :placeholder "Enter query description" :class "form-control" :value (qdesc q)))) (:div :class "form-group" (:label :for "query" :class "col-sm-3 control-label" "Query SQL") (:div :class "col-sm-9" (:textarea :id "query" :name "query" :rows "25" (str (qsql q))))) (:div :class "form-group" (:div :class "col-sm-offset-3 col-sm-2" (:button :id "btn-run-raw-query" :class "btn btn-success" :type "submit" "Run Query")) (:div :class "col-sm-offset-5 col-sm-2" (:button :id "btn-save-raw-query" :class "btn btn-primary" :type "button" "Save Query")))) (:script " var myCodeMirror = CodeMirror.fromTextArea(query, { lineWrapping: true, lineNumbers: true, styleActiveLine: true, matchBrackets: true, mode: \"text/x-plsql\", theme: \"elegant\" });")) (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h1 :class "page-header" "Result Set") (:div :id "qresult" :class "table-responsive" (when (and (qsql q) (not (string= "" (qsql q)))) (str (front-raw-result (dbname q) (qsql q))))))))))) (defun front-raw-result (dbname query) "Return the HTML string for the result of given query." (let* ((qdburi (with-pgsql-connection (*dburi*) (db-uri (get-dao 'db dbname)))) (data (with-pgsql-connection (qdburi) (query query :alists)))) (with-html-output-to-string (s) (:table :class "table table-stripped table-hover table-condensed" (:thead (:tr (loop :for (col . val) :in (first data) :do (htm (:th (str col)))))) (:tbody (loop :for row :in data :do (htm (:tr (loop :for (col . val) :in row :do (htm (:td (str val)))))))))))) pgcharts/src/front-tools.lisp000066400000000000000000000061201315737174100166470ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; General tools to render frontend code ;;; (defun compute-menu (current-url-path) "List all files found in the *DOCROOT* directory and turns the listing into a proper bootstrap menu." (when *dburi* ;; all the entries in the menu only work properly with a database ;; connection (that has been setup), so refrain from displaying them ;; when the basic setup has not been done yet. (with-html-output-to-string (s) (htm (:div :class "col-sm-3 col-md-2 sidebar" (:ul :class "nav nav-sidebar" (:li :class (when (string= current-url-path "/") "active") (:a :href "/" (:span :class "glyphicon glyphicon-filter" " " (str "Queries")))) (:li :class (when (string= current-url-path "/q/raw") "active") (:a :href "/q/raw" (:span :class "glyphicon glyphicon-pencil" " " (str "New Query")) )) (:li :class (when (string= current-url-path "/q/new") "active") (:a :href "/q/new" (:span :class "glyphicon glyphicon-tasks" " " (str "New Chart")) )) (:hr) (loop :for db :in (with-pgsql-connection (*dburi*) (select-dao 'db t 'dbname)) :for active := (string= (dbname db) current-url-path) :do (htm (:li :class (when active "active") (:a :href (format nil "/d/~a" (dbname db)) (:span :class "glyphicon glyphicon-folder-open") " " (str (dbname db)))))))))))) (defmacro serve-page (content) "Return the content with header and footer and menu, and handle errors." `(concatenate 'string (serve-header) (compute-menu "/#q") (handler-case ,content (condition (e) (with-html-output-to-string (s) (htm (:div :class "col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main" (:h2 :class "page-header" (:span :class "glyphicon glyphicon-eye-close" " Unexpected condition")) (:h4 :style "color: red; text-weight: bold;" (str (format nil "~a" e))) (:pre (str (trivial-backtrace:print-backtrace e :output nil :verbose t)))))))) (serve-footer))) pgcharts/src/image.lisp000066400000000000000000000001731315737174100154450ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Special code to execute when preparing the binary image. ;;; (setf *serve-from-cache* t) pgcharts/src/model.lisp000066400000000000000000000152751315737174100154740ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Tools to install our model.sql objects into the database ;;; (defparameter *model* (read-queries (asdf:system-relative-pathname :pgcharts "src/model.sql")) "The SQL model as a list of queries.") (defparameter *catversion* "20140828" "Version number for the catalog.") (defparameter *model-table-list* (sort (remove-if #'null (mapcar (lambda (sql) (cl-ppcre:register-groups-bind (table-name) ("create table ([A-Za-z_.]+)" sql) table-name)) *model*)) #'string<) "List of table names expected to be created by *model*, to allow for checking if the setup has been made.") (defun model-version (&optional (dburi *dburi*)) "Check that we find all our table definitions." (with-pgsql-connection (dburi) (let ((table-list (query "select nspname || '.' || relname as relname from pg_class c join pg_namespace n on c.relnamespace = n.oid where n.nspname = 'pgcharts' and c.relkind = 'r' order by relname" :column))) (if (member "pgcharts.catalog" table-list :test #'string=) (query "select version from pgcharts.catalog" :single) (when (equalp table-list '("pgcharts.db" "pgcharts.query")) "20140823"))))) (defun install-model-from-scratch (&optional (dburi *dburi*)) "Check that the given database connection DBURI contains the SQL data model as defined in *model*." (with-pgsql-connection (dburi) (with-transaction () (loop :for sql :in *model* :do (query sql)) ;; and an extra SQL statement is needed here (destructuring-bind (dbname &rest ignore) (parse-pgsql-connection-string dburi) (declare (ignore ignore)) (execute "insert into pgcharts.catalog(version) values($1)" *catversion*) (execute (format nil "alter database ~a set search_path to pgcharts" dbname)))))) (defun upgrade-model (current-version &optional (dburi *dburi*)) "Upgrade the database model by rolling out SQL upgrade scripts." (let ((script-name-list (find-update-path current-version *catversion*))) (loop :for script-name :in script-name-list :for queries := (cdr (assoc script-name *upgrade-scripts* :test #'string=)) :do (with-pgsql-connection (dburi) (format t "Rolling out upgrade script ~a~%" script-name) (with-transaction () (loop :for sql :in queries :do (query sql))))))) (defun ensure-model-is-current (&optional (dburi *dburi*)) "Check the current model's version and upgrade it if needed." (let ((version (model-version dburi))) (cond ((null version) (format t "Installing pgcharts database model.~%") (install-model-from-scratch dburi)) ((string/= version *catversion*) (format t "Upgrading pgcharts database model.~%") (upgrade-model version))))) ;;; ;;; Data Access Objects ;;; ;;; Allow to easily manage CRUD operations ;;; (defclass db () ((dbname :col-type integer :accessor dbname :initarg :dbname) (dburi :col-type string :accessor db-uri :initarg :dburi)) (:documentation "a database connection string, where to run queries.") (:metaclass dao-class) (:keys dbname)) (defmethod print-object ((db db) stream) (print-unreadable-object (db stream :type t :identity t) (db-uri db stream))) ;;; ;;; Save the queries! ;;; (defclass query () ((id :col-type integer :reader qid :initarg :id) (dbname :accessor dbname :initarg :dbname :col-type string :col-name db) (qname :col-type string :accessor qname :initarg :qname) (description :col-type string :accessor qdesc :initarg :description) (sql :col-type integer :accessor qsql :initarg :sql) (cats :col-type string :accessor qcats :initarg :cats) (series :col-type string :accessor qseries :initarg :series) (xtitle :col-type string :col-name x_title :accessor xtitle :initarg :xtitle) (ytitle :col-type string :col-name y_title :accessor ytitle :initarg :ytitle) (chart-type :col-type string :col-name chart_type :accessor chart-type :initarg :chart-type)) (:documentation "a pgchart query") (:metaclass dao-class) (:keys id)) (defmethod print-object ((query query) stream) (print-unreadable-object (query stream :type t :identity t) (let ((qid (when (slot-boundp query 'id) (qid query)))) (with-slots (qname) query (format stream "/q/~@[/~36r~] [~a]" qid qname))))) (defmethod q/url ((query query)) "Return the HREF where to display and edit the query." (format nil "/q/~36r" (qid query))) (defmethod q/raw/url ((query query)) "Return the HREF where to display and edit the query." (format nil "/q/raw/~36r" (qid query))) (defmethod q/del/url ((query query)) "Return the HREF where to display and edit the query." (format nil "/q/del/~36r" (qid query))) (defmethod c/url ((query query)) "Return the HREF where to admire the query chart." (format nil "/c/~36r" (qid query))) ;;; ;;; Monkey patch simple-date formatting ;;; (defmethod print-object ((date simple-date:date) stream) (multiple-value-bind (year month day) (simple-date:decode-date date) (format stream "~2,'0d-~2,'0d-~4,'0d" day month year))) (defmethod print-object ((stamp simple-date:timestamp) stream) (multiple-value-bind (year month day hour min sec ms) (simple-date:decode-timestamp stamp) (format stream "~2,'0d-~2,'0d-~4,'0dT~2,'0d:~2,'0d:~2,'0d~@[,~3,'0d~]" day month year hour min sec (if (zerop ms) nil ms)))) (defmethod print-object ((interval simple-date:interval) stream) (multiple-value-bind (year month day hour min sec ms) (simple-date:decode-interval interval) (flet ((not-zero (x) (if (zerop x) nil x))) (format stream "P~@[~dY~]~@[~dM~]~@[~dD~]~@[~dH~]~@[~dm~]~@[~d~@[,~3,'0d~]S~]" (not-zero year) (not-zero month) (not-zero day) (not-zero hour) (not-zero min) (if (and (zerop sec) (zerop ms)) nil sec) (not-zero ms))))) ;;; ;;; And provide YaSON encoding functions ;;; (defmethod yason:encode ((date simple-date:date) &optional (stream *standard-output*)) (format stream "\"~a\"" date)) (defmethod yason:encode ((object (eql :null)) &optional (stream *standard-output*)) (format stream "null")) pgcharts/src/model.sql000066400000000000000000000014011315737174100153060ustar00rootroot00000000000000--- --- pgcharts model --- create schema if not exists pgcharts; create table pgcharts.catalog ( version text primary key ); create table pgcharts.db ( dbname text primary key, dburi text ); -- the minvalue is just so that we begin with 3 letters URLs create sequence pgcharts.query_id_seq minvalue 10000; create table pgcharts.query ( id bigint not null default nextval('pgcharts.query_id_seq') primary key, db text not null references pgcharts.db(dbname), qname text unique not null, description text, sql text, cats text, series text, x_title text, y_title text, chart_type text ); alter sequence pgcharts.query_id_seq owned by pgcharts.query.id; pgcharts/src/package.lisp000066400000000000000000000023471315737174100157630ustar00rootroot00000000000000(defpackage #:pgcharts.dburi (:use #:cl #:esrap) (:import-from #:postmodern #:with-connection #:query) (:export #:parse-pgsql-connection-string #:validate-dburi #:with-pgsql-connection)) (defpackage #:pgcharts.sql (:use #:cl) (:export #:read-queries)) (defpackage #:pgcharts (:use #:cl #:postmodern #:simple-routes #:cl-who #:pgcharts.dburi #:pgcharts.sql) (:import-from #:alexandria #:read-file-into-string #:read-file-into-byte-vector) (:import-from #:split-sequence #:split-sequence) (:import-from #:cl-postgres #:database-error #:database-error-code #:database-error-message #:database-error-detail #:database-error-hint #:database-error-context #:database-error-query #:database-error-position #:database-error-cause) (:export #:*acceptor* #:*server-is-running* #:start-server #:stop-server #:restart-server)) ;;; ;;; Package aliasing ;;; (rename-package 'py-configparser 'py-configparser '(ini)) pgcharts/src/pgcharts.lisp000066400000000000000000000144431315737174100162030ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Handle the command line interface ;;; (defvar *version-string* "1.0" "Version string: X.0 are development versions.") (defvar *options* (list (make-option :help "-h" "--help") (make-option :version "-V" "--version") (make-option :config "-c" "--config" #'set-config-filename t)) "List of allowed options for the main pgcharts command line.") (define-condition server-error () ((uri :initarg :uri :reader server-error-uri) (status-code :initarg :status :reader server-error-status-code) (reason :initarg :reason :reader server-error-reason) (body :initarg :body :reader server-error-body))) (define-condition cli-error () ((mesg :initarg :mesg :initform nil :reader cli-error-message) (detail :initarg :detail :initform nil :reader cli-error-detail) (hint :initarg :hint :initform nil :reader cli-error-hint))) (defun main (argv) "The main entry point for the command-line interface." (multiple-value-bind (args opts) (process-argv-options argv) (when (member :help opts) (usage args :help t) (uiop:quit 0)) (when (member :version opts) (format t "pgcharts version ~s~%" *version-string*) (format t "compiled with ~a ~a~%" (lisp-implementation-type) (lisp-implementation-version)) (uiop:quit 0)) ;; don't do anything when --help or --version were given (let ((match (find-command-function args))) (if match (destructuring-bind (fun args) match (handler-case (handler-bind ((warning #'(lambda (c) (format t "WARNING: ~a~%" c) (muffle-warning)))) (apply fun args)) (cli-error (e) (format t "ERROR: ~a~%~@[DETAIL: ~a~%~]~@[HINT: ~a~%~]" (cli-error-message e) (cli-error-detail e) (cli-error-hint e))) (server-error (e) (format t "ERROR ~d ON ~a~%~@[REASON: ~a~%~]~@[BODY: ~a~%~]" (server-error-status-code e) (server-error-uri e) (server-error-reason e) (server-error-body e))) (condition (c) (if (member :debug opts) (invoke-debugger c) (format t "ERROR: ~a~%" c))))) (usage argv))))) ;;; ;;; Actual commands ;;; (define-command (("setup") (&optional dburi)) "setup the pgcharts database" (let ((*dburi* (or dburi *dburi*))) (save-config) (ensure-model-is-current))) (define-command (("status") ()) "get the status of the currently running server" (handler-case (format t "~a~%" (server-status)) (condition (e) (error 'cli-error :mesg "pgcharts is not running" :detail (format nil "~a" e))))) (define-command (("pid") ()) "prints the PID of the server, if running" (format t "~a~%" (read-pid *pidfile*))) (define-command (("stop") ()) "stop the pgcharts web server" (kill-server)) (define-command (("start") ()) "start the pgcharts web server" (check-setup) (let ((status (ignore-errors (server-status)))) (unless (and status (string= "OK" status)) (daemon:daemonize :output *logfile* :error *logfile* :pidfile *pidfile* :exit-parent t :sigterm (lambda (sig) (declare (ignore sig)) (stop-server))) (start-server :logs *logfile*) (loop :while *server-is-running* :do (sleep 1))))) (define-command (("register") (dburi)) "register a database" (register-db dburi)) (define-command (("config") ()) "print current config" (format t "Current config file: ~s~%" *config-filename*) (with-open-file (config *config-filename*) (uiop:copy-stream-to-stream config *standard-output*))) (define-command (("get") (key)) "display current value for given configuration key" (print-config-value key)) (define-command (("set") (key &optional val)) "edit configuration variables" (if val (setf (config-value key) val) (print-config-value key))) ;;; ;;; Support code for the previous commands ;;; (defun print-config-value (key) "Print the value for KEY, print nothing in error cases." (let ((value (config-value key))) (when value (format t "~a~%" value)))) (defun server-status () "Get the server status over HTTP." (multiple-value-bind (body status-code headers uri stream must-close reason) (drakma:http-request (format nil "http://localhost:~d/status" *listen-port*)) (declare (ignore headers stream must-close)) (if (= status-code 200) body (error 'server-error :uri uri :status status-code :reason reason :body body)))) (defun kill-server (&optional (sig "TERM")) "Send a signal to the server for it to stop" (when (kill-pid (read-pid *pidfile*) sig) (ignore-errors (delete-file *pidfile*)))) (defun register-db (dburi) "Register a new database server." (when (validate-dburi dburi) (destructuring-bind (name &rest rest) (parse-pgsql-connection-string dburi) (declare (ignore rest)) (with-pgsql-connection (*dburi*) (make-dao 'db :dbname name :dburi dburi))))) (defun check-setup () "Signal a condition when the setup isn't ready for starting the service." (unless *dburi* (error 'cli-error :mesg "dburi is unset" :detail "pgcharts need its own database" :hint "run: pgcharts setup pgsql://user:pass@host/dbname")) (handler-case (validate-dburi *dburi*) (condition (e) (error 'cli-error :mesg (format nil "~a" e) :detail (format nil "failed to connect to dburi ~s" *dburi*) :hint (format nil "~a~%~a~%" "createdb dbname; then set dburi:" "run: pgcharts setup pgsql://user:pass@host/dbname")))) ;; If necessary, do the initial setup, or maybe upgrade the database (ensure-model-is-current *dburi*)) pgcharts/src/resources.lisp000066400000000000000000000071741315737174100164050ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; When building a self-contained binary, we want to load all static ;;; resources in-memory. ;;; (defun load-static-file (fs pathname url-path) "Load given PATHNAME contents at URL-PATH in FS." (setf (gethash url-path fs) (read-file-into-byte-vector pathname))) (defun pathname-to-url (pathname url-path) "Transform given PATHNAME into an URL at which to serve it within URL-PATH." (multiple-value-bind (flag path-list last-component file-namestring-p) (uiop:split-unix-namestring-directory-components (uiop:native-namestring pathname)) (declare (ignore flag file-namestring-p)) (format nil "~a~{/~a~}/~a" url-path path-list last-component))) (defun load-static-directory (fs root url-path) "Walk PATH and load all files found in there as binary sequence, FS being an hash table referencing the full path against the bytes." (flet ((collectp (dir) (declare (ignore dir)) t) (recursep (dir) (declare (ignore dir)) t) (collector (dir) (loop :for pathname :in (uiop:directory-files dir) :unless (or (uiop:directory-pathname-p pathname) (string= "zip" (pathname-type pathname))) :do (let ((url (pathname-to-url (uiop:enough-pathname pathname root) url-path))) (load-static-file fs pathname url))))) (uiop:collect-sub*directories root #'collectp #'recursep #'collector))) (defvar *url-to-dir-mapping* `(("js" . ,*js-root*) ("dist" . ,*bootstrap-root*) ("highcharts" . ,*highcharts-root*) ("cm" . ,*codemirror-root*) ("images" . ,*images-root*) ("hallo" . ,*hallo-root*) ("fa" . ,*fontawesome-root*)) "Map URL first directory to its on-disk locations.") (defparameter *fs* (let ((fs (make-hash-table :test #'equal))) (loop :for (first-dir . root ) :in *url-to-dir-mapping* :for url-path := (format nil "/~a" first-dir) :for root-dir := (uiop:ensure-directory-pathname root) :do (load-static-directory fs root-dir url-path)) fs) "File system as an hash-table in memory.") (defparameter *header* (read-file-into-string *header-path*)) (defparameter *footer* (read-file-into-string *footer-path*)) ;;; ;;; General tools to render web static resources ;;; ;;; ;;; Single files ;;; (defun serve-header () "Serve the header file." (if *serve-from-cache* *header* (read-file-into-string *header-path*))) (defun serve-footer () "Serve the footer file." (if *serve-from-cache* *footer* (read-file-into-string *footer-path*))) ;;; ;;; Sub-directories ;;; (defun serve-resource-from-file (&optional (script-name (hunchentoot:script-name*))) "Serve a static resource from a file" (destructuring-bind (first-dir &rest components) ;; the url always begins with a / and we skip it (cdr (split-sequence #\/ script-name)) (let* ((root (cdr (assoc first-dir *url-to-dir-mapping* :test #'string=))) (filename (format nil "~a/~{~a~^/~}" root components))) (hunchentoot:handle-static-file filename)))) (defun serve-resource-from-cache (&optional (script-name (hunchentoot:script-name*))) "Serve a static resource from the cache" (handle-loaded-file script-name)) (defun serve-resource () "Serve a static resource" (if *serve-from-cache* (serve-resource-from-cache) (serve-resource-from-file))) pgcharts/src/server.lisp000066400000000000000000000051441315737174100156740ustar00rootroot00000000000000(in-package #:pgcharts) (defvar *routes* (compile-routes ;; Home page (:GET "/" 'front-list-queries) ;; Resources (:GET "/js/.*" 'serve-resource) ; Our own javascript glue (:GET "/dist/.*" 'serve-resource) ; Bootstrap (:GET "/highcharts/.*" 'serve-resource) ; HighCharts (:GET "/images/.*" 'serve-resource) ; Static images (:GET "/cm/.*" 'serve-resource) ; CodeMirror (:GET "/hallo/.*" 'serve-resource) ; Hallo.js (:GET "/fa/.*" 'serve-resource) ; FontAwesome ;; Server status and control (:GET "/status" 'front-server-status) ;; Queries (:GET "/q/new" 'front-new-query) (:GET "/q/raw/:id" 'front-raw-query) (:GET "/q/raw" 'front-raw-query) (:POST "/q/raw" 'front-raw-query) ; one-page style form (:POST "/q/save" 'front-save-query) (:GET "/q/del/:id" 'front-delete-query) (:GET "/q/:id" 'front-display-query) ;; Charts only (:GET "/c/:id" 'front-display-query-chart) ;; AJAX API to get at query result data (:POST "/json" 'front-fetch-json-data) (:POST "/csv" 'front-fetch-csv-data) ;; Database browser (:GET "/d/:dbname" 'front-browse-database) ;; Search (:GET "/s" 'front-search-queries) ;; Document editing, trying hallo.js for an SQL Notebook (:GET "/nb" 'front-new-notebook))) (defvar *acceptor* nil "The Web Server") (defvar *server-is-running* nil) (defun start-server (&key (logs *terminal-io*)) "Start the web server" (read-config) (when *acceptor* (error "The web server is already running.")) (setf *acceptor* (make-instance 'simpleroutes-acceptor :routes '*routes* :address (copy-seq *listen-address*) :port *listen-port* :document-root nil :access-log-destination logs :message-log-destination logs)) (hunchentoot:start *acceptor*) (setf *server-is-running* t)) (defun stop-server () "Stop the web server" (unless *acceptor* (error "The web server isn't running.")) (hunchentoot:stop *acceptor*) (setf *acceptor* nil *server-is-running* nil)) (defun restart-server () (stop-server) (start-server)) (defun front-server-status () "Return OK when the server is OK." (setf (hunchentoot:content-type*) "text/plain") "OK") pgcharts/src/sql/000077500000000000000000000000001315737174100142705ustar00rootroot00000000000000pgcharts/src/sql/20140823--20140828.sql000066400000000000000000000023221315737174100166760ustar00rootroot00000000000000--- --- Upgrade database model from version 20140823 to version 20140828 --- create table pgcharts.catalog ( version text primary key ); create table pgcharts.new_db ( dbname text primary key, dburi text ); insert into pgcharts.new_db select dbname, 'pgsql://' || coalesce(dbuser, '') || case when dbpass is not null and dbpass <> 'false' then ':' || dbpass else '' end || case when dbhost is not null then case when dbuser is not null then '@' || dbhost else dbhost end else '' end || case when dbport is not null then ':' || dbport else '' end || '/' || dbname from pgcharts.db; alter table pgcharts.db rename to old_db; alter table pgcharts.new_db rename to db; insert into pgcharts.catalog(version) values('20140828'); pgcharts/src/sql/model-update.lisp000066400000000000000000000031061315737174100175410ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; To automate pgcharts model updates, we model a system after the ;;; PostgreSQL extension update mecanism. ;;; ;;; This is an implementation of Dijkstra's algorithm to find the shortest ;;; path copied from the PostgreSQL's source code (in C). ;;; (defparameter *upgrade-scripts* (mapcar (lambda (pathname) (cons (pathname-name pathname) (read-queries pathname))) (remove-if-not (lambda (pathname) (and (pathname-type pathname) (string= "sql" (pathname-type pathname)))) (uiop:directory-files (asdf:system-relative-pathname :pgcharts "src/sql/")))) "List of SQL upgrade scripts, each one being and alist of its pathname as the key and the script itself as the value." ) (defun pathname-to-versions (upgrade-script) "Given a PATHNAME, return source and target version of the script." (mapcar #'parse-integer (cl-ppcre:split "--" (car upgrade-script)))) (defun versions-to-pathname (versions) "Given a list of versions, returns the SQL script pathname." (format nil "~{~a~^--~}" versions)) (defun find-update-path (old-version new-version) "Pick an upgrade path given the list of available update scripts." (let* ((graph (make-instance 'graph:graph)) (edges (mapcar #'pathname-to-versions *upgrade-scripts*))) (graph:populate graph :edges edges) (mapcar #'versions-to-pathname (graph:shortest-path graph (parse-integer old-version) (parse-integer new-version))))) pgcharts/src/utils/000077500000000000000000000000001315737174100146315ustar00rootroot00000000000000pgcharts/src/utils/cache.lisp000066400000000000000000000102221315737174100165620ustar00rootroot00000000000000(in-package #:pgcharts) ;;; ;;; Cache all the on-disk static files (bootstrap, jquery, css, markdown ;;; docs etc) at load time so that we can have an all-included binary file ;;; for real. ;;; ;;; Hunchentoot web server integration ;;; (defun handle-loaded-file (script-name &optional content-type) "A function which act like the hunchentoot::handle-static-file function, against our *fs* in-memory pseudo file-system." (let ((content (gethash script-name *fs*))) (unless content ;; file does not exist (setf (hunchentoot::return-code*) hunchentoot::+http-not-found+) (hunchentoot::abort-request-handler)) (let (bytes-to-send) (setf (hunchentoot::content-type*) (or content-type (hunchentoot:mime-type script-name) "application/octet-stream") (hunchentoot:header-out :last-modified) (hunchentoot::rfc-1123-date (get-universal-time)) (hunchentoot::header-out :accept-ranges) "bytes") ;; ;; To simplify stealing code from hunchentoot ;; (flexi-streams:with-input-from-sequence (file content) (setf bytes-to-send (maybe-handle-range-header file (length content)) (hunchentoot::content-length*) bytes-to-send) (let ((out (hunchentoot::send-headers)) (buf (make-array hunchentoot::+buffer-length+ :element-type '(unsigned-byte 8)))) (loop (when (zerop bytes-to-send) (return)) (let* ((chunk-size (min hunchentoot::+buffer-length+ bytes-to-send))) (unless (eql chunk-size (read-sequence buf file :end chunk-size)) (error "can't read from input file")) (write-sequence buf out :end chunk-size) (decf bytes-to-send chunk-size))) (finish-output out)))))) (defun create-loaded-file-dispatcher-and-handler (uri-prefix base-path &optional content-type) "Creates and returns a dispatch function which will dispatch to a handler function which emits the file relative to BASE-PATH that is denoted by the URI of the request relative to URI-PREFIX. URI-PREFIX must be a string ending with a slash, BASE-PATH must be a pathname designator for an existing directory. If CONTENT-TYPE is not NIL, it'll be the content type used for all files in the folder." (flet ((handler () (let ((request-path (hunchentoot::request-pathname hunchentoot::*request* uri-prefix))) (when (null request-path) (setf (hunchentoot::return-code*) hunchentoot::+http-forbidden+) (hunchentoot::abort-request-handler)) (handle-loaded-file (merge-pathnames request-path base-path) content-type)))) (hunchentoot::create-prefix-dispatcher uri-prefix #'handler))) ;;; ;;; Rework some hunchentoot internals that expect file streams so that they ;;; work with our in-memory implementation: file-length is signaling. ;;; (defun maybe-handle-range-header (file length) "Helper function for handle-static-file. Determines whether the requests specifies a Range header. If so, parses the header and position the already opened file to the location specified. Returns the number of bytes to transfer from the file. Invalid specified ranges are reported to the client with a HTTP 416 status code." (let ((bytes-to-send length)) (cl-ppcre:register-groups-bind (start end) ("^bytes=(\\d+)-(\\d*)$" (hunchentoot::header-in* :range) :sharedp t) ;; body won't be executed if regular expression does not match (setf start (parse-integer start)) (setf end (if (> (length end) 0) (parse-integer end) (1- length))) (when (or (< start 0) (>= end length)) (setf (hunchentoot::return-code*) hunchentoot::+http-requested-range-not-satisfiable+ (hunchentoot::header-out :content-range) (format nil "bytes 0-~D/~D" (1- length) length)) (throw 'handler-done (format nil "invalid request range (requested ~D-~D, accepted 0-~D)" start end (1- length)))) (file-position file start) (setf (hunchentoot::return-code*) hunchentoot::+http-partial-content+ bytes-to-send (1+ (- end start)) (hunchentoot::header-out :content-range) (format nil "bytes ~D-~D/~D" start end length))) bytes-to-send)) pgcharts/src/utils/cli-parser.lisp000066400000000000000000000125611315737174100175700ustar00rootroot00000000000000(in-package #:pgcharts) (eval-when (:load-toplevel :compile-toplevel :execute) (defstruct command verbs bindings help lambda) (defvar *commands* (make-array 0 :element-type 'command :adjustable t :fill-pointer t) "Host commands defined with the DEFINE-COMMAND macro.") (defmethod same-command ((a command) (b command)) "Return non-nil when a and b are commands with the same verbs" (equal (command-verbs a) (command-verbs b)))) (defun destructuring-match (lambda-list args) "Return non-nil when ARGS are matching against the given LAMBDA-LIST." (ignore-errors (funcall (compile nil `(lambda () ;; hide a style warning that variables are defined ;; but never used here (declare #+sbcl (sb-ext:muffle-conditions style-warning)) (destructuring-bind ,lambda-list ',args t)))))) (defmethod command-matches ((command command) args) "When the given COMMAND matches given command line ARGS, then return it and the argument to apply to it." (declare (type list args)) (when (<= (length (command-verbs command)) (length args)) (let ((matches-p (loop :for verb :in (command-verbs command) :for arg in args :for matches-p := (string-equal verb arg) :while matches-p :finally (return matches-p)))) (when matches-p (let ((fun-args (nthcdr (length (command-verbs command)) args))) (when (destructuring-match (command-bindings command) fun-args) (list (command-lambda command) fun-args))))))) (defmacro define-command ((verbs bindings) help-string &body body) "Define a command that is to be fired when VERBS are found at the beginning of the command, assigning remaining arguments to given bindings. The help-string is used when displaying the program usage." (let ((fun (gensym)) (command (gensym)) (position (gensym)) (output (gensym))) `(eval-when (:load-toplevel :compile-toplevel :execute) (let* ((,fun (lambda ,bindings (read-config) (let ((,output (progn ,@body))) (typecase ,output (string (format t "~a~%" ,output)) (t nil))))) (,command (make-command :verbs ',verbs :bindings ',bindings :help ,help-string :lambda (compile nil ,fun))) (,position (position-if (lambda (c) (same-command c ,command)) *commands*))) (if ,position (setf (aref *commands* ,position) ,command) (vector-push-extend ,command *commands*)))))) (defstruct (option (:conc-name opt-) (:constructor make-option (keyword short long &optional fun eat-next-arg))) keyword short long fun eat-next-arg) (defun parse-option-name (arg) "When ARG is an option name, return its keyword, otherwise return nil." (loop :for option :in *options* :when (or (string= arg (opt-short option)) (string= arg (opt-long option))) :return option)) (defun process-argv-options (argv) "Return the real args found in argv, and a list of the options used, as multiple values." (let ((args '()) (ignore nil) (opts '())) (values (loop :for (arg next) :on (rest argv) :for opt := (unless ignore (parse-option-name arg)) :do (progn ;; sanity check (when (and opt (opt-eat-next-arg opt) (null next)) (format t "Missing argument for option ~a~%" arg) (push :help opts)) ;; build the argument list (unless (or opt ignore) (push arg args)) ;; we might have to ignore arg on next iterationa (setf ignore (and opt (opt-eat-next-arg opt))) ;; deal with the option side effects (when opt (push (opt-keyword opt) opts) (when (opt-fun opt) (let ((args (when (opt-eat-next-arg opt) (list next)))) (apply (opt-fun opt) args))))) :finally (return (nreverse args))) opts))) (defun find-command-function (args) "Loop through *COMMANDS* to find the code to execute given ARGS." (loop :for command :across *commands* :for match := (command-matches command args) :until match :finally (return match))) (defun usage (args &key help) "Loop over all the commands and output the usage of the main program" (format t "pgcharts [ --help ] [ --version ] [ --config filename ] command ...~%") (unless help (format t "~a: command line parse error.~%" (first args)) (format t "~@[Error parsing args: ~{~s~^ ~}~%~]~%" (rest args))) (format t "~%Available commands:~%") (loop :for command :across *commands* :do (with-slots (verbs bindings help) command (format t " ~{~a~^ ~} ~{~a~^ ~}~28T~a~%" verbs bindings help)))) pgcharts/src/utils/dburi.lisp000066400000000000000000000133071315737174100166330ustar00rootroot00000000000000;;; ;;; Parse database connection string ;;; (in-package #:pgcharts.dburi) (eval-when (:compile-toplevel :load-toplevel :execute) (defun getenv-default (name &optional default) "Return the value of the NAME variable as found in the environment, or DEFAULT if that variable isn't set" (or (uiop:getenv name) default))) (defrule punct (or #\, #\- #\_) (:text t)) (defrule namestring (* (or (alpha-char-p character) (digit-char-p character) punct)) (:text t)) (defrule dsn-port (and ":" (* (digit-char-p character))) (:destructure (colon digits &aux (port (coerce digits 'string))) (declare (ignore colon)) (list :port (if (null digits) digits (parse-integer port))))) (defrule doubled-at-sign (and "@@") (:constant "@")) (defrule doubled-colon (and "::") (:constant ":")) (defrule password (+ (or (not "@") doubled-at-sign)) (:text t)) (defrule username (+ (or (not (or ":" "@")) doubled-at-sign doubled-colon)) (:text t)) (defrule dsn-user-password (and username (? (and ":" (? password))) "@") (:lambda (args) (destructuring-bind (username &optional password) (butlast args) ;; password looks like '(":" "password") (list :user username :password (cadr password))))) (defun hexdigit-char-p (character) (member character #. (quote (coerce "0123456789abcdefABCDEF" 'list)))) (defrule ipv4-part (and (digit-char-p character) (? (digit-char-p character)) (? (digit-char-p character)))) (defrule ipv4 (and ipv4-part "." ipv4-part "." ipv4-part "." ipv4-part) (:lambda (ipv4) (list :ipv4 (text ipv4)))) ;;; socket directory is unix only, so we can forbid ":" on the parsing (defun socket-directory-character-p (char) (or (member char #.(quote (coerce "/.-_" 'list))) (alphanumericp char))) (defrule socket-directory (and "unix:" (* (socket-directory-character-p character))) (:destructure (unix socket-directory) (declare (ignore unix)) (list :unix (when socket-directory (text socket-directory))))) (defrule network-name (and namestring (* (and "." namestring))) (:lambda (name) (let ((host (text name))) (list :host (unless (string= "" host) host))))) (defrule hostname (or ipv4 socket-directory network-name) (:identity t)) (defrule dsn-hostname (and (? hostname) (? dsn-port)) (:destructure (hostname &optional port) (append (list :host hostname) port))) (defrule dsn-dbname (and "/" (? namestring)) (:destructure (slash dbname) (declare (ignore slash)) (list :dbname dbname))) (defrule dsn-option-ssl-disable "disable" (:constant :no)) (defrule dsn-option-ssl-allow "allow" (:constant :try)) (defrule dsn-option-ssl-prefer "prefer" (:constant :try)) (defrule dsn-option-ssl-require "require" (:constant :yes)) (defrule dsn-option-ssl (and "sslmode" "=" (or dsn-option-ssl-disable dsn-option-ssl-allow dsn-option-ssl-prefer dsn-option-ssl-require)) (:lambda (ssl) (destructuring-bind (key e val) ssl (declare (ignore key e)) (cons :use-ssl val)))) (defrule dsn-option (or dsn-option-ssl)) (defrule dsn-options (and "?" (* dsn-option)) (:lambda (options) (destructuring-bind (qm opts) options (declare (ignore qm)) (alexandria:alist-plist opts)))) (defrule dsn-prefix (or "pgsql://" "postgresql://") (:constant nil)) (defrule db-connection-uri (and dsn-prefix (? dsn-user-password) (? dsn-hostname) dsn-dbname (? dsn-options)) (:lambda (uri) (destructuring-bind (&key type user password host port dbname (use-ssl :no)) (apply #'append uri) (declare (ignore type)) ;; ;; Default to environment variables as described in ;; http://www.postgresql.org/docs/9.3/static/app-psql.html ;; http://dev.mysql.com/doc/refman/5.0/en/environment-variables.html ;; (list (or dbname (getenv-default "PGDATABASE" user)) (or user (getenv-default "PGUSER" (getenv-default "USER"))) (or password (getenv-default "PGPASSWORD")) (or (when host (destructuring-bind (type &optional name) host (ecase type (:unix (or name :unix)) (:ipv4 name) (:host name)))) (getenv-default "PGHOST" #+unix :unix #-unix "localhost")) :port (or port (parse-integer (getenv-default "PGPORT" "5432"))) :use-ssl use-ssl)))) ;;; ;;; Parsing a connection string ;;; (defun parse-pgsql-connection-string (connection-string) "Parse given CONNECTION-STRING and return a Postmodern suitable connection spec. Examples: IN: postgresql://dim@localhost:54393/pginstall OUT: '(\"pginstall\" \"dim\" nil \"localhost\" :port 54393 :use-ssl :no) The default port, when omitted, comes from the environment variable PGPORT." (parse 'db-connection-uri connection-string)) (defmacro with-pgsql-connection ((connection-string) &body body) "Runs BODY within an established PostgreSQL connection." `(with-connection (parse-pgsql-connection-string ,connection-string) ,@body)) ;;; ;;; Validating a connection string ;;; (defun validate-dburi (connection-string) "Signal an error when CONNECTION-STRING either can't be parsed or if we can't connect to a PostgreSQL server when using it." (with-pgsql-connection (connection-string) (query "SELECT 1" :single)) ;; make sure to return the valid connection-string connection-string) pgcharts/src/utils/read-sql-files.lisp000066400000000000000000000201141315737174100203300ustar00rootroot00000000000000;;; ;;; Tools to get the list of query from the model.sql, api.sql and sql/*.sql ;;; files, which remains usable as-is interactively (hence the injecting ;;; trick) ;;; (in-package #:pgcharts.sql) (defstruct parser filename (stream (make-string-output-stream)) (state :eat) tags) (defmethod print-object ((p parser) stream) (print-unreadable-object (p stream :type t :identity t) (with-slots (state tags) p (format stream "~a {~{~s~^ ~}}" state tags)))) (defmethod push-new-tag ((p parser)) "Add a new element on the TAGS slot, a stack" (let ((tag (make-array 42 :fill-pointer 0 :adjustable t :element-type 'character))) (push tag (parser-tags p)))) (defmethod extend-current-tag ((p parser) char) "The TAGS slot of the parser is a stack, maintain it properly." (declare (type character char)) (assert (not (null (parser-tags p)))) (vector-push-extend char (first (parser-tags p)))) (defmethod format-current-tag ((p parser) &optional (stream (parser-stream p))) "Output the current tag to the current stream." (format stream "$~a$" (coerce (first (parser-tags p)) 'string))) (defmethod maybe-close-tags ((p parser) &optional (stream (parser-stream p))) "If the two top tags in the TAGS slot of the parser P are the same (compared using EQUALP), then pop them out of the stack and print the closing tag to STREAM." (when (and (< 1 (length (parser-tags p))) (equalp (first (parser-tags p)) (second (parser-tags p)))) ;; format the tag in the stream and POP both entries (format-current-tag p stream) (pop (parser-tags p)) (pop (parser-tags p)) ;; and return t t)) (defmethod pop-current-tag ((p parser)) "Remove current tag entry" (pop (parser-tags p))) (defmethod reset-state ((p parser)) "Depending on the current tags stack, set P state to either :eat or :eqt" (setf (parser-state p) (if (null (parser-tags p)) :eat :eqt))) #| Here's a test case straigth from the PostgreSQL docs: (with-input-from-string (s " create function f(text) returns bool language sql as $function$ BEGIN RETURN ($1 ~ $q$[\\t\\r\\n\\v\\\\]$q$); END; $function$;") (parse-query s (make-parser))) Another test case for the classic quotes: (with-pgsql-connection ("pgsql:///pginstall") (query (with-input-from-string (s "select E'\\';' as \";\";") (parse-query s)) :alists)) should return (((:|;| . "';"))) |# (defun parse-query (stream &optional (state (make-parser))) "Read a SQL query from STREAM, starting at whatever the current position is. Returns another SQL query each time it's called, or NIL when EOF is reached expectedly. Signal end-of-file condition when reaching EOF in the middle of a query. See the following docs for some of the parser complexity background: http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING Parser states are: - EAT reading the query - TAG reading a tag that could be an embedded $x$ tag or a closing tag - EOT End Of Tag - EQT Eat Quoted Text - EDQ Eat Double-Quoted Text (identifiers) - EOQ done reading the query - ESC read espaced text (with backslash)" (handler-case (loop :until (eq :eoq (parser-state state)) :for char := (read-char stream) :do (case char (#\\ (case (parser-state state) (:esc (setf (parser-state state) :eqt)) (:eqt (setf (parser-state state) :esc))) (write-char char (parser-stream state))) (#\' (case (parser-state state) (:eat (setf (parser-state state) :eqt)) (:esc (setf (parser-state state) :eqt)) (:eqt (setf (parser-state state) :eat))) (write-char char (parser-stream state))) (#\" (case (parser-state state) (:eat (setf (parser-state state) :edq)) (:edq (setf (parser-state state) :eat))) (write-char char (parser-stream state))) (#\$ (case (parser-state state) (:eat (setf (parser-state state) :tag)) (:eqt (setf (parser-state state) :tag)) (:tag (setf (parser-state state) :eot))) ;; we act depending on the NEW state (case (parser-state state) (:eat (write-char char (parser-stream state))) (:tag (push-new-tag state)) (:eot ; check the tag stack (cond ((= 1 (length (parser-tags state))) ;; it's an opening tag, collect the text now (format-current-tag state) (reset-state state)) (t ; are we closing the current tag? (if (maybe-close-tags state) (reset-state state) ;; not the same tags, switch state back ;; don't forget to add the opening tag (progn (format-current-tag state) (setf (parser-state state) :eqt)))))))) (#\; (case (parser-state state) (:eat (setf (parser-state state) :eoq)) (otherwise (write-char char (parser-stream state))))) (otherwise (cond ((member (parser-state state) '(:eat :eqt)) (write-char char (parser-stream state))) ((member (parser-state state) '(:tag)) ;; only letters are allowed in tags (if (alpha-char-p char) (extend-current-tag state char) (progn ;; not a tag actually: remove the ;; parser-tags entry and push back its ;; contents to the main output stream (let ((tag (pop-current-tag state))) (format (parser-stream state) "$~a~c" tag char)) (reset-state state))))))) :finally (return (get-output-stream-string (parser-stream state)))) (end-of-file (e) (unless (eq :eat (parser-state state)) (error e))))) (defun read-lines (filename &optional (q (make-string-output-stream))) "Read lines from given filename and return them in a stream. Recursively apply \i include instructions." (with-open-file (s filename :direction :input) (loop for line = (read-line s nil) while line do (if (or (and (> (length line) 3) (string= "\\i " (subseq line 0 3))) (and (> (length line) 4) (string= "\\ir " (subseq line 0 4)))) (let ((include-filename (merge-pathnames (subseq line 3) (directory-namestring filename)))) (read-lines include-filename q)) (format q "~a~%" line)) finally (return q)))) (defun read-queries (filename) "read SQL queries in given file and split them, returns a list" (let ((file-content (get-output-stream-string (read-lines filename)))) (with-input-from-string (s file-content) (loop :for query := (parse-query s) :while query :collect query)))) pgcharts/vm-conf/000077500000000000000000000000001315737174100142475ustar00rootroot00000000000000pgcharts/vm-conf/bashrc.sh000066400000000000000000000001611315737174100160430ustar00rootroot00000000000000# DEBIAN export DEBEMAIL="dim@tapoueh.org" export DEBFULLNAME="Dimitri Fontaine" export DEBSIGN_KEYID="60B1CB4E" pgcharts/vm-conf/bootstrap.sh000077500000000000000000000012321315737174100166210ustar00rootroot00000000000000#!/usr/bin/env bash if [ ! -f /etc/apt/sources.list.old ] then sudo mv /etc/apt/sources.list /etc/apt/sources.list.old sudo cp /vagrant/conf/sources.list /etc/apt/sources.list fi sudo apt-get update sudo apt-get dist-upgrade -y sudo apt-get install -y devscripts debhelper debianutils dh-lisp \ gnupg rsync # build deps sudo apt-get install sbcl buildapp cl-asdf cl-postmodern cl-esrap \ cl-py-configparser cl-split-sequence cl-ppcre cl-alexandria \ cl-hunchentoot cl-yason cl-closer-mop cl-daemon cl-who \ cl-bordeaux-threads cl-graph cl-trivial-backtrace \ ruby-ronn cat /vagrant/conf/bashrc.sh >> ~/.bashrc pgcharts/vm-conf/devscripts000066400000000000000000000001231315737174100163540ustar00rootroot00000000000000DEBEMAIL="dim@tapoueh.org" DEBFULLNAME="Dimitri Fontaine" DEBSIGN_KEYID="60B1CB4E" pgcharts/vm-conf/gpg.conf000066400000000000000000000003421315737174100156720ustar00rootroot00000000000000default-key 60B1CB4E keyserver hkp://keys.gnupg.net use-agent personal-digest-preferences SHA512 cert-digest-algo SHA512 default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed pgcharts/vm-conf/sources.list000066400000000000000000000004231315737174100166260ustar00rootroot00000000000000deb http://ftp.fr.debian.org/debian sid main non-free contrib deb-src http://ftp.fr.debian.org/debian sid main non-free contrib # deb http://security.debian.org/ wheezy/updates main contrib non-free # deb-src http://security.debian.org/ wheezy/updates main contrib non-free pgcharts/web/000077500000000000000000000000001315737174100134575ustar00rootroot00000000000000pgcharts/web/bootstrap-3.1.1-dist/000077500000000000000000000000001315737174100170735ustar00rootroot00000000000000pgcharts/web/bootstrap-3.1.1-dist/charts.css000066400000000000000000000006111315737174100210670ustar00rootroot00000000000000.bar { fill: steelblue; } .bar:hover { fill: brown; } .axis { font: 10px sans-serif; } .axis path, .axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } .x.axis path { display: none; } #svgdataurl { display: none; } #pngdataurl { display: none; } hidden { display: none; } h3.error, h4.error { color: red; } .error { text-align: left; }pgcharts/web/bootstrap-3.1.1-dist/cover.css000066400000000000000000000046051315737174100207300ustar00rootroot00000000000000/* * Globals */ /* Links */ a, a:focus, a:hover { color: #fff; } /* Custom default button */ .btn-default, .btn-default:hover, .btn-default:focus { color: #333; text-shadow: none; /* Prevent inheritence from `body` */ background-color: #fff; border: 1px solid #fff; } /* * Base structure */ html, body { height: 100%; background-color: #333; } body { color: #fff; text-align: center; text-shadow: 0 1px 3px rgba(0,0,0,.5); box-shadow: inset 0 0 100px rgba(0,0,0,.5); } /* Extra markup and styles for table-esque vertical and horizontal centering */ .site-wrapper { display: table; width: 100%; height: 100%; /* For at least Firefox */ min-height: 100%; } .site-wrapper-inner { display: table-cell; vertical-align: top; } .cover-container { margin-right: auto; margin-left: auto; } /* Padding for spacing */ .inner { padding: 30px; } /* * Header */ .masthead-brand { margin-top: 10px; margin-bottom: 10px; } .masthead-nav > li { display: inline-block; } .masthead-nav > li + li { margin-left: 20px; } .masthead-nav > li > a { padding-right: 0; padding-left: 0; font-size: 16px; font-weight: bold; color: #fff; /* IE8 proofing */ color: rgba(255,255,255,.75); border-bottom: 2px solid transparent; } .masthead-nav > li > a:hover, .masthead-nav > li > a:focus { background-color: transparent; border-bottom-color: rgba(255,255,255,.25); } .masthead-nav > .active > a, .masthead-nav > .active > a:hover, .masthead-nav > .active > a:focus { color: #fff; border-bottom-color: #fff; } @media (min-width: 768px) { .masthead-brand { float: left; } .masthead-nav { float: right; } } /* * Cover */ .cover { padding: 0 20px; } .cover .btn-lg { padding: 10px 20px; font-weight: bold; } /* * Footer */ .mastfoot { color: #999; /* IE8 proofing */ color: rgba(255,255,255,.5); } /* * Affix and center */ @media (min-width: 768px) { /* Pull out the header and footer */ .masthead { position: fixed; top: 0; } .mastfoot { position: fixed; bottom: 0; } /* Start the vertical centering */ .site-wrapper-inner { vertical-align: middle; } /* Handle the widths */ .masthead, .mastfoot, .cover-container { width: 100%; /* Must be percentage or pixels for horizontal alignment */ } } @media (min-width: 992px) { .masthead, .mastfoot, .cover-container { width: 700px; } } pgcharts/web/bootstrap-3.1.1-dist/css/000077500000000000000000000000001315737174100176635ustar00rootroot00000000000000pgcharts/web/bootstrap-3.1.1-dist/css/bootstrap-theme.css000066400000000000000000000351301315737174100235140ustar00rootroot00000000000000/*! * Bootstrap v3.1.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-primary { background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #2b669a; } .btn-primary:hover, .btn-primary:focus { background-color: #2d6ca2; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #2d6ca2; border-color: #2b669a; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #357ebd; background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; } .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); background-image: linear-gradient(to bottom, #222 0%, #282828 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); background-repeat: repeat-x; border-color: #3278b3; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ pgcharts/web/bootstrap-3.1.1-dist/css/bootstrap-theme.css.map000066400000000000000000001127641315737174100243010ustar00rootroot00000000000000{"version":3,"sources":["less/theme.less","less/mixins.less"],"names":[],"mappings":"AAeA;AACA;AACA;AACA;AACA;AACA;EACE,wCAAA;ECoGA,2FAAA;EACQ,mFAAA;;ADhGR,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;AACD,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;EC8FD,wDAAA;EACQ,gDAAA;;ADnER,IAAC;AACD,IAAC;EACC,sBAAA;;AAKJ;EC4PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;EAyB2C,yBAAA;EAA2B,kBAAA;;AAvBtE,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAeJ;EC2PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAgBJ;EC0PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAiBJ;ECyPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,SAAC;AACD,SAAC;EACC,yBAAA;EACA,qBAAA;;AAkBJ;ECwPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAmBJ;ECuPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,WAAC;AACD,WAAC;EACC,yBAAA;EACA,qBAAA;;AA2BJ;AACA;EC6CE,kDAAA;EACQ,0CAAA;;ADpCV,cAAe,KAAK,IAAG;AACvB,cAAe,KAAK,IAAG;ECmOnB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EDpOF,yBAAA;;AAEF,cAAe,UAAU;AACzB,cAAe,UAAU,IAAG;AAC5B,cAAe,UAAU,IAAG;EC6NxB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED9NF,yBAAA;;AAUF;ECiNI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;EDrPA,kBAAA;ECaA,2FAAA;EACQ,mFAAA;;ADjBV,eAOE,YAAY,UAAU;EC0MpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,wDAAA;EACQ,gDAAA;;ADLV;AACA,WAAY,KAAK;EACf,8CAAA;;AAIF;EC+LI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;;ADtOF,eAIE,YAAY,UAAU;EC2LpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,uDAAA;EACQ,+CAAA;;ADCV,eASE;AATF,eAUE,YAAY,KAAK;EACf,yCAAA;;AAKJ;AACA;AACA;EACE,gBAAA;;AAUF;EACE,6CAAA;EChCA,0FAAA;EACQ,kFAAA;;AD2CV;ECqJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAKF;ECoJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAMF;ECmJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAOF;ECkJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAgBF;ECyII,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADlIJ;EC+HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADjIJ;EC8HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADhIJ;EC6HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD/HJ;EC4HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD9HJ;EC2HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtHJ;EACE,kBAAA;EC/EA,kDAAA;EACQ,0CAAA;;ADiFV,gBAAgB;AAChB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;EACrB,6BAAA;EC4GE,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED7GF,qBAAA;;AAUF;ECjGE,iDAAA;EACQ,yCAAA;;AD0GV,cAAe;ECsFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADxFJ,cAAe;ECqFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADvFJ,cAAe;ECoFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtFJ,WAAY;ECmFR,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADrFJ,cAAe;ECkFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADpFJ,aAAc;ECiFV,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD5EJ;ECyEI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED1EF,qBAAA;EC1HA,yFAAA;EACQ,iFAAA","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for ``.\n@body-bg: #fff;\n//** Global text color on ``.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for ``, ``, and `

`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg:                       #fff;\n//** `` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for ``s\n@input-color:                    @gray;\n//** `` border color\n@input-border:                   #ccc;\n//** `` border radius\n@input-border-radius:            @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color:       @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color:         #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n  line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  label {\n    display: inline;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n\n  // Feedback icon (requires .glyphicon classes)\n  .form-control-feedback {\n    position: absolute;\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n    right: 0;\n    display: block;\n    width: @input-height-base;\n    height: @input-height-base;\n    line-height: @input-height-base;\n    text-align: center;\n  }\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n      vertical-align: middle;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: @navbar-collapse-max-height;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: none;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]}pgcharts/web/bootstrap-3.1.1-dist/css/bootstrap.min.css000066400000000000000000003031711315737174100232010ustar00rootroot00000000000000/*! * Bootstrap v3.1.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}}pgcharts/web/bootstrap-3.1.1-dist/dashboard.css000066400000000000000000000025521315737174100215400ustar00rootroot00000000000000/* * Base structure */ /* Move down content because we have a fixed navbar that is 50px tall */ body { padding-top: 50px; } /* * Global add-ons */ .sub-header { padding-bottom: 10px; border-bottom: 1px solid #eee; } /* * Sidebar */ /* Hide for mobile, show later */ .sidebar { display: none; } @media (min-width: 768px) { .sidebar { position: fixed; top: 51px; bottom: 0; left: 0; z-index: 1000; display: block; padding: 20px; overflow-x: hidden; overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ background-color: #f5f5f5; border-right: 1px solid #eee; } } /* Sidebar navigation */ .nav-sidebar { margin-right: -21px; /* 20px padding + 1px border */ margin-bottom: 20px; margin-left: -20px; } .nav-sidebar > li > a { padding-right: 20px; padding-left: 20px; } .nav-sidebar > .active > a { color: #fff; background-color: #428bca; } /* * Main content */ .main { padding: 20px; } @media (min-width: 768px) { .main { padding-right: 40px; padding-left: 40px; } } .main .page-header { margin-top: 0; } /* * Placeholder dashboard ideas */ .placeholders { margin-bottom: 30px; text-align: center; } .placeholders h4 { margin-bottom: 0; } .placeholder { margin-bottom: 20px; } .placeholder img { display: inline-block; border-radius: 50%; } pgcharts/web/bootstrap-3.1.1-dist/fonts/000077500000000000000000000000001315737174100202245ustar00rootroot00000000000000pgcharts/web/bootstrap-3.1.1-dist/fonts/glyphicons-halflings-regular.eot000066400000000000000000000475571315737174100265420ustar00rootroot00000000000000oONLP(GLYPHICONS HalflingsRegularxVersion 1.001;PS 001.001;hotconv 1.0.70;makeotf.lib2.5.583298GLYPHICONS Halflings RegularBSGPv5v5|-\`WhKqJx"U:r,/4\ liʚELFMƀV(gW\+rK0 Q3-O>Cdge}\4[DdpWQ@J[MUAНj.p`k*CI4ثo\ wfvXDlBg1[/a 2lE2g29MÊ zGDUBA$L}Xʕfz;N2_;(k@B[!6P3G E]{JW/s4%ߙ_}}cO-4lPaDX[qv*X,u * z3JL} 0VjUyjn)O0;0!-!r"&bbl,-`Q|/^LVRuzԪIЪ!k&)J{.tS?iSdiVD1w b]D*%qsPDẍp EG`+w:V*X<[lM .ΡShqk" J MT6 ckazԪnqm0pDJv咽Fv(S(MIӶFKm"=-B(>QeYeg䜊7 ._j&LK 9zRuC Rȍ&B0 _C_{4W?N"$#D :J4/횶GJ;]wd:H9®[Ԩ* K #8A$a`]ڞ-TE7 $ :sp†f L$}Zb]b6Hrx-t jViMjN^[8>Cn7L &+3W6G86Xnfi?4 }<4 ζfVGeb} s i{OEn#&QP6D*BLB1SRkDXX><|0;ڈ55C~4?:P}"%ut5I!9l$!yMT>' Otqa?^Em ߲CsS|-nH q#Yt k ¹Ǯs%}NJbCW/|`F\b,ɏ2H2/94# ~ecĩ"Q7:ZI֋]%Y*B;8aFxʩb_͟- *)4?j@5Q'P8Gr)ՠxl֏("c{G݇_xۢƴHE-Bᔡ`\_`TXiCO!;#$QCU(75D Ѥd= >dZ0tjgv2-ēxU  3,7ta,(5¶YE$6sB܉O c: : R.yaHX%1yL7Az5o*n5e)oFaDe`hp"QYoO 4ops0OE Y)b8x.k+8U)+6-]K9pQt&}SnmbtLMwXsSIj>ISj 2`%94}=JAvD j踠ؓT[P#aW0Tt-~zI,6U2)'\v SRP Znq"abErwL1U[n @G[9y3s;! r퐽"04{2 faJ )"P: 63'Z7\H59NTt } 損;wL.tdqwo Ή)"f.dxCz KFNǢhF@ᡰ)1VaP JV,B{&f pphxO2%8 QPL:eϨiN`ߟҒ]Q${3qN% Ot=jxgPΰFK^{f?^/ O\:JD;Q`c^!dvk e3庑aIC d6 IȚ#\},?Hf3cUw+$U[":}]jb(Es)`%\¥U.#]v/)K:Ic4ó.c$C?f `+6cx$#[ߺ f& h,A4-g`?$1 1bB5 }˟ X`h^2*"`PRooפ)jk7L"3|{y@պiw@&}g$su"򩄕_[n 7()D`QŔm>@cgDD~xp }`toHTuҁ)m7$',h XNrlu5_@>[ƍĬ]6ݏS@&ƛ2@4w|{ ߤ9.Fdqr(A1ƴ#ADp#6=rR {xP(Q@"ޥ&Ϡ]a y[J(%;MA ~NdR;>4hYjQ=yæ[`\h :L]}~0Ml0F#뗸S2zB!TC l-c:Tl占bPIS;KΜNWpw}R#;~ -b;} 3@=6]ӦؒAy0h)?(o^2Ri}l[=qĴP418󅷞8@BB8Rjp>ފvP-'KULRCa=r'}ݨkFp6HbI,Fo1r'"չ&&lI{&Qf2a\L)ARہQDX:vaiGGw޶ /0$O0&#H9o(sQƬ"MLjL7L5 y*ɚ Y%wt+55Z()͊BvMK0:$»8!0AbJ#9pB́@E(CuOP<|h sRynx@fr:„i1ZBLnѫrtI-1x,Fޠ1Sb'1CI Y^\UF;=6-T-H2G'8H9&$+d k?K(J'qj s`*L9y2@ a-*PkvW2F0(tTlhш%qA.[_g>9dMx,mw첌-{ 3tw61}Lwf馵G,h jZZ8H5tÉ@wi Ku|AIgn).}88F@*ʠtxV~JUw6A.0n*"1-59dq?5L8v& |֓I4$H]ZMUj/R-l\w׭OU LQ*`r }krmVӛk^vJS ''xQi_᭒d4(Qn \T-VB+ uxdFȘW`q NB \5#3v$O#ȧ,*(w\h;^ʻƪ 'NYmLʿ"TR Cy. >f D kDo9/މ׮=4fQ؀'k5B$rL줁tIL?P!>Mf0+^˪!Ѡ>5Ĩ&y_dA+1f+#X@חč㍊S.r;0~RP72ř|$oVXBa?^ b~*FT@Jƪ3}/SaUȪj1SaB7~& FMsϜ[>+ {1YsȠ@z(=!؆73މfze(<;oe3_'DZs5"b4gdHCoL5.6:5}9$MQ'$¥9DscM |)lIE9#C5LJ`fK%{P,e& 'S7a:np-ąKzHhw%ɹm|lߝʍȝte0q9S_z/L[ P{)x.{hLٷV)kٮq;jz@b2Q` 9~'32jF vQTdM@>ܹPNq޺HіJMrN2Q9}l̀ (6,A; +":(-$V3x6AT\"zn %*bo@oJLBqIziTN9Xj<39'LRB$eYĞa+(n2uCca%˂*w `‹B=Uf{(INq_ zh.3fKH f]N LԩXʍ=zRg}퇍ZUJ"yxqESZDXJN4HOV_X/bYmOt)r!)mFL.P@0cgrTxg=] 3A?)z Ua0@ zd0w"jZpL_T_C e )~oQRNx3Î|T"b, 2& cT6@1# ,@-#z|VcXk58WYP!\-` |)2ooD4}ئ=Lg}Pi9І.xpTsq2yǿa-GuNhXH8uOi% (Ck%b9|B(#U Yt='`҃ >N-'׿ ]69A0&!Ge! mܥ#<*L£U.1=RI2')`> l٦hh%H^YY-aA xq[ '@L^ q=BQGͱ2\K oD9xx۳I 8, OȉC;'2ouPp CR  {|녴p`4tvX @X+6zP?,J*lKh:MѰdC^fhD ]wJү!}7?fYƉA"SEiD2#ե$=4:{pۿs> irrT׎ ; q!u_n&5ҁW%7 _ c59f5r~JDR5e?[T6mf8Or*~$QcڏƁ;B=E_MhhR` >~<@34TGa8vf&G[U%H-XP@ K/қ@^0ݩ'f܍klش\BG]W?sX(Vz$F;]HP{*6Dcb-7|X|o~mssiBJ[0{V \=T%CJ͵m9<?fK]ɒCy{ PƏ뇰G^JH@ \쓚c~Rbʂ@mhVS#4xSkȗ~y*q6&gY? gb Xn!$8[E'()C7"ONhC3V,%(eR39IHC̼_YDb;s~L\ed5 i3sђ9ItrôikXJB5F޾Uu\-*/Usw b OĿmOn,1GG[ՁxeXujz zҳݘ-6`9e$v:]]@/ yB(zÎ / oZm'N;=3%)y 19FL(gRK@ ; \'']̱2ievu# qZ~15I]9, 7Ji)H)j-ju՘ OO/ p:/(;RBU7edINRH?>X0y8Pr#b _8i؍Cf`ȑai2Uyd=2_Db9@:q"ڌSpF~"6TDgtӆ +tHh7 >TLҌ $AQ+ @;;M~oS<:.g&`$"CPbQ,`$`|ʛW18<~$+t >N]-me B5PNcxqE}n B685 }Uf<)SbQRUk)LGS*F:Hp%xسR)s.̀RqWjGi<5) /򈈳2`޲h6`눯LT ɖn QY\;uth26WZafQr`dڭ1t-1a|Ұ g0Ci[[^;`FOpb^ū^nP mJSr4K*X˓ .cnnmEPhJl|c! !ZI>NbTpPu$k[C%- QջQL&B88Jtqic2HšE/'W^yRrnզ*paK#51=̺6 jC#< /I͑2 ;ċ `SXԙ$jjgI\dOX%=grj{yV PsJIfM!]INFn 1Da6-4KX8)>8 )q@PȒR2GI8C@hW TQ];K=_1a ȱ@xZ urd`_1T*Kb{ p-n+W9?.W*m*nԤ'.CACdýDC1n*k]F  ܴOl7i%cXkԺ%i(ε=r$DyU6ʉ;ca k|Gr:9mmW^ÞXeUADQ_«tj$Uh4a| a eB CUMҵhރ8wƤiip`g6ρ#Mtʍ?<8W^%xpf1Sq iXYZKT6 /5QtΦhEzp)HJXC ΐR[S} qT/E:E,2P!ZNĂTs=4阃RNSwy#d8G6<` 3YˤM=9fts4 q9x0šaEgE7 [3n()* l<`T&v}Ou(! `4HAXOе>! +҆5! 0`!WB4`1@ X@( 8 L@M@9zOkU;Xj!I X*^vڥWj:vڡjܪn5ZgjYj V->"^ĵ+J!: ʯ dIdrRZZ$= btȨ΋\rCAt_X'.zbf0^f D V767f/>/IW+ A '6NAڹ‚g"  tTҹDLd@C[1M.yX-'GLB_|־Eg\MƗM!PS=*yU؆\ ;9BGDxj*e˙N-b ^IN۶gW`)N \$x+.0ћ2Q[SC[gX %|;›dDsj|[!8d &y~:<9\H@0wAT)C|%33H>0r=161P.*y4[ŦkD4>0ؘBlab "8>O''FdA7bmInv>)FZS2yb2j/3(7FĬ$G52 f(Ύ94I%*2"vX-Bxp:kԝ\ %("@x/gF T3 )|;oX9R(ogPQ*:pJfuvXص!RzQ#ACqi!PaY2]b3E6PHu~sFxR$HT`w,^[4:)6l~s9_2!. g ?i)eh|Ga #iejDdAo` 9$S)LEvB,/ePa 窀JI??Qg*[99{ Ӧ3{CK%:GJxI|ѳ`NeL輺tr6Ӻ-\jp-Q ¬Sl|ȃ62ʫy8_$*(#+[6 V#iS7u>z&Κq%]Pр6` Fb"2'-HQ{ /Wkc$/sتyn [@7 w 0aVGΙ }' C) -xU"!9[ϳP(pCZ,*BFς!ns#P#Ȣި>|E+ZSndMOH2 L 7ZCCS_#NK2 D<sT)Ĩ xy+YDիKjzoZQ$:^H1d)&II]u20.PUVYzsF;&np*Z8PN`D @?#x"pLB^{Z-ED]v(М` 1 Cm+KJ] 5]Mi h0jxyۛHy:TAuac)ysoܘaSG)$ ux" mTqvN@[Uj43Y n1i {N/Tj5fc絋X̽99@06| = R < vlb28o Q@F;D:l,ecd-Bl mXLL=#+Y$}n£{)pBS 4Jw.dDP#|%Jp+TUY46?qj,sJT`Jb L(7 qyK&M~ ]g7WE8Erty.GxB5Cfr!h{b#zpZِzNd,gMY})$O;- yq}fq7ֵ HS1R&~ZO(]4fFNHPg6y1ÕK*R[A1APȔS$, A'bCp P4>Y!Ov^\s(rЊۨn p) pi5UYZDtY:1Qq7/Rk @"B?Аox4 s(J(qoc^EcѢ4,ГmXh(b imE e&5C1yvI Z&yeQ`ovYIH޸XB{Π 0\#A4$8ЃΨ ZhN}hة%P}@ ?5d19.PŠjcoWHW G!N4K)f>-tnY4*cN aևD' &_0M& ^ژb-9?enב޷ 򂇥E,d!E|KOP :Yj٭O{ Cfm!X w2\~h&;ꍝgPҲxz_9uDy"H ey|ʠ'[qr|#Rr_kR=y8X]8w=Q-^f6,JEC0 G/Iт04Āc9]"9ÄP*R#LɻXz438/߹zeF$1_IVF2QX).TcfgWUv!! 6B"&Şgt9 hdEpj-ہʁ+~^FsR%a4/}0 Q'`EnɸٕtձW}9 _2PS0Ԟ!%RpB q <$ "ъm|BpZ*dğ_~/` %7y+M"fflnYl SyaU乒+NPZ@_ہ;DTYG:ID"i +9IL{Ћ>AD4EEq WJeE|96pX"HMI'$|K'FqB?Yf"%0q?F=O*æ:Cx*hXԠ~UČ>pgcharts/web/bootstrap-3.1.1-dist/fonts/glyphicons-halflings-regular.svg000066400000000000000000001727171315737174100265470ustar00rootroot00000000000000 pgcharts/web/bootstrap-3.1.1-dist/fonts/glyphicons-halflings-regular.ttf000066400000000000000000001205001315737174100265240ustar00rootroot00000000000000FFTMjUGDEF8 OS/2gKX`cmapJ rcvt (,fpgmS/4egaspglyf3!53#"'.'ddqd%Kup<3LJ9D?{dd 09C3JL3akw$B d/5dZgj7X0,Z>d.6dJtB+0W5ju.xL//+01!!|,1,A/Ͱ /+  99013!264&#".#"qOxx.,,nBUPrawי kdL 57% P,XX,dpX[ ,%'7'7764/&" MZfVc $ pQfV\ '  3+Ͱ2 /ְͲ +@ + +@ + +01!!!5! ,,dd&L &7>5%&7>54&&$OAXX@JOWOFS  @JOn)`*^r67)Q7q  OY+/Ͱ//ְͰ+ͱ+$99 99$901 "'#" 6& N,mwȃȎwm,NldXD/ְͰͱ+014>>.d8Zwwy,0{xuX6Cy>>yC@vS-IDEH-Sv@9yUUyG !3! 7Hߒ p??G  /3Ͱ2/+01!3! 77'7#'HߒCIJMN p??t⌍155"&=462#%??%d3||3d L #'+/3+ͱ 22/"3Ͱ$2 /&3 Ͱ(2/*3Ͱ,2/.3Ͱ02/2334/ְͳ $2+ $2Ͱ2+2 ͳ$(,0$2 !+%)-1$2ͱ5+ 9999011!%35#535#535#535#535#!!5!!35#535#535#535#535#ddddddddddXXddddddddddLdddddddddd|d|dddddddddLL/?B +,3Ͱ$2/<3Ͱ42@/ְ2 Ͱ2  +02)Ͱ82A+015463!2#!"&463!2#!"&463!2#!"&463!2#!"&ppXpp2pmppmp LL/?O_ov +'+/Ͱ/#3Ͱ!2 +@& + +@ +/(/ְͰ&+2%Ͱ 2%& +@%# +&% +@& +%+ͱ)+&999%9$999$999901 "'#" 6& 53533##5N,mwȃFdddȎwm,NlYdddd]+/Ͱ/ /ְͰ+ͱ!+$99 99$901 "'#" 6& !5!N,mwȃFpȍym,NlY+E/ ,/ְͲ +@ + +Ͳ  +@  +-+ #$90147 654&'5".;2654&+"ҧg|b|g[՛[ddX(>7xx7>طv՛[[ d 0+ 33/ְͰ+ Ͱ  +ͱ+0173#33333d,dd,  PGQb/PͰK/6R/ְHͰHM+$ͱS+H =99M39$9$/99P99K!'E$96+A9901732?6?67'76?654/&/7&''&/&#"'462"&P-<-1&("/&./80PP,<-0&("/&2,;.P g~~~~Y!)&1,;.Q  Q,=,1&("-&3*:/QQ/:/.&0X~~XY~~d#'+/37!+$Ͳ(04222'/*26333Ͱ/ͱ,22// 8/ְ$Ͱ$%+2(Ͱ,2%( +@% +()+0Ͱ01+-24Ͱ 241 +@4 +45+ͱ9+015463!5463!2!2#!"&!#!"&73#3#!5!3#3#d ;),);  d;)D);ddddd,dddd2 d);;)d 2 n )<<)D,dD , +3 / ְͰ+ͱ +901 #!!!Y|pXd" +/ְͲ +@ ++017463!!#!"&d  X,~  ] ,  /Ͱ/Ͳ +@ +//ְ Ͱ +Ͳ +@ ++ͱ+  $9 $9 $9 $901$  $ 6& 33DVGdD_Vd .+3 / Ͱ/Ͳ +@ +2/+01#333!#3#d)(1,Pp,L J + Ͱ/ Ͱ2/ְͲ +@ + + ͱ+ 99  99011!3!3!%35#,ᯯ, pdc +Ͱ//ְͰ+Ͱ+ ͱ + $99 $9 $9014>2". 6& 333_ޠ__ޠ\TPȖޠ__ޠ__Td, a /Ͱ//ְ Ͱ +Ͱ+ͱ+  $99 $9$901$  $ 6& ##DVOD_Vb,, ) + Ͱ2//+ 999015!#!"&3!73!  2,2aD%  F /Ͱ//ְ Ͱ +ͱ+  $9$901$  $ 654& DV:)DS/ Ͱ//ְͰ + ͱ+ $9 99  $99012>5# &632!&#"[՛[nv՛՛[[vbQz[!z+/Ͳ +@ + /Ͳ  +@ +"/ְͰ+ͱ#+99 !$9 99!9  999014>327!7&#"!32653#"'[vƝppIp[vƝXv՛[zpPPv՛[z d #'P/3 Ͱ2 /3 Ͱ2/ 3Ͱ!2/$3Ͱ%2(/ֲ 222 Ͳ222)+013!!!%53'53'53'53!5!=!%5!%5!dLddddddddd   |dddddddddddddddddL#J+ / $/ְͲ +@ ++Ͳ +@ +%+ $901546;5463!232#!"&!54&+";)dvR,Rvd);;)|);,dX);RvvR;));;dLL+/ְͱ+0133>>7.ddd3&Ͱ62 /B/ְͰ"++Ͱ+2+;Ͱ;+ͱC+2+ $9&/$9 9901;2654> ;2654."46;2+"&%46;2+"& 2  2 cޣc   X     ,rr  ,tޣcct 4  4 X!!7'77',,GGG GGGp/ְ ͱ+01!!%7'654,,EojCV 956nb<//ְ Ͱ +ͱ+ $9 $901!%%7'65477654/,,EojCV^{wQ57nB !/3?CGKO+0D33Ͳ)1E222/'+L333Ͳ%-M222"/33#Ͱ2/H33!ͱ4I22P/ֱ22ͱ220+ ,223Ͱ523. +*2%Ͱ@2.% +@." + 222%7+DH22;ͱ&J22;L+B2OͲ9=F222Q+04?$97%()8999"89$9#:;999@ 67<=@C$9011!#5##535!535#!!!5335#5!3##5#5355333!5#53!!5!5353dddd d,,dddd,,ddddddd,,,ddddddddd,,,ddd ddddd dddp,ddddDdd  #p +333 ͱ22 +$/ְ Ͱ + 2ͰͰ +Ͱ +Ͱ +#ͱ%+ 99990153#5!'353'3535353'3ddd,ddddddPdd[[[[[[)+//ְ ͱ+ 99901463! 2764'&"  SS D TT1+3/Ͱ2/ְ ͱ+ $901463! 2764'&"%3 '  TT d 2 D TTD 2d ?+/ /ְ Ͱ +ͱ + 9999990137!!!dddddL 3 4&#!"E~ 'Y%+Ͱ /Ͳ  +@ +2 +@ +2(/ְ Ͱ2 +2ͱ)+  '"$90153!73#5!!7.#!"7>3!2#!"&dXd5(P>^ > B&  & dD||Z   dL%-1o/%Ͱ)/-Ͱ!/2/ְͲ +@/ +'++ͱ3+9+'!$% $9-)"#$9!.199 /0$90153!2654&+.+"#"462"264&"%53;));;)37S*)R:. );dȐ>X>>XXd);;)X);E5+);;;)pȐȐ X>>X>^dd5"+ 3Ͳ 222#/$+013!5".?!#!5&'./#5m)>$\R+5"(]q *k.tB6,-WBB*. 0 Ɍd )1e +!Ͳ +Ͱ)/*Ͱ1/ Ͱ  2/ְ!Ͱ*2!.+Ͱ% ͱ3+%.9)!9*9190135>54.'52#'32654&+532654&#d); $x!" E4+vOȡY}^LlY3(; G7]7( 3AvFTMaTZd{MRao +Ͱ2 /3 /+0135>76&'.'5!Ms (G !:" 0G9C/Q8$99#'% 4<9 %~+/333 Ͳ +@ + 2&/ְͰ +%Ͱ%+Ͳ +@ + +@ ++ͱ'+ 99 9 901'3#7#33!3#4.+!57#"KKK}}KK}2.!"dpd"!/ c,' 2dd2R '! %+Ͱ/3 Ͳ +@ +2&/ ְ%Ͱ%+Ͳ +@ + +@ ++ͱ'+% $9$99999901?!55!3!3#4.+!57#"! d2/!"dpd"!.3}KK}}KK,' v2dd2 'L/?53!26=4&#!"53!26=4&#!"53!26=4&#!"53!26=4&#!"L X2ddddL/?53!26=4&#!"3!26=4&#!"3!26=4&#!"3!26=4&#!"LLDD2ddpddL/?& +Ͱ-/$Ͱ/Ͱ=/4@/A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&Ld X2ddlddddlddL/?& +Ͱ/Ͱ-/$Ͱ=/4@/A+01=463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&LLLL2dd@dd@dd@ddL/?O_oR +L3ͰD2/\3ͰT2-/l3$Ͱd2=/|34Ͱt2/ֲ 0222 Ͳ(8222+01=46;2+"&546;2+"&546;2+"&546;2+"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&dddddddd,    2dd@dd@dd@dddd@dd@dd@ddL *:J /&3Ͱ.2K/L+90153553#3!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"eɦddX, dddK}}K LddddL/?CJ@+K/@ְCͱL+0173!26=4&#!"53!26=4&#!"53!26=4&#!"5;26=4&+"3535#5X, dd d!2ddddL&}KdK- /Ͱ/ְ ͱ+ 9 9901463!2#!"& ,,,,,,,v,,d,LY +/Ͱ/ /ְͰ+Ͱ+ ͱ!+999 9999015463!2#!"&?'!462"Xd*J%lNpNNp, >pNNpN= +//ְͰ+ͱ + 99 999014>32.'&73264&"yz{yII99 "c]s+?—jk֖|ׁ~rBB "koKk֖I +Ͱ//ְͰ+ ͱ+ 99  99 $9014>2".3"_ޠ__ޠMޠ__ޠ__ Vu%4>7.77.'&6?uDmssIOWM?%N~OrÀ~[[.  \7^`GvwsuEYd;^~RlbJ(I43nh!&W+Ͱ/'/ְ Ͱ +ͱ(+  $9"99!$9 "#%$901463!"3!26=7#!"&%7' 7/n);;));ԥrkqq\,;) );;)}j2qkqqUL.H+Ͱ"/'Ͱ /Ͱ//ְ ͱ0+"$999 %9&901463!#"3!2657#!"&> "U);;));ԥgg_hHCVC9,P X;) );;)5!&4 D>3CmL#R+Ͱ /$/ְ Ͱ +ͱ%+ "$9!9 "#$9 !9901463!2!"3!26=7#!"& '',=B);;));ԥV7R,;) );;)Eȩ7QE+/3Ͱ 2/ְ2Ͱ2+99 99 990135# #35 5#3 35#,,',[(,,L+ 3/ְ Ͱ2+01746;2+"&d d2KJL+ 33/ְͰ2+01546;2+"&d d2KJL+3/+014 &&LL3 |&&d7;2654&+";2654&+"  dL73!2654&#!"  (L+3/+011 4LL+33/ְ2 ͱ+01146;2+"&5dd L,L+3/ְ2 ͱ+01!46;2+"&5,ddLd( //+0175463!2#!"&!dLdd47 'PaWaaRt% 7a<aa B /Ͱ//ְ Ͱ +ͱ+  $9$901$  $33535#5##DDQ I / Ͱ//ְ Ͱ  +ͱ+  $9 999901$  $!5!DXDQ 2 /Ͱ/ְͰͱ+ 99  9901$  $77'7''DSՍՎՍԍD(ՎՍԍՍ 2 /Ͱ/ְͰͱ+ 99  9901$  $ ''DkfDf 8<l /9Ͱ+!499. (:;$9'<99!*9 .99949901$  $32264>:323>54.#"35#Dɏ '-"#1D12QE&D  =& )2X23L(5`.d ; / Ͱ/3Ͱ/Ͱ//+999901$  $7!5#!3#35#DddddDd,dd/i+/Ͱ2/!333Ͳ #-2220/ֲ)222Ͳ'2221+"#./$999()9990153>7533##5.'35367#53.'#536vkYȌ`oKȕ4eJKn}PEf!}Im0JjlH F /Ͱ/ /ְ Ͱ +ͱ!+  $9$901$  $ 6& 7'77'DVImmmD_Vۇmmm F /Ͱ//ְ Ͱ +ͱ+  $9$901$  $ 6& 77DVkW̎D_V#W͎ F /Ͱ//ְ Ͱ +ͱ+  $9$901$  $&#"32654'D>8dtap;Dsd7>;pac//+901!!XX#c//+901! XX,,;@-J+/ְͱ+901 !!XXXh+/ְͱ+901!!!h(,*?XXL 5>7 FX_Ȅխg;@-$Du +/+011!&ځ&p&ځ &"# 7'!' "''ف'p5'ق#O / Ͱ#/Ͱ/$/ְͰ+ ͱ%+ !#$9# 9999014>2".;2676&+"35#[՛[[՛V:#6#:0՛[[՛[[F.d&*04;4'+13*Ͱ227>7.#676%>7>'&" 8./ieh,Jhqx{\Sc'C78Fak[)!#==Y57>'>7>76''&'.7.7o FFB:8( OV $9DkC@&'GOS3 *gJ.  &:4?B8- %>=B'Pd!I,  =CnCSm,U!ٕfmS ;4( .MV .n}3!?GC/)Ͱ:/ H/<ְ7ͱI+7<@ )(5>@C$9 :$.5>BG$9017>2".'72>7.'"&5477./=FOsvvsOFFOsvvsOFC-[TzwRY,H 7:91.f1ii%LX( (WT`G//G`TW( (( (WT`G//G`TW( ( `=^8+(3\;hI%E:JY||UIWs|Ci`$$ )A+3B/C+6=+ .    + + + +$ +% + #999$9%9 9 $%........@ $%..........@017>3273#7.'77.547?./7>7&'7=FOsvH=<%Ɣ%Rri' ҷ%k.f1i/:(&-/"0/a+'C. %ZeX( (WT`G/Pegy8(6nUIWs|C/WR&2&?@06@(( 4kbf &3!26'.7 !5#5#o%%~8~ddDDG  " d-dd,dd)H/ */%ְ2Ͱ 2% +@ +% +@%# +++%99 %99015467462'%/#&=47&dkX|Xkd^^d)1ES>XX>1) [@ NN @[ L #'+/37;?CGKOSW53!265!5!54&+5#!5##"53'53'5353'53'5353'53'5353'53'5353'53'53Ld ddddddddddddddddddddddddddddddd2dddddJddddddpddddddpddddddpddddddpddddddx A/3Ͱ2 /3Ͱ2/+99  $99901=!35 5# !7'!735 5#X,ԟzz,XXz{L+/ 3/+01463!2#!#"&;));;)d);X);;));,;dL%)-`+ Ͳ  +@  +2&/*3'Ͱ+2./ְ&2Ͱ(2+*2Ͱ,2/+$9999015!32>'4=!".!!!d,U'5%;) ,'MeeM',,Xq \ #(,.*R~jqP33Pqj~RV,,h 7`aaCF ' FDBCa:dv(//ְͱ+9901 #!!!# #+,}++pX,pX2F"+3,Ͱ,&ͱ22//Ͱ/ 3/$ְͰ+ͱ4+-901&763!7>;2++"&=!"&=#"&5463!7!"&'&^6**20 -*? 2222*L +Ͱ/Ͱ 2 /+011!53463!2!P;),); d);;)dL(+Ͱ/ Ͱ2 /+9013! 3463!2!!,P;),);DX);;). ! + /ְͱ + 99013# #3.**,X,/ / / +9901!5 5!,X,X*!I +Ͱ2/ 3Ͱ/"/ְͰ+ Ͳ +@ +#+ 901=463!2#!"&>3!235#35#;));;));$%dddddd);;)d);;U'-$ddddL )7&8/ְͰ*+2ͱ9+* 9901546?.5<>;%%##"+"&'4632#"&e2"]&/ S7X22 !U   QRJf+35/+3Ͱ)/3Ͱ2) +@)% +4/5+)3,1990146;7>7'&6;232#"&/.267"Ju?zS^Sz?vdjO}:: 8F8 0l^GM~ $M( ))1==1777'7'7'7'''N--N괴N--N-N鳳N-,N鴴N,d".//(ְͱ0+(90153#;;276=4&#!6=4&+"?3!#',d=|.%='='20`dd22ֈXKd9X+d,Qv,Q(%wԯ}dL".p+%Ͱ/3(Ͱ./Ͱ2,/ //ְͰ+#Ͱ#&+Ͱ)+ͱ0+&#(,9999)+9.*901374;6;2#!+"&/&735'!5##dd=|.%='='20`dd22ֈdX}Kd9+d,Qv,Q(%կ}wddU"Ay /$Ͱ/)Ͱ1/Ͱ21 +@1 +B/ְͰ+#Ͱ#-+Ͳ- +@-< +C+-# ?$9$#9)91;2654&#!*.'&54?'dj  m U.UkmTkdd%7   VXK %  pyLN'YS(  SeV8<y/$Ͱ/Ͱ8/Ͱ:28 +@89 +=/ְͲ +@, +&+Ͱ9+<ͱ>+& )$9$&998',99901463'&54?632#!"&'#"'32!7%*#!3elU.U m  m!kT %kW   $CLy q  ' (Sd)YS   XaL6:G7+8;/ְ72)Ͳ) +@): +32)/+ͱ<+)699/9013!2654&'%54&"'&77><546!5!a ' (NLy%p[S22(SY XVjTnkUT  n V   dp 48E5/69/ ְ52+Ͳ+ +@+8 +!2+'+ͱ:++  99' 901?26=%>54&#!"!&5<.'&5!p &yMNS) % Y(22XIn  U3.TlnTjVSdڂ  q: +Ͱ//ְͱ+  999999014>32 $! _z%,nUzݠ_ &*8+Ͱ//ְ ͱ+9 9999014>32 $7'!7!5_yzݠ_,Uzݠ__z> +/ְͰ+ ͱ+ 9999  99014>32 $%333_z'Uzݠ_,M +//ְͰ+ ͱ+ 9999  99 999014>32 $% ##_z',,Uzݠ_p,|+*ͰO///ְͰX+ ͱ+9X@!#$32 $277>7.'.'"'&65.'6.'&76746'&67>7&72267.'6'?6.''&%>72>7.73_zyݠ_" T>9.*-hu"#. F = .2) ( (%  )#? 6 /R+>=>1  " ,$Uzݠ__zY!w F  /JG  s$>   #/ & % I+ *  ' ' $#   ' "qq $ U _<7&6767'"/X!N` {+o+We6\e~\F/n`/37;P /4Ͱ7/Ͱ/0Ͱ3/Ͱ,/8Ͱ;/%Ͱ>C+Hͳ7HC+1Ͱ1/7ͰH+ͱN+& $9>*-<9971 /;$9 $9*-<>$9(99#/;9901$  $ 654& 462#"64632#"46?&54632#"'"&%462#"&DVm. M  R)z  73H3 .  D.  ,! . 1~! . $33R . ;O:/'Ͱ /Ͱ6/JP/Q+'?9  1$9239901327>767>'&'&#"67632#"&'&>767>32>'.'&#"0#vF?8!@)'(#Z .A#{Ey&$4I7Z 0$&\4=k6_v[EC8fOESkZ(G־N9@1*+,#b/W!#tCu$'$4B?#>@$$\475be[<C]W$!7GP6X5=3/-3Ͱ26/ְͰ*+ ͱ7+*$939014632632'.'.76?>54&#"'&#"Pńbg#WCG`+rFBGCW#=>@]aRq @C>`9J:vr3HZo\o >FXGaSPc9w332764/&''7'&'7'7>54/&#"9BD[]BBB i{_.7BB i_/#7BB]_@Ba_@BBBB i{_-87B]B i`13#j+]BBB@E+Ͱ/Ͱ//ְͰ+ Ͱ Ͱ/+9990174>2#!"&7!!264&"2- +@-, +;/3Ͳ; +@ +D/ְ22ͰͰ2,+:222+Ͳ>222+@+'Ͱ ͱE+29, 9-)9;':@C$99013.#.54>753#.'#5&'.654&''WJ.BN/!XOd&ER<+6J@" MNW(k,;+@GdfC1/*Ͱ/3Ͱ2/ Ͳ +@ +D/ְ92Ͱ$2 +@ + +@ ++ͱE+8BC$9  *13$9,9*1-999,<990153&'.>7632#4.#"3#>36327#"&'>7>'d /-aʙDP$%T)!):#b!!L<2)O'*2'V7   0 $Xd17;V^(Xw4K,9S*3d2;6 "B   7G  +/ ְ ͱ+ 901 ## ##****,,|X,| "+3 Ͳ+Ͱ/ͱ22 /Ͱ/Ͳ +@ +2"/Ͱ2#/ְͰ+ 22 ͱ22 + 22ͱ 22+Ͱ/ͱ$+999 901333!5335!##535!#5#735#d,cdc,dddd,|dddddd, dd"+ 33 /Ͱ"/Ͱ/ͰͰ/Ͱ/Ͱ2#/ְͰ+22ͱ22 + 22 ͱ22 +Ͱ/ͱ$+99"$99901333!!#5#5335!##53535#,dddd,cdccdd,| dddddddd|L k + /Ͱ/Ͱ /Ͳ  +@  +/ְͳ+Ͱ/ 3Ͱ + 2 ͱ+ $9 9901 ##!#553#35#**X,dddd,,| dd |L k +/Ͱ/Ͳ +@ +// ְ ͳ + Ͱ /3Ͱ  +2ͱ+ $99901 ##%53#!#5'35#**Xdd,dcdd,,|dd  dd R/Ͱ / Ͱ/Ͱ//ֲ 222ͰͲ +@ +@ ++ $901 ##5!5!5!53** p,,,|,,, R/Ͱ / Ͱ/Ͱ// ֲ222Ͱ Ͳ +@  +@  ++ $901 ##535!5!5!**,p,,|,,,LL* +Ͱ/ /ְͰ+ ͱ!+01463!2#!"&73!2654&#!",ԥ;));;) );,ԥA);;));;)LL"> +Ͱ/#/ְͰ+ ͱ$+ !99 "9901463!2#!"&73!2654&#!"-,ԣ;));;) );M,ԥA);;));;) LL"> +Ͱ/#/ְͰ+ ͱ$+ "99 !9901463!2#!"&73!2654&#!",ԥ;));;) );d,ԥA);;));;)dMLL"> +Ͱ/#/ְͰ+ ͱ$+ !99 "9901463!2#!"&73!2654&#!"!,ԥ;));;) );d,Ԣ?);;));;)pML<+Ͱ/Ͱ// ְͱ+99901!5 55!2654&#!5!2#,p);;) ,p;));ԥ!(/"/ְͱ#+99013!327636'&#676/#".     KJ  i  VL?+ͰͰ/Ͱ/Ͱ /ְ ͱ!+999013!275!"&5463!5./"!5 5,/5 );;)]]X,p;));,$T+Ͱ/%/ְͰ +ͱ&+  $$9#9 "#$$99013!26='#!"&546;7'#"%'!',Nz;) );;)vJdabI{);;));zN V  Z /Ͱ/Ͱ//ְ Ͱ +Ͱ+ͱ+ $9 $901$  $ 6& 462"DVrrrD_VrrrL . +Ͱ/Ͱ 2/ְͲ +@ ++011463!2 !!35#  dd   pv2L + +Ͱ//ְͲ +@ ++011463!2!!! 35#  ,,'C^dd  ,2L . +Ͱ//ְ 2Ͳ +@ ++011463!2 ''35#  1TFdd  TF:2L + +Ͱ//ְͲ +@ ++011463!27'%'35#  aapԕdd  baԕ 2L . +Ͱ//ְ2Ͳ +@ ++011463!27'7 35#  |bԕcdd  daԔ2+ /ְͱ +01  %O`w8dLM/Ͳ +@ +2 +@ +2/ְͰͰ+ ͱ+ 99901546;!3+!#"&35#dDXdd,pg>@/Ͳ +@ + +@ +2/ְͰͱ+ 99901546;!3'!#"&%735#dx~E{xa{%dd,xp{x`{$#$/ְͰͱ%+01546;!3'!#"&35#7'77'dgXddd,gpgժl/Ͳ +@ + Ͱ/ͱ22/ְͲ +@ +Ͱ+Ͱ 2+9 99 901546;!3!!#"&% ##53dp X,,d,p,,[/Ͳ +@ +/ͱ22/ְͰͰ+ͱ+9 9 999 901546;!3'!#"&%333 53dnXd,np,,L 53!265!5!54&#!"5!LPd&df /33ͱ22/ 33ͱ 22/ְ Ͱ  +Ͱ+ͱ+ $9$9$9999901!!5335335!5 553;5#,pdddd,ddddd* d/:+0/ְͰ +ͳ +Ͱ/ Ͱ +ͱ1+0173737+"&5%;2654&d22d22d22dX $%dd,dd,ddpAd5!sRtEdL38+ 33Ͳ 222(/%333'Ͱ24/5+(3 99013!5"&5!#!5".546?5!2!4635!2dKK"2pK Kp"28 &v& 88 x88 &v& 88 LL *.2+Ͱ/Ͳ +@ +//0+$9013!2654&#!"!73%!!5!5!!%35!'!5%;),);;));di'Wdd,,'iWd,);;));;)Dbd,,bbdF 3?6&/&.'7>/.>fgї{4vev-+fg=!.vev1L@/+ Ͱ(/8A/B+  /99(&)2@$901=46754>2#!"&?>=6 6=.#"m&RpR&m>d|~\ud?, 23/2  23!""!A1)!((! dL+/+0135!%!'57##5##5##5#dL}dddddddddȖdpddL $ +3/ ְͰ+ͱ+013!4&+"46;2346;2d,;)d);;)d);d;)d););;)p);;));;)DL'+H +Ͱ/,/ְͰ+ ͱ-+ #(*$9 &()$901463!2#!"&7!!!#535!3#353#5#3d|||D||d,dddd,|| |,ddddd,dp,L'+H +Ͱ/,/ְͰ+ ͱ-+ #(*$9 &()$901463!2#!"&7!!3533##5#353#5#3d|||D||ddddddddddd,|| | d,dp,L#D +Ͱ/$/ְͰ+ ͱ%+$9"$901463!2#!"&7!!!5#35!!5#35!d|||D||d,,,|| |d,d d,dLD +Ͱ//ְͰ+ ͱ+$9$901463!2#!"&7!!-d|||D||d,d,,|| |,ԖL'Z +Ͱ/Ͱ#2/%3Ͱ/(/ְͰ+Ͱ+!Ͱ!$+Ͱ+ ͱ)+01463!2#!"&7!!!%3264&+;#"d|||D||d)69&6)&,|| | dTVVT,L#)H +Ͱ/*/ְͰ+ ͱ++ !$'$9 "&($901463!2#!"&7!!!#535!3#35#33#d|||D||d,ddcdd,|| |,ddddd,pL!'L +Ͱ/(/ְͰ+ ͱ)+"%$9 $&$901463!2#!"&7!!!#5#5335#33#d|||D||d,dedddcdd,|| |dpdd,pL!%+ +Ͱ/")33Ͱ#2/Ͱ/&3Ͱ'2/,/ְͰ+2!Ͱ!+ͳ+Ͱ/Ͱ"+%Ͱ%*+)Ͱ)&Ͱ&/)+ ͱ-+9901463!2#!"&7!!5!##53553!5353#d|||D||d,cdcd,dd,|| |dddpddddd  y /Ͱ/Ͱ/Ͱ//ְ Ͱ +Ͱ+ͱ+ $9 $9 $99 $901$  $ 6& 57!!!!DVd,,D_Vddd  $ /Ͱ!/3"Ͱ/Ͱ/%/ְ Ͱ + Ͱ2  +@  + !+2$Ͱ2$+ͱ&+  $9!9$ $9"! $9999 $901$  $ 6& !#5#3#353DV,dddD_VddddddddA r/Ͱ Ͱ2!/ְͰ+Ͱ+ ͱ"+999 99 99 $9  $901;!3264&#".#"333qOxx.,,nBU:Pr,ԭawי k,A /ְͱ!+99901; >54&#".#" ##qO^yx.,,nBU:,,Prmdxawי k,,dLm7!!'5!33 33dK^KԪț--,,My7)327!'32654'>54&'.#"&#"y9/iJ8,K^K.6Ji 2;{Y^t Ji5XJi--2iJ f=ZYqtiA_< . .::(dFHFddjdddddd5d!u,dh"oddF:.JadP9'ddddddy****f0HP6,Lrd"DL 0 ` D V >  v :`L&` b&bL8,J|0NZ2F  * F n !j!"B"#~#$$$%%%%%&Z&&&''j'(8(d()6)*n*+h++,D,--.f../:001&1~1223`34455f566\67 7`778P899X99::^::;,;t;<@>H>>?0?@@`@A"AABBCCD?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~glyph1uni000Duni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni25FCuni2601uni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200KPXYF+X!YKRX!Y+\XY+RXpgcharts/web/bootstrap-3.1.1-dist/fonts/glyphicons-halflings-regular.woff000066400000000000000000000554301315737174100267010ustar00rootroot00000000000000wOFF[@FFTMjUGDEF OS/2C`gKcmaprJ cvt (fpgm$eS/gaspglyfN <3!headR46bXhheaS $ 2hmtxS<locaTP4VNmaxpU nameV|ԯpostW@FiprepZ..+webf[XR=  .xc`d``b `b`[@1  xc`fidt! B3.a0bPp?G  I0(00 a x͑?K`mHPDwZ]E :8 ݺv"isEC]|%"2$c=LZMhcHȷ ӭ@r]5UZRG=hMԖvC*#4BCqGJ])qhA}k%@G:ANF`M̓(R<'ڈfYQ*.eYW_|ŗ.w->S>C+7-6d_)_-wa7Sh(x]QN[A  9{ Սbd;i7rq@D گH!H|B>!3k4;;sΙ3KʑwkS$6NH덌Zlfu є;j=o)M;Z ;4: !qKͺb00.?R4j˰Ѽ34@Skm!qK˦6$tUS]`*́Vy &ҷ$, b 9@HƼIJ;ㆵƑ6O'ӿZxڽ `9ޛf1+DQ0Q0c4I^/ޖX|6-Yϙ!ՃF gТ%g"7=^uF3x ]}EWt:基𪯦1Q~ {Myϔ Q+-Ƕ"9FڿſȟHLQ˜ŗ)%3'KVZپd<&I__`XȸFH{xz3$d鿟z=C8[~vt{^0f&ǔBU`Y2̙s80MJ+F)y;&R{}bM;̗gIIańDzA$8f[o_~ ?kunrX\=s_]rB{@>]fr{ czr(񘉇+, ~{n&u=\ ERgg|>(vT Dr Ou,T!g,}ˎsGʝŽ?|?y%Ho_"^c\"MTG wR/W٪([+Gw18u8wdgRL'0e9- ()ҚU%SlU-83JGNqU(*Ӳ8Cr#_grV]( WJKu_k[4<*ED{wrR )߯8RsT]/JAQrsrt^:0~_x RNǶ֏0|F'0dFוd2HI 1EG?J-8LϖN|$OaLdL'p>\ BǷ':m8^ܰ3‰0 ='㾜9 jJE9CEJl!-JsL/~k,PgSr!әڲB@RZ҂*mco knfKwS\ l$}TAg{mEy|x/KrJsUc0aDhiG>8]4<=}Qf|?v#ǿ)(2<08H*DǾ#z: [?.d.@Nu3D0 IP} A-5VM RP 9%TUrs՜$hs2s6L,(}@z Wi)U@ PCK}N)׏.2`XV˗P`>.gܥΓ='dl3پD+ }Ͱ )$SB* 5:I(Ȃ6 J^c,4:܊[ =d[)43M;ɗ /̭{Q2:^Fr6ϞmO{ Hp?kr'w }Ճ_nNsȜ;ə3dm֟mB)~kŹ ,,L#ۗu *&*.8P!\uZ]ì҆i9F% ByL-Uꁭ[Uro^끋z]gPDu"R_I^nzB<}x,N[VGe}lN@3M$kq{YqdvXGk5 ]LLu{͇PW7Q=L_2@:Y$^s- mۋr]mFdbLN\X- hfI!"):Wda=']~ա872gx)) ΪE![xYqS èJ^@p\$prüG䵃p̬(Îw˔N Oy𔑈6][[x[Zݺ=M=}߇dO{gO|T Aj+=0/UZb 3CNx fdac$9Oɳ?<;Vm=o6=+@95=1e+S $;.*˼Mہ*+K5 _W ES}~ԏ"x"3+2f5HXB d$(-{wT7hp" _5LP_Q{lK$G=G7}YS+vUv! 'eէ>*y6l΢M ,e3b|ҋEEW2bq"&FzYkOēˏubTpL} O.MG\Tg%oGo3r}SB)H lÉ!A'I8'[әU alŌ8CN*Y4^ {r,$"Y[ ãsDbV\@ˈhА{(,g _-l9j$w\ެW'n-\rU}aiT[eS?Tg$3`-fqxi0Fr{\L9չD3Pʉx,)F8< h `/Z-.D 4ZJ0F%!;fG&WU*Juʖϒ;Ļ$\|gUZ*˫y(N`eJ@LT} Xڧck {өلݳ_084k6%~OTݒGљ G/"`TC ]́$(BEMFEF,4Qxvi棇^Klel !w%zQ[Emd x hs4?>Sד͚S8jI e\[iP0leQE}L+KkWQH\&44!<)+ |J?q]" Ž}_9~NMtO 6q ^sJZfm(݉ϔZu-4Lah>JX`9ɓۇ[=V:k6whToU'YatCp .VQX0C"0+DF~C]`>ހK0$B(mAGe;5ߖ1 ۹啯r g>%}k)' gLg˝e껗V6>KWnKR{#AhĀ(t!H売s蓥+LO[u6:#0nL/p'Oo⩄v_{ s_ s`Sn2kcQw[#TPj.Z0[@Q_CO9 r4_kksdZ2P-Ҥ$l`丘яKH?uuqȬODL-:~Kh~Cs:͡YM .,b51+AL܄:B2-K h 9^ ǿeOAcfj`f0`eD=I@445 )J`^MH8Cgs90p[=8>U[ j`Vmo"5lWfʳ?kqFuH]N)qгGhǵW*?: u½M:4sZb兵| u/\&aߏtuEܑ.0=t 5s({>aris=@$+X] ]Mퟚ87R#Fݺ&t=^wWұ$=he6wq g$#< vG !{®倠3֤$ GXCk*&^Ty{uڅ ;+:gx.[qW{dtşE܏:x|MbG׼Zt]hD& b€FюCˉGer̬~`78y F4[fSɾAsW-X/M|i5O/]g~k_yi\}U{x7(xѷm%Kgf& k:Dj8KӢKH _Ԇ԰a8FQH bPB%O.H6^&(:IcD̀b($m4;}yrueIwoh+ow޹0K .[<ϽR3feTU1k٥ ^E"SP+`/FL֧lka.B$3b c`o]sddY_0{~ -k=H41S2 uȹ㵗7xkqS /0* eDƫm^'-3")kh>2-ܡGI.P[:C=?Z~$3sQV=pYD uJ./LB#i> 0YبHFI>$fg 7= |O} +ie/Ճ/W3qE9h Hd-AOS*zrXэ媋OVrk%}YB?݉Y~z5S I2~'F4{`Ԁ~Cxz̅2œog{7$B.-(_V"w ]/# S69r]{%¸+Js6~i. C:p C#7",0;C~ "*)cDc s5(4!Yy<3ws&' k|Gauh|Y֪wݫN>AۨNuThPT ;Oͣd/{H] 'Nh-Fbm[?f׍)&a qs}3~%%Z3 3)Y ٨>vP"cʋұ|4Y144GKj̇3B4Y{9Je\s{g=;CN'b&q"LqDd7MU1׈wR}OEň'&Ȩx `+p1KpZdʎ@4Gʶx7LC\64S- 7zPsb_,sÞ"L +D,ڵ8^>7L fe@A)OTq8Ws TN^WlrO|+R O +έ7KM߰b~4E_"9_ Xϛ%~3Esq4/q Y'JZxm8}W W1SU'Cp| 9vNgwTs?_/${@r^ av4'N&])PӋW>au'?owE- 8OnXW>)La8VnJ1dᱽlD>zIu_֠}v,ҭC`QO2P/@s*P74U# ?$/!yl/|kC دnzt3kSɿR Fq ^u+&԰`[\(kMȔ'K7NI7o&ΌG`~/N{ Ql]Wb$7N8nޮR;׶cm ͩ|qf9ZJCZfit 5/JƵ,8i3.W!?oA|3xǒHߎv3o(%ix{ dN$Lczae)=9 ԆŸvf襝ѽjghaw1'Eir כwTMUN ^zbXBm aR±1P%>Gz?J Y,{is\~Wy 7˵hbX=RQou%Bh׀e-/#}'YZ;ˁ)^MRaC:4|0&1-V 48iz:s_t-eW9qfy7M7*ƿ24uo:{\w?ß^3=U#{3Ϻiuk6+ZZ^!ΙK?fpQR[UJ058gFMq{eX }a.&_cS>ٗJl40#nK y"#39[kECg1;9l=˙||Rjӽ|!g8Qx!VWН! ޙ[#7vKPxԊ.)7zf_2)5X!3EλUަ69-k[җ`ef2 .OUeN R B BTYs hjo@c6lY!U@4Ҋ 046[~Ŗ/~q5fw^yJ+)f{Qs%/Ҷn ׵a6}ˆ3wN,L̝Xt Y/ohmi `  '1_cΚ%:lP/_3REq;͡ؿ8]Ns{l˝-wƍ`+~%د+~v)=t%jFp:H[םMd`PHz-<.lS~u+cLf3w,o[w_sѓԭA}&_ڔ08M6tض"/13g%fh9z| $*waVc(rsGFIP9Î8e͒͝儯VZN%`hðKP| "dH\0bh0&>'ٴ~zŠ7۽=2^~X}ZGGkMiY^ѼlYFp5{'ua(jR9eV1F? 9_va.)T4ľ_0$[TKa¸@>i~YФm/eǍ3Bk|[}M(\`9pz@/)pQR}X OϩO!ˑ(ll1?֖զ:Im25UN3=4oiL2 /Bגu'o6"G-j'4-sW`a&"OZOzWQKCod ;_[k,su `вk eitÈ~ %0L;Hi^rÆqKr3<7X aY 3bsU_Iȼ0 GXAE} %G=SQߵYIDNV˭gh^ ,u6WhFk$2՟-ӜfC9G T,FTА345yWt^mt{3ަ.^2c;HM7:"rz_ JVq6$w+[PSAAԷh)K ;% eov?>z,\5EĘ44vcXk֪w`D ,m-dAGg$D%.eqhH:~h(~y(mpGݎm>\\'#ŮNnk~_ r ڰ%:r3jz{6USglvaaaiMڛh+@԰LEwօ.p^ݭtªFA=I9 ٣OzXM"0S<0> "7Q w2 ȓ鼄h5kt%4Cۋh{h|-9.Zrm7ͨEr݀~I¦V@9OH=3:BhIV*Az2G,MLbA.tXE^՛ MNI1569r]jXy3'!˗%=E}ۖr=ˆ;Uӫ/d8ZfSUp8288̓'43t}E7=iC]6tȺ}VLzM6`AD2=\$XP=%~=zC,H%]_}`r7]` 4lPb%7u-دUKKaWI  <@tm+I=DzT}W^BaFb:Z{_޼>)rRi$#6_\G>sU8ichjI.y25mm"}F)͖LYJ CNi~ G c2> K:i:3ǸZf;QvkVL 4 =+`UQW}M߫`H/8Џch'ٷkW^~/w>,a~wlwVS(,ӾrYIZ )$Qk'vHjpUvѸɂ‚٦NZO~XJ08h[0HR ?03;=|F: k=lg_G0niI8J\,epu>O-lzʹZA' tq$"«'l\Gڎ v΂ #pO>6ﻢ-oÇ;}\noCdo, RU@UWo`J)9ٯ`SRHr9jDaeqU+0,7%~ 6 jf7P@’y3GgDrgl:kNWk)twaT95{6䳶ӎ sYsWm:mʐCV :+*KnM/̌jm y^}#F$ƺϵF ~1ͷǯgԏ#d X5`fl}.8|.D5h~ uGavTL)Xd0mY\cNJ'㊗n_ :/72Có|gl\ym fl<`ٗnϦOh,ϸyI_tjiIþS/=R7zh5O@` mz>`'@. &D/13FH=˝Fl$~&Fvq,#dYvW=lYŸ߲om{rpddD,MWށA%y4VzdZwkU5 ʦPU\Q^_<'\VhڡE[R6ұ 8K?`1Gdo/+W@Ł& TZktt8HhUx'dOvN-'~R GR0=cr7O=.INHwcn9e@f].Y30 NodnJ :澩ZM0WDŌnmWo0 Wܘ1pq4|)q FĢw7M_Iu6=,]}y19w`'oѬB[ywKk{]bY+Ii9NL-=]3/YخVk?a]L\׶ Qmt:k~@ ? *v(aMlղ>i*RilOβ@_U;5Rҏo#bN9k'; KF,u j hIJ>BCK(>I紌}ђ4C&5lc~e7>v5y$I3gK/D fۗ:eSke(YDhfke{ g/_ݻ9$u7C}Vڬw*Z w5Dj?ņD(%+T4.Y|gi eFiI ݂=VF ~Ƙ!mhbZbx`o;͓rFGC2@>K8,m0.-#_,Ԅ]}ndrMiDX5ZH.*"fGii h8QkT}1"9x:[ !hW<8: * 4q:G, (|ލݴ{`X`E>;S8X4DD|qHP5M5@[iġH?ʕDR p&bjD\T;$`Rl;I,f|m58ZK/X핓jփֶ@tڶkx^0 |,t^I\ux+z3[՝w6O-ԂcX=EQ\T+whjЋ9 ThPd h%Sjfx%!tFX&Y!K}#iu#G~kxcFx&,C4#?<" wF96a%hLl fK S_+ZcPdD@Z" cB'_._Z{[Ex0>lB!.^Aw*Ō%F1׬%CcYy)o&"Îg<LT1-^`whP@lCM@ieVp: U$Q9 iiE8V-c5ѠHm"딠{ݴB j@MˮUT?eQwȟ'48{eup2r!%ٯn<&a?j?xdA.PqN+ǚ3Ԅ잱 !uR&{ck2Hq*̥ FH#H|#[6<왲1R!ZJ4'k^!MsdZ1:n,x#w؜])V,< 諛CôbP?B'esxBmD`*u$~Dˣqw٦~!{5dj7w͍` Nn^m垨࠰L>+DCg*Bii(8 NOX?!M_ Iݔv5h破sIctro 3@:]ǖN (`i9%$v2@NJfM)hVFͪ+ 4;z #>RaixLx%$bG BV[CHNFA(-o&(TPh_=؈%:6:g2v@\]+z:2z'kŘ Ɩ΃{F7c 氽IIn,Y9|\dҩ#ZZ+ > S"Y-hU4Շ xc@n$jOP9J 3!at[nz`ֿ_ѣzh iDrL{^Z]6-fjNيK>K6ag՘nRGa&EڛPgbxyIlVOFV n k`jD{`s1 ڏoe#^)΍46^0CF#m9%W-Vڻm9)|Vxk&[hSh!-I~>4pKn9(8@Qɛ ͋-X\;2ݖ$w[Ӊ,9k|Nrgl'?̴fLٯk R@,hZ8J*دnGe)褢$,sN4ZtuEb 0ScPiWk؜b}v86[qq1.!!|F;a.7a'0MRaN"{;_<" xz][v;wht|~}w<{awq{l(><1׷_ 㚡y{'eJ#/Mh_f`YhP a.+Q4+Ik%/v?cI$%Wn^B.vH(d2nŭo;3AoA2YMKV#vxR1)b .EڢVK}bp';FD4=]%=}2}zG7nкWvOsL;ڴvoJ;!MTi zZ\}B~p4&&>KJ漢jlOp힮}>%֡u#d[V9<qa7nr\u);T]xx׮<#S9uR/ ųآ1AY*.o%6i:.$<.vk߾=yiq׮ݾ[fMqZ:y:Bg&̇Xqۉ уp3 hUO)flڦbӮcW 6#D`S5űU|>24  Nf8>L)ZU5 SI0duf Ɛc~^U]4)+)5aQh^8>ydk=N$HKs+)BH*$iirߙVhhRCxc㺇R^_ч)ɻ& VY]Wԯ6NCDλиw;A:-àfMp ϖ[hNK,:@Q,>TwĶxiJuVb.>Xv)AbQ a9ʲ?V@,:Q'B Fxb| ~уI 7]V옩bҪ f6j4>kE_) f`|thO]NI{2 G%36@0$ D`;.['&%_%;̠7yOcտx `slRـ uGf1hV3䬉`h||k'9/(_U/~xS 5蹺} FI`PCÌ fݻ`Vz-N kdLe "7y8t |f]۟/X4 [t9;p)/y#ü@~- d,GZ:S.{Jɳ0.xc`d```dp\SO 9_@ f 5!j`aXjz4#f1Y yI!+VĮl~(zP T;uv43 ' A g {c P<n@ H !‡Q^@,*L@ gE ,G 0  'G(Ƅ&dAg@)` sP!HO?*R|xc``Ђ4% cc *s̘f0azǬ5MͅS8 88pqqpupǎg o*>+.;7|: NJ%,&'#$KTMtX-q6M$u$gH򒪑&uMꉴt6_dddȼ5=$' %FM~G l Z n y >)f)QrR:\NEDe3U9TߩEuS{Χ~NB#Ec<7ڛݧL/Mo/}+ mju8v'O02YdbfL,l9y?[,%,#,Y^jfc]b}&掭 ;;=v g909$8lqTrpùK<QˆxڭRN@4I8 "xFѣT(BTgŃG@ç`]$ivw|S/h+zX1#óQn“jO O!+#Px3g "=!߇ahn]w,囖&<5ب#G4Ha·vp];Ă߀\>Ɛ/wUUΗdn(mzWC}=G۸aEbgRz)WSiyDSy=u2XtX\@ j NUqrX#X-P>&]~6};ʵϪ@B 2W32,2c ɈxmUהeFـ`ݭs(*vwwwwawwǁ?Ÿ^3kf?5k:c: :E?;0333q,x&(8K$R,2,XXXUXX5XXuXX ؘؐMؔ؜-ؒ zT4ٚmؖ؞ؑ2`م]ٍك=ًه}ُ999C99#99c999iLg's 39Yf19yY|\|.B.b.R.rJjZznFnfnVnvNn^~AaQqIiYy^E^e^U^coo __ ?? i3ϙ fvS; pn-ʭmݾ;ypqysgFna_jxx<|xk'vb'k/b/bW+ {^aW+J{^iW+*{^eW٫U*{^mS۩vj;Nc^^ck5{^kkZ{^^^^^^^^؋>­{;GGGGGGGGGGG}tG}tG}tݧ?????????; =]3@KPXYF+X!YKRX!Y+\XY+RXpgcharts/web/bootstrap-3.1.1-dist/js/000077500000000000000000000000001315737174100175075ustar00rootroot00000000000000pgcharts/web/bootstrap-3.1.1-dist/js/bootstrap.js000066400000000000000000001537321315737174100220750ustar00rootroot00000000000000/*! * Bootstrap v3.1.1 (http://getbootstrap.com) * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } /* ======================================================================== * Bootstrap: transition.js v3.1.1 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { 'WebkitTransition' : 'webkitTransitionEnd', 'MozTransition' : 'transitionend', 'OTransition' : 'oTransitionEnd otransitionend', 'transition' : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false, $el = this $(this).one($.support.transition.end, function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.1.1 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.hasClass('alert') ? $this : $this.parent() } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent.trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one($.support.transition.end, removeElement) .emulateTransitionEnd(150) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.1.1 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state = state + 'Text' if (!data.resetText) $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout($.proxy(function () { if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked') && this.$element.hasClass('active')) changed = false else $parent.find('.active').removeClass('active') } if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') } if (changed) this.$element.toggleClass('active') } // BUTTON PLUGIN DEFINITION // ======================== var old = $.fn.button $.fn.button = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') e.preventDefault() }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.1.1 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = this.sliding = this.interval = this.$active = this.$items = null this.options.pause == 'hover' && this.$element .on('mouseenter', $.proxy(this.pause, this)) .on('mouseleave', $.proxy(this.cycle, this)) } Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getActiveIndex = function () { this.$active = this.$element.find('.item.active') this.$items = this.$active.parent().children() return this.$items.index(this.$active) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getActiveIndex() if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || $active[type]() var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var fallback = type == 'next' ? 'first' : 'last' var that = this if (!$next.length) { if (!this.options.wrap) return $next = this.$element.find('.item')[fallback]() } if ($next.hasClass('active')) return this.sliding = false var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) this.$element.trigger(e) if (e.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') this.$element.one('slid.bs.carousel', function () { var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) $nextIndicator && $nextIndicator.addClass('active') }) } if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) }) .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid.bs.carousel') } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== var old = $.fn.carousel $.fn.carousel = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var $this = $(this), href var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false $target.carousel(options) if (slideIndex = $this.attr('data-slide-to')) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() }) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) $carousel.carousel($carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.1.1 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.transitioning = null if (this.options.parent) this.$parent = $(this.options.parent) if (this.options.toggle) this.toggle() } Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var actives = this.$parent && this.$parent.find('> .panel > .in') if (actives && actives.length) { var hasData = actives.data('bs.collapse') if (hasData && hasData.transitioning) return actives.collapse('hide') hasData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing') [dimension](0) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in') [dimension]('auto') this.transitioning = 0 this.$element.trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) [dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element [dimension](this.$element[dimension]()) [0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse') .removeClass('in') this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .trigger('hidden.bs.collapse') .removeClass('collapsing') .addClass('collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } // COLLAPSE PLUGIN DEFINITION // ========================== var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && option == 'show') option = !option if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { var $this = $(this), href var target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 var $target = $(target) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() var parent = $this.attr('data-parent') var $parent = parent && $(parent) if (!data || !data.transitioning) { if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') } $target.collapse(option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.1.1 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2014 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle=dropdown]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $('
      pgcharts/web/hallo/000077500000000000000000000000001315737174100145565ustar00rootroot00000000000000pgcharts/web/hallo/editor.js000066400000000000000000000024431315737174100164050ustar00rootroot00000000000000jQuery(document).ready(function() { // Enable Hallo editor jQuery('.editable').hallo({ plugins: { 'halloformat': {}, 'halloheadings': {}, 'hallolists': {}, 'halloreundo': {} }, toolbar: 'halloToolbarFixed' }); var markdownize = function(content) { var html = content.split("\n").map($.trim).filter(function(line) { return line != ""; }).join("\n"); return toMarkdown(html); }; var converter = new Showdown.converter(); var htmlize = function(content) { return converter.makeHtml(content); }; // Method that converts the HTML contents to Markdown var showSource = function(content) { var markdown = markdownize(content); if (jQuery('#source').get(0).value == markdown) { return; } jQuery('#source').get(0).value = markdown; }; var updateHtml = function(content) { if (markdownize(jQuery('.editable').html()) == content) { return; } var html = htmlize(content); jQuery('.editable').html(html); }; // Update Markdown every time content is modified jQuery('.editable').bind('hallomodified', function(event, data) { showSource(data.content); }); jQuery('#source').bind('keyup', function() { updateHtml(this.value); }); showSource(jQuery('.editable').html()); }); pgcharts/web/hallo/hallo.css000066400000000000000000000046031315737174100163720ustar00rootroot00000000000000body { padding-left: 20%; padding-right: 20%; padding-top: 50px; background-color: #eeeeec; } article { display: block; line-height: 1.5em; } article h1, h2 { font-family: "Georgia", serif; font-variant: small-caps; margin-bottom: 0px; padding-bottom: 0.5em; } article h1 { font-size: 24pt; } article h2 { font-size: 20pt; } article p { margin-top: 0px; margin-bottom: 0.5em; text-indent: 2em; font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 16pt; line-height: 21pt; } article .download { text-align: center; margin: 1em; } article .download a { margin-left: 1em; margin-right: 1em; } a { color: #000000; text-decoration: none; font-weight: bold; } div.hallotoolbar { border: 1px solid #babdb6; padding: 2px; background-color: #eeeeec; border-radius: 6px; font-size: 12pt; line-height: 1.1em; width: 260px; z-index: 500; } div.hallotoolbar .dropdown-menu { width: "200px"; background-color: #eeeeec; margin-top: -1px; border-left: 1px solid #babdb6; border-bottom: 1px solid #babdb6; border-right: 1px solid #babdb6; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px; } div.hallotoolbar .dropdown-menu .selected { background-color: #729fcf; } textarea#source { width: 100%; min-height: 400px; color: #ffffff !important; background-color: #2e3436; border: none; border-radius: 8px; font-weight: bold; } [contenteditable="true"].inEditMode { outline-style: auto; outline-width: 3px; outline-color: #111111; } /* ANNOTATIONS */ .inEditMode .entity, .inEditMode a[typeof][about] { border-bottom: 1px #729fcf dotted; } .inEditMode .entity.withSuggestions { border-color: #73d216; border-bottom-style: double; } .inEditMode .entity.person, .inEditMode a[typeof][about].person { border-color: #e9b96e; } .inEditMode .entity.place, .inEditMode a[typeof][about].place { border-color: #c17d11; } .inEditMode .entity.organisation, .inEditMode a[typeof][about].organisation { border-color: #8f5902; } footer { margin-top: 1.5em; display: block; background-color: #eeeeec; bottom: 0px; } footer p { font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; font-size: 16pt; line-height: 21pt; } pgcharts/web/hallo/hallo.js000066400000000000000000003204551315737174100162240ustar00rootroot00000000000000// Generated by CoffeeScript 1.3.3 (function() { $.widget("ncri.hallohtml", { options: { editable: null, toolbar: null, uuid: "", lang: 'en', dialogOpts: { autoOpen: false, width: 600, height: 'auto', modal: false, resizable: true, draggable: true, dialogClass: 'htmledit-dialog' }, dialog: null, buttonCssClass: null }, translations: { en: { title: 'Edit HTML', update: 'Update' }, de: { title: 'HTML bearbeiten', update: 'Aktualisieren' } }, texts: null, populateToolbar: function($toolbar) { var $buttonHolder, $buttonset, id, widget; widget = this; this.texts = this.translations[this.options.lang]; this.options.toolbar = $toolbar; this.options.dialog = $("
      ").attr('id', "" + this.options.uuid + "-htmledit-dialog"); $buttonset = $("").addClass(widget.widgetName); id = "" + this.options.uuid + "-htmledit"; $buttonHolder = $(''); $buttonHolder.hallobutton({ label: this.texts.title, icon: 'icon-list-alt', editable: this.options.editable, command: null, queryState: false, uuid: this.options.uuid, cssClass: this.options.buttonCssClass }); $buttonset.append($buttonHolder); this.button = $buttonHolder; this.button.click(function() { if (widget.options.dialog.dialog("isOpen")) { widget._closeDialog(); } else { widget._openDialog(); } return false; }); this.options.editable.element.on("hallodeactivated", function() { return widget._closeDialog(); }); $toolbar.append($buttonset); this.options.dialog.dialog(this.options.dialogOpts); return this.options.dialog.dialog("option", "title", this.texts.title); }, _openDialog: function() { var $editableEl, html, widget, xposition, yposition, _this = this; widget = this; $editableEl = $(this.options.editable.element); xposition = $editableEl.offset().left + $editableEl.outerWidth() + 10; yposition = this.options.toolbar.offset().top - $(document).scrollTop(); this.options.dialog.dialog("option", "position", [xposition, yposition]); this.options.editable.keepActivated(true); this.options.dialog.dialog("open"); this.options.dialog.on('dialogclose', function() { $('label', _this.button).removeClass('ui-state-active'); _this.options.editable.element.focus(); return _this.options.editable.keepActivated(false); }); this.options.dialog.html($("

      The exact pixelwidth of the exported image. Defaults to chart.width or 600px. Maximum width is set to 2000px

      Give in a scaling factor for a higher image resolution. Maximum scaling is set to 4x. Remember that the width parameter has a higher precedence over scaling.

      This will be either 'Chart' or 'StockChart' depending on if
      you want a Highcharts or an HighStock chart.


      The callback will be fired after the chart is created.
      Paste in 'raw' svg markup.
      error.jsp000066400000000000000000000014771315737174100406500ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INF/pages<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Highcharts export server

      Highcharts Export Server

      Oops..,

      ${message}

      spring/000077500000000000000000000000001315737174100371735ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INFapp-convert.properties000066400000000000000000000022321315737174100435460ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INF/spring#### phantomjs properties #### # the host and port phantomjs listens to host = 127.0.0.1 port = 7777 # location of the phantomjs executable, could be for example /usr/local/bin/phantomjs exec = phantomjs # name of the convert script used by phantomjs script = highcharts-convert.js #### connect properties used to connect with phantomjs running as HTTP-server #### # all values in milliseconds # specifies the timeout when reading from phantomjs when a connection is established readTimeout = 6000 # timeout to be used when opening a communications link to the phantomjs server connectTimeout = 500 # the whole request to the phantomjs server is scheduled, max timeout can last to this value. This is because in java you can't rely on the above two timeouts. maxTimeout = 6500 #### Pool properties #### # number of phantomjs servers you can run in the pool. poolSize = 10 # The pool is implemented as a BlockingQueue. When asking for a phantom server connection and nothing is available, it waits for the number of milliseconds defined by maxWait maxWait = 1000 # Keep files in the temp folder for a certain retentionTime, defined in miliseconds retentionTime = 60000export-servlet.xml000066400000000000000000000037741315737174100427330ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INF/spring spring-context.xml000066400000000000000000000021371315737174100427040ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INF/spring web.xml000066400000000000000000000040231315737174100371670ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/WEB-INF contextConfigLocation /WEB-INF/spring/spring-context.xml org.springframework.web.context.ContextLoaderListener export org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/export-servlet.xml 1 export / cors com.highcharts.export.filter.CorsFilter cors /* encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /* resources/000077500000000000000000000000001315737174100366545ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webappHighcharts-icon-160px.png000066400000000000000000000500731315737174100432550ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resourcesPNG  IHDRg- pHYs.#.#x?v OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FEfIDATxyp}=rW;@ (eY,ٖͱ}dUT9SJJW52I8VXŦ$)&H@b_t9}/^K$4N-@o)%[_Xp}u:c}>~jR裏8~zNk#.=됮Xp<җʫ$fCIuCeUCFm0-^jr5P,.(bDaT(pUa)EaL MM*L\8qS߃f |+6lo7Q+wIo3W*%TKH*$$kH @@DRᔁT<&(^PGo!ןƍ#UUUƟ:?ϫ wl%DHx $Јaӕ{5]ι꺆L n0B҄cHtNz''{i;vPH$r``@FAkOiS_yMHP x;tz"FlŠNIr)$HH`M>oT@r Rw͚p B mJ3f?LGF_G nJE*_sC{R/Po} `Z@Jι#uw0ڊKa PSL. Ə>wݟ= @7MS%ဈ=/ү4yB{Q TIȹNlVT\B2JMY~E_ @TUU/*k_r`/Rb/r5NToiqnB%(cP 2ˆvƺ߸vo7(nT^RW ^ҸO(ziٽ/BTjP)O$&.|O|plhhh@<pX._'0YCf2ERD|[/M4=|5+W~uMm9ޓO xsAL雡87^eb13 b5f۾)h47\H(>ΏH2OW+`0(("[,z{7~Rߜea5[zQH $=J8***`ƪSU 韶:t?<'~c:!+D%> A0LwC/0KKKaf2E W-7>xs-!|.zF | |wll4\^^. !'&??Q^ziii#Sq[=H?Oiii) )ܥw' sT~~>?&iXF$B߳v#)$b08鯔LQ= G<O&+`>;ȯת{m:n"P(D- 23 Rrzh4B~s@)9B|/8MU8Fhʺ-ip ̀8oѮ=b11|^l!\v;&=g[LPSs\"mwh)Äg#Bkw~_-HDQ2JHWeӏ=R)V[AЯ9n2X.\!C"f᧞z?^mmmC"E꺮 \1s_a+7HkLFiCS&h ?__eQŧ(>cmRm0I:ʂ9Ǜ\DqÄ"H@`!4zSRJ"Ɪ#N3KJJJ6f"[v"$TFs.A'lDi ?mxrF|h is0Uv~dÏ&IEUR)&cz~_mhh8Dݟ,X4ɑH3 KziS 4\[}c%yR4T7O#jŎt:=iZPaB$i04Ji(>)e .b%P?<쳿YYY+}H[]"mhq^g X UAgv⋏lEK]OO{Ǯbx*HL@ T)3Ɩ|ީ;'Hi/HRi \,\J(1&R 4HY8ވNjo@/7?4ww!6HX@֖ ='@8FcU?v|@:G>#WWL\Hp龇Բ,1`3Nܶ Qsj h[Yغj/H<@3td;*9n|.2)WsYU>}x_*mAeOk nEk9C$ۅG mвi4UJi1桔ffH$ˮ/ᲲLQ\QX_OBC=Ri nESUpNg[S67:TЁO9  U3 vA"e"P Lw=⣔`ĭ5O(7nH`/{^_4.J6b:[ -簄ף]˾(8VR˺ɡ < = wl44ÿ.EKBLSVZZ9 !>rZ+TpQ ȗ^z0T/Z32&{eMx4ewSݛj:G[s%Z. Ρ*<Ԋރ}{~}OUJoY}yeiKq ]VT⋟QUVz4ڦչ:ф1@M%r! w5ݲAa{բ$4 ZN}v+ߚvoVd8*(nj?॔? Ŋڂ>~8<~c5BרҜ d*@]e\.[J&eho–2y|-Uh+\qB@B=r~vc,|2F&{tJ0N!x?P+dI{of ( .%M$fq^MWS!Pcqk*Þj??5gQ| OѕlUܙuZEJk͛[9Ͱpy|~z 9įCe,kZʐHr >uLaXر6TǮX[!(pLJs~6:?q Ó1xY,BPWG]e X./dTJ7K)H2E Љ~ݻxU^B%Y$ O_'XH J)ܷaQƀGMʊ9h OID Mј].PiW<{}C˖BaԴ7z[@ S #(@SқaBp致'Q0y[QŮjx5&_䐠o憲`8=dW؎C%D& ,I (V]s9"iȑ#튢T.d˃^KlIbcK}.38GK])l*^>ݣHFوxc^* !C;H{cNy޽x:ã1gwa_[]6 6-W?kcB.o5Ta-m⡔+gqFTWWB\^%0FN EӘr 4=0(N=/Ʊx"I*ho2XK JH.6/ޜs7Ƣx0BLn+/~-9=BȜe FUB w:"۷x<.ASf#aU%M9ǕtU1-ܿcd*3UwT"t,ףf/i"m{ǺUyg|/=;6Ve?>_~{'22uB62) @w`,T4A6.F܏wژQ ò02IHu4T@)-wеMci3WG &J ]$ 9G'z;DBJ ڂ}m ?[%HB V>)98>pM>+***dF}eN8~ !q'A 6T Um%iqrm/~|ua;aQq zÐৄ 5^$ N6 63{[fg3$po\]/Kqxw#tDzQ{Q VfމSK+Jh4Z vnTj'\gq0>T,sm~#(E߉(%`´8>:P ֗bJ0zgs\u4[(h'zf 4q<{p|Nd8s#Sq(B`6TJ)М~pb&q&!]c+[>-qRxDXˤUzR[rg7-l(B8n,OW90cRT2?RZ, oÖҜhch" "G}e_z|{b}1ðrEH,3S[+ RbA ^%j}xrl D ><M) x)-|彫pҐ`Y fT0\OB6||mŊ+n55 ) #S sl}}yۈ_q#OUCHv\z=K'02/BgS K 8eVGې.#m y4B4,<ۛ˳KUu!U{Rʺ >UQ<BR$xg&8D3K,.TEK] 쌂0ē N'Ԕy\![/aIQY)H2DӸ36`"37W`kS} x~@Km lQ㏻F? dRߐ-3co@pjx^ʘ2,rҭ>1Mic9| [Q]a3Ep8GUa[c*Jt;! ANmu?0٫Vmʱi!T06QQBۛOY\bϦ*ԻkQOaX|r|)l'1&rJv lrryJWG0JSNӠgS=4NB!BnFJ ~KDAl8eGtbQ'ع3ʘAr|;)./r7h {hu%BJXx8F4ѹ1LG)s5J|Fa@\㣎laZmG[sEa"Nɭ!!tc~i :78%`|:/ް"ΖJ6°lW]gFN]* uLv[sI i훪T]R=]srg c(\n/>FLѵ*ۛ+`HVR?KQL Tzke׍iӹa21'yy#0ܘ^TR<kh6l¥I\韜Uû 4*]\ǣ20i U<*#Y_(udz1-<=W`Ϧjx74%ptUpû0ۥ+30A|=Z{ tMHoLU\K=L<.!O9b{slF< ǔnk*GK]q{ҠűOoECU\^.x= ݜALѿcc49̓Iq‡]sRg5tҏGg pLNfJ|h' DD曩׮"9vqx!iZl.QtߜjxlO#>5 xuG+~#Sq\.DO ~j#ӝ "%V^*L3p VZxT%;}hrMhP.7OgMXnvA;@ YVH yljם`F 7qwlQu|ۛ+q{=`r:Fpt6Xyi+vr{kSyb #~iŸ`Cu0K,xVpn͕TDVi T=ؽ&'7<M^UsݣaOD̢URyR''0, }؛.$">ވ I#_S& y31{4nBCu Ä^]eo"kYGް8|VMzTEWS WC;Pɢse jC`5Yk4qF)7fMm4a)_" wA ( Dф9LiΉK:&xL_N| jO PtlYSg@p Klm*Gۆwih*m(ɝ)ypk kK]W [MeBPoĶrDbi<*6gaB \9 @pJ?nu2 {18]8Dp6),J7) ))Ҁ箎❳%ͅ98oF*mi&d0PŁ:T B,)ײo%ʂ<j^d* Ϭ+^Md8}ŧ}ػtlu=i듈&L0BAž%&_BH~B !͔-΂b?aHT(Ŧ%(!{Us>4`YhFCe2XeHWZq`G=7f){amRrog-ؔiV D]/?" m@UU.>yե>:a bdhj"]3 |o TJ(B"H &U L4ۅ} ԇ/ڂJ$|? :1gcSC6Tfͯ14é᜖ZyTt\D)'K0N@ M[gsѤK}5fP H U2tc}uiꦔ%P0M?Ĺ%[J£m{5\U&h* xıO9) hxC3yTt"|hg z q伟'390!c:1JdW­DJ99ԛH$IBḪInk TBe)>{x9ډS] ꂺ{S5~PgOQB Sq`RJs#Sl9Z30)m !JnR{O*H!DGzGBx}a(168.P'HBؕwoD"ȫOv0X&ҮI-|.=;098?Vp!sh]o| 2q`N%^.O:sF4ٮ9 5S O)4g 0Fiؽ*`O3GS7{;". ]>|M0\0@M3! rQO<%^=у;]l؞zf+Rәއ$epr*G(ȅ@eЃm99N_A$ή QpG9-R_]~;qJBߧh* > L!iy>̍B R*"Sa<%p3PS!8zLzΧ+ލxf$ kNHF ,iW\m(9>ٔJV6㑜(]2')Ѣ`CUU^B8k|I~7UO%3qBqg@ ޱJ0eYtǡB4 럠jSZH =cŀ~];r㫣 欈ShD\}a6-mW!\Mr_aSP[PSÖr1 Ny߬hi%3̋@x>`~(-_,ԝxԉh'b;oYUxH,!LBH\'kpݭըCF.HY =c9 6ZgETУ1LGR8=^pR}mϴg ҆΁I-ի!f߸I|X. I,(9窪'hÖ6x-+}GlWܹ{ Bqhwcͽt}CQV8TXGWsTprtM=f,M^ʲj2LC[R 4GBR)08# SAhDRQici i,d"ZK6'85R<ހ_~z i%[˱4N^EN~b]ݱTFw[K}HFlbN(BH ND0<&@r.Ʈ_b3/\ Dq6y> L-Ĺь O;tb2,?.l/LtvVQ{r~݃vI:OMSiuؑr61^_J0g!$PYC}E`Ϛ69ݜAzQPp#!wΘ]))4&m3#3Zʥ Wӡn)ʋa}o>P VJߜ. AsmeA}~ WoLgҠ M_Q>k1h@BTh(~HG^h?wm) mn2U)34C]Xc UaH,|te$g %ho7ɴ&vQQ_韷@J&cЕf~w\f t K`6,+Tht7V=qO8}uz ~Q/f"9VCnȌœ4y\I0+b߶z4T-@Ы߲!Ҭpmp)ckJ`"Vccz3p!Rar,u{{.0B, Dv}B &cxL?81T^QZjl'B >raTH^&M5Te'T)%>5']l k3`k+X c 1iyH~ Fމ'8֛JFA4 }.%.Lߎw܁ =(v%ɎabھQq 7v^MU :^ )X 7ƢsT$ɨ]x*׊Ii3i)eڥ~F^./fUв,97TUNx>2zoCSxĩr*Uf S85 ۂ^U)Ҧ3]9`Sumɮc rr NDq⍜n #0βKIf!2ԝqvR !)0\y%Bt:70DaX֝u=GT$.~ ?~ ]7>/;G1N͖{tݘFG RJpZ4UHY`"Qs|P4=1C&&znkDcV?:FQ.tp0Ҍ1~c'S}= bEWW _vՓNwdo=T08\+i5`Nkd!pDzyp<te-U>(TAd'yxF2L9_ Eֆι%0EX,L c+RP >]to|ԇ9iջCS'}*qo%1nņp.g)M>vc*{5eFwyk2;SoTtaB%L3ƬSǏ~b*8DU(KGڳ.t3cϦjj`oI5~ḁ"mr ND`Zb (D) )@k1KM˲ UUy2 _|?F$<Үr ]Jo8}9Sq;7VaWKUViB,iBQ4tf5})Fwzc"ee~S !r0_M4ROP盛-o) }4זͨ)L0G"eQ"Kg0:W_W@cLNt^<=xITb]B;sM)B$OÊ.oD7D~0:\*ZJPJ˴){[a*Bi) zTI^7.8#==:?OOMƜK1I!D vG *ZJ Fnvw|oE u#wMsڰ`qF[JE4o}s$cd̽t)`!݉ 3ZBD5M3Μxص4ԌMa|&no[늈%4~]ŵ?qGUn>)e<ݖݩ&Q(w~ݷOـW X'?Sk?SM}t-˲X<)HB1.)68qyRLSozN]*k*& [DUn^x;ޫp# !mz@s^y7]B<(JrxfJZVA J wTAK _ +#C7BJ)_M"}S9mU:!$H)VPJMmOw>[Hk<]c \Sǹ@yPGЧad*KH0Z|RL>0<8v͆ 2  fan,zYx<ޖ ] 1VIBVVUo~_G^ AaAMZ*_$$()ŷ19>R pK).![6) 2/ P(R&'~_XXis?s&7S`t5n W|Rr }_~nprb,@/_32ˡLqF JceJBH4 6ߟG15=ju'7zWG#D|I|<61(\. `)v^',VRJ+%ٳ?YiS0B`нA(V<tD2L9ntK SBAIF )+%-۷?_۴p8ap!`gb'#:>΂sn !Rk-^ c膐AWBBH9cJJY" VԵ;v?&dT M 4Gߛ:k#CL |R|qYKJ!+AJi)!RZN)^o͎/Uo9PH&ԣǥStx}>;D煓x<XM/x"Ig sM|+ `~PN$er$[xs;=lWD&OJ)! Yq{Ѕ~8>tzH3#]3n.s/?K pQ:a9c@ zvݲ75xڂJө$ No g'4uҙX,ʴuL'FR+aWN]c#cV@QJ˄>)}[7?𩆚M3&W-4(L \Nr,tc#1  8熔2gnQ{2[L炰RF)q| \'w;ڲњTb 'aP5GW>^ɱ.<˴% -|w[A L<$@X T(sRov퇪g!,vcV(*T<-£=]=OL pML 7|Zܪ^3n-)|wBf|BŁ!30:rRZ
RJ=5m?Լ`uImWV XCr vǓ :J$ұ3<ғ9vPsn19wV0]+^~eRA螶8/YΘ !+圫@ PںmW]V5=5+U%gݭi.M(e@LǬ̘9=ܝy&y!Fwĉ&k/`PeY[-ˑB5$}C+$!~JiBBEQ_eUME hTkT pi(]dYs66t$ӵߒf2ni+<ڗy\fh4-r!%@גBɸ X-Nm[M=kVC?|(~F/sx+KZ**+ohdTe 9,RJ@ 7r+: `F])#!!H +ؔ53қiڋq:Rq|-&]<깻˕o8_pf5^i&>Byy)>B!QJ5뭨)mkW4lkuSBJ(#PB6L)=B*\Br)%<15ԓ M %T<K; t2\+exBmV |~7 O; f^^BtJ"dB Bi{4_ ih{|A(Sk@iƘHƨB׆RJ$Br'b!kf즑LF*nN&i0 3NRJI7™M3ppg䩞 Sox+ fLsOB|RJ/y4J@%(RR)%u!PƘUJ ]NH #_sFuk)νs {r>nSBݪsܵ`>Puf+X)ʘb=4BB!ޓ佊-2" 4&]߳иkg0sCX[iͅ8|\mӤ.eσ,KQ4nXh^Y쁹c)|jH򂔌IݸWK#h.Ue5(b4@R϶˪_x,!R"A\-v0偘^WB7JXH7[ m@Ζ |(Zu7tWܮ [&Y&6$s2,Z@)8W@9|V|_ vjZ3 1ˤ@6neSoW@"[dQ %EO -_yy/=޽ Tq>e x,}T,9<3y/ޤ{["@Ky6ouC<5_.i!771pIENDB`css/000077500000000000000000000000001315737174100374445ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resourcesdemo.css000066400000000000000000000032551315737174100411070ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/cssbody { font-family: Arial, Helvetica, sans-serif; margin: 0px; } #top { /*background: -moz-linear-gradient(center top , rgb(87, 84, 74), rgb(55, 52, 42)) repeat scroll 0% 0% transparent;*/ background: black; background: linear-gradient( 0deg, #57544A, #37342A 15%); background: -webkit-linear-gradient(top, #57544A, #37342A); -webkit-box-shadow: 0px 0px 8px #888; box-shadow: 0px 0px 8px #888; height: 60px; position: relative; z-index: 2; margin-bottom:50px; } #top #logo { position: absolute; left: 20px; top: 10px; } #top img { width: 80px; height: 80px; margin-top: 5px; } #top h1 { position: absolute; left: 120px; top: 0px; color: white; } #wrap { width: 700px; overflow: auto; padding: 10px; } form { width: 650px; margin: 0 auto; padding:15px; } input, textarea { float: left; width :250px; margin-right:15px; clear: left; } textarea { width:650px; margin:0px; margin-bottom: 15px; border:1px solid black; } input[type=radio]{ clear:left; margin-right:15px; margin-top:10px; width:25px; } input[type=submit]{ width: 150px; float: right; position: relative; margin:0px; margin-top:15px; } label { display: block; padding-bottom:5px; padding-top:10px; clear:both; } label.radio { display:inherit; clear:right; } select { margin-right:150px; position: relative; float:left; } .info{ position:relative; float:right; font-family:monospace; font-size: medium; width: 360px; } #oneline { float:left; width:660px; margin-bottom: 5px; margin-left: 5px; } div#toggle{ visibility: hidden; }lib/000077500000000000000000000000001315737174100374225ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resourcescodemirror/000077500000000000000000000000001315737174100415675ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/libcodemirror.css000066400000000000000000000111401315737174100444430ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror.CodeMirror { line-height: 1em; font-family: monospace; /* Necessary so the scrollbar can be absolutely positioned within the wrapper on Lion. */ position: relative; /* This prevents unwanted scrollbars from showing up on the body and wrapper in IE. */ overflow: hidden; /*customised Highcharts*/ border: 1px solid black; width: 650px; height: auto; line-height: 1em; } .CodeMirror-scroll { overflow: auto; height: 300px; /* This is needed to prevent an IE[67] bug where the scrolled content is visible outside of the scrolling box. */ position: relative; outline: none; } /* Vertical scrollbar */ .CodeMirror-scrollbar { position: absolute; right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; z-index: 5; } .CodeMirror-scrollbar-inner { /* This needs to have a nonzero width in order for the scrollbar to appear in Firefox and IE9. */ width: 1px; } .CodeMirror-scrollbar.cm-sb-overlap { /* Ensure that the scrollbar appears in Lion, and that it overlaps the content rather than sitting to the right of it. */ position: absolute; z-index: 1; float: none; right: 0; min-width: 12px; } .CodeMirror-scrollbar.cm-sb-nonoverlap { min-width: 12px; } .CodeMirror-scrollbar.cm-sb-ie7 { min-width: 18px; } .CodeMirror-gutter { position: absolute; left: 0; top: 0; z-index: 10; background-color: #f7f7f7; border-right: 1px solid #eee; min-width: 2em; height: 100%; } .CodeMirror-gutter-text { color: #aaa; text-align: right; padding: .4em .2em .4em .4em; white-space: pre !important; cursor: default; } .CodeMirror-lines { padding: .4em; white-space: pre; cursor: text; } .CodeMirror pre { -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0; border-width: 0; margin: 0; padding: 0; background: transparent; font-family: inherit; font-size: inherit; padding: 0; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; overflow: visible; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror textarea { outline: none !important; } .CodeMirror pre.CodeMirror-cursor { z-index: 10; position: absolute; visibility: hidden; border-left: 1px solid black; border-right: none; width: 0; } .cm-keymap-fat-cursor pre.CodeMirror-cursor { width: auto; border: 0; background: transparent; background: rgba(0, 200, 0, .4); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800); } /* Kludge to turn off filter in ie9+, which also accepts rgba */ .cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) { filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {} .CodeMirror-focused pre.CodeMirror-cursor { visibility: visible; } div.CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; } .CodeMirror-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* Default theme */ .cm-s-default span.cm-keyword {color: #708;} .cm-s-default span.cm-atom {color: #219;} .cm-s-default span.cm-number {color: #164;} .cm-s-default span.cm-def {color: #00f;} .cm-s-default span.cm-variable {color: black;} .cm-s-default span.cm-variable-2 {color: #05a;} .cm-s-default span.cm-variable-3 {color: #085;} .cm-s-default span.cm-property {color: black;} .cm-s-default span.cm-operator {color: black;} .cm-s-default span.cm-comment {color: #a50;} .cm-s-default span.cm-string {color: #a11;} .cm-s-default span.cm-string-2 {color: #f50;} .cm-s-default span.cm-meta {color: #555;} .cm-s-default span.cm-error {color: #f00;} .cm-s-default span.cm-qualifier {color: #555;} .cm-s-default span.cm-builtin {color: #30a;} .cm-s-default span.cm-bracket {color: #997;} .cm-s-default span.cm-tag {color: #170;} .cm-s-default span.cm-attribute {color: #00c;} .cm-s-default span.cm-header {color: blue;} .cm-s-default span.cm-quote {color: #090;} .cm-s-default span.cm-hr {color: #999;} .cm-s-default span.cm-link {color: #00c;} span.cm-header, span.cm-strong {font-weight: bold;} span.cm-em {font-style: italic;} span.cm-emstrong {font-style: italic; font-weight: bold;} span.cm-link {text-decoration: underline;} span.cm-invalidchar {color: #f00;} div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} @media print { /* Hide the cursor when printing */ .CodeMirror pre.CodeMirror-cursor { visibility: hidden; } } codemirror.js000066400000000000000000003767051315737174100443140ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror// CodeMirror version 2.35 // // All functions that need access to the editor's state live inside // the CodeMirror function. Below that, at the bottom of the file, // some utilities are defined. // CodeMirror is the only global var we claim window.CodeMirror = (function() { "use strict"; // This is the function that produces an editor instance. Its // closure is used to store the editor state. function CodeMirror(place, givenOptions) { // Determine effective options based on given values and defaults. var options = {}, defaults = CodeMirror.defaults; for (var opt in defaults) if (defaults.hasOwnProperty(opt)) options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt]; var input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em"); input.setAttribute("wrap", "off"); input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); // Wraps and hides input textarea var inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); // The empty scrollbar content, used solely for managing the scrollbar thumb. var scrollbarInner = elt("div", null, "CodeMirror-scrollbar-inner"); // The vertical scrollbar. Horizontal scrolling is handled by the scroller itself. var scrollbar = elt("div", [scrollbarInner], "CodeMirror-scrollbar"); // DIVs containing the selection and the actual code var lineDiv = elt("div"), selectionDiv = elt("div", null, null, "position: relative; z-index: -1"); // Blinky cursor, and element used to ensure cursor fits at the end of a line var cursor = elt("pre", "\u00a0", "CodeMirror-cursor"), widthForcer = elt("pre", "\u00a0", "CodeMirror-cursor", "visibility: hidden"); // Used to measure text size var measure = elt("div", null, null, "position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden;"); var lineSpace = elt("div", [measure, cursor, widthForcer, selectionDiv, lineDiv], null, "position: relative; z-index: 0"); var gutterText = elt("div", null, "CodeMirror-gutter-text"), gutter = elt("div", [gutterText], "CodeMirror-gutter"); // Moved around its parent to cover visible view var mover = elt("div", [gutter, elt("div", [lineSpace], "CodeMirror-lines")], null, "position: relative"); // Set to the height of the text, causes scrolling var sizer = elt("div", [mover], null, "position: relative"); // Provides scrolling var scroller = elt("div", [sizer], "CodeMirror-scroll"); scroller.setAttribute("tabIndex", "-1"); // The element in which the editor lives. var wrapper = elt("div", [inputDiv, scrollbar, scroller], "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "")); if (place.appendChild) place.appendChild(wrapper); else place(wrapper); themeChanged(); keyMapChanged(); // Needed to hide big blue blinking cursor on Mobile Safari if (ios) input.style.width = "0px"; if (!webkit) scroller.draggable = true; lineSpace.style.outline = "none"; if (options.tabindex != null) input.tabIndex = options.tabindex; if (options.autofocus) focusInput(); if (!options.gutter && !options.lineNumbers) gutter.style.display = "none"; // Needed to handle Tab key in KHTML if (khtml) inputDiv.style.height = "1px", inputDiv.style.position = "absolute"; // Check for OS X >= 10.7. This has transparent scrollbars, so the // overlaying of one scrollbar with another won't work. This is a // temporary hack to simply turn off the overlay scrollbar. See // issue #727. if (mac_geLion) { scrollbar.style.zIndex = -2; scrollbar.style.visibility = "hidden"; } // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). else if (ie_lt8) scrollbar.style.minWidth = "18px"; // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval. var poll = new Delayed(), highlight = new Delayed(), blinker; // mode holds a mode API object. doc is the tree of Line objects, // frontier is the point up to which the content has been parsed, // and history the undo history (instance of History constructor). var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), frontier = 0, focused; loadMode(); // The selection. These are always maintained to point at valid // positions. Inverted is used to remember that the user is // selecting bottom-to-top. var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false}; // Selection-related flags. shiftSelecting obviously tracks // whether the user is holding shift. var shiftSelecting, lastClick, lastDoubleClick, lastScrollTop = 0, draggingText, overwrite = false, suppressEdits = false, pasteIncoming = false; // Variables used by startOperation/endOperation to track what // happened during the operation. var updateInput, userSelChange, changes, textChanged, selectionChanged, gutterDirty, callbacks; // Current visible range (may be bigger than the view window). var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0; // bracketHighlighted is used to remember that a bracket has been // marked. var bracketHighlighted; // Tracks the maximum line length so that the horizontal scrollbar // can be kept static when scrolling. var maxLine = getLine(0), updateMaxLine = false, maxLineChanged = true; var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll var goalColumn = null; // Initialize the content. operation(function(){setValue(options.value || ""); updateInput = false;})(); var history = new History(); // Register our event handlers. connect(scroller, "mousedown", operation(onMouseDown)); connect(scroller, "dblclick", operation(onDoubleClick)); connect(lineSpace, "selectstart", e_preventDefault); // Gecko browsers fire contextmenu *after* opening the menu, at // which point we can't mess with it anymore. Context menu is // handled in onMouseDown for Gecko. if (!gecko) connect(scroller, "contextmenu", onContextMenu); connect(scroller, "scroll", onScrollMain); connect(scrollbar, "scroll", onScrollBar); connect(scrollbar, "mousedown", function() {if (focused) setTimeout(focusInput, 0);}); var resizeHandler = connect(window, "resize", function() { if (wrapper.parentNode) updateDisplay(true); else resizeHandler(); }, true); connect(input, "keyup", operation(onKeyUp)); connect(input, "input", fastPoll); connect(input, "keydown", operation(onKeyDown)); connect(input, "keypress", operation(onKeyPress)); connect(input, "focus", onFocus); connect(input, "blur", onBlur); function drag_(e) { if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return; e_stop(e); } if (options.dragDrop) { connect(scroller, "dragstart", onDragStart); connect(scroller, "dragenter", drag_); connect(scroller, "dragover", drag_); connect(scroller, "drop", operation(onDrop)); } connect(scroller, "paste", function(){focusInput(); fastPoll();}); connect(input, "paste", function(){pasteIncoming = true; fastPoll();}); connect(input, "cut", operation(function(){ if (!options.readOnly) replaceSelection(""); })); // Needed to handle Tab key in KHTML if (khtml) connect(sizer, "mouseup", function() { if (document.activeElement == input) input.blur(); focusInput(); }); // IE throws unspecified error in certain cases, when // trying to access activeElement before onload var hasFocus; try { hasFocus = (document.activeElement == input); } catch(e) { } if (hasFocus || options.autofocus) setTimeout(onFocus, 20); else onBlur(); function isLine(l) {return l >= 0 && l < doc.size;} // The instance object that we'll return. Mostly calls out to // local functions in the CodeMirror function. Some do some extra // range checking and/or clipping. operation is used to wrap the // call so that changes it makes are tracked, and the display is // updated afterwards. var instance = wrapper.CodeMirror = { getValue: getValue, setValue: operation(setValue), getSelection: getSelection, replaceSelection: operation(replaceSelection), focus: function(){window.focus(); focusInput(); onFocus(); fastPoll();}, setOption: function(option, value) { var oldVal = options[option]; options[option] = value; if (option == "mode" || option == "indentUnit") loadMode(); else if (option == "readOnly" && value == "nocursor") {onBlur(); input.blur();} else if (option == "readOnly" && !value) {resetInput(true);} else if (option == "theme") themeChanged(); else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)(); else if (option == "tabSize") updateDisplay(true); else if (option == "keyMap") keyMapChanged(); else if (option == "tabindex") input.tabIndex = value; if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme" || option == "lineNumberFormatter") { gutterChanged(); updateDisplay(true); } }, getOption: function(option) {return options[option];}, getMode: function() {return mode;}, undo: operation(undo), redo: operation(redo), indentLine: operation(function(n, dir) { if (typeof dir != "string") { if (dir == null) dir = options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } if (isLine(n)) indentLine(n, dir); }), indentSelection: operation(indentSelected), historySize: function() {return {undo: history.done.length, redo: history.undone.length};}, clearHistory: function() {history = new History();}, setHistory: function(histData) { history = new History(); history.done = histData.done; history.undone = histData.undone; }, getHistory: function() { function cp(arr) { for (var i = 0, nw = [], nwelt; i < arr.length; ++i) { nw.push(nwelt = []); for (var j = 0, elt = arr[i]; j < elt.length; ++j) { var old = [], cur = elt[j]; nwelt.push({start: cur.start, added: cur.added, old: old}); for (var k = 0; k < cur.old.length; ++k) old.push(hlText(cur.old[k])); } } return nw; } return {done: cp(history.done), undone: cp(history.undone)}; }, matchBrackets: operation(function(){matchBrackets(true);}), getTokenAt: operation(function(pos) { pos = clipPos(pos); return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), options.tabSize, pos.ch); }), getStateAfter: function(line) { line = clipLine(line == null ? doc.size - 1: line); return getStateBefore(line + 1); }, cursorCoords: function(start, mode) { if (start == null) start = sel.inverted; return this.charCoords(start ? sel.from : sel.to, mode); }, charCoords: function(pos, mode) { pos = clipPos(pos); if (mode == "local") return localCoords(pos, false); if (mode == "div") return localCoords(pos, true); return pageCoords(pos); }, coordsChar: function(coords) { var off = eltOffset(lineSpace); return coordsChar(coords.x - off.left, coords.y - off.top); }, markText: operation(markText), setBookmark: setBookmark, findMarksAt: findMarksAt, setMarker: operation(addGutterMarker), clearMarker: operation(removeGutterMarker), setLineClass: operation(setLineClass), hideLine: operation(function(h) {return setLineHidden(h, true);}), showLine: operation(function(h) {return setLineHidden(h, false);}), onDeleteLine: function(line, f) { if (typeof line == "number") { if (!isLine(line)) return null; line = getLine(line); } (line.handlers || (line.handlers = [])).push(f); return line; }, lineInfo: lineInfo, getViewport: function() { return {from: showingFrom, to: showingTo};}, addWidget: function(pos, node, scroll, vert, horiz) { pos = localCoords(clipPos(pos)); var top = pos.yBot, left = pos.x; node.style.position = "absolute"; sizer.appendChild(node); if (vert == "over") top = pos.y; else if (vert == "near") { var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()), hspace = Math.max(sizer.clientWidth, lineSpace.clientWidth) - paddingLeft(); if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight) top = pos.y - node.offsetHeight; if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } node.style.top = (top + paddingTop()) + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = sizer.clientWidth - node.offsetWidth; node.style.right = "0px"; } else { if (horiz == "left") left = 0; else if (horiz == "middle") left = (sizer.clientWidth - node.offsetWidth) / 2; node.style.left = (left + paddingLeft()) + "px"; } if (scroll) scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight); }, lineCount: function() {return doc.size;}, clipPos: clipPos, getCursor: function(start) { if (start == null) start = sel.inverted; return copyPos(start ? sel.from : sel.to); }, somethingSelected: function() {return !posEq(sel.from, sel.to);}, setCursor: operation(function(line, ch, user) { if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user); else setCursor(line, ch, user); }), setSelection: operation(function(from, to, user) { (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from)); }), getLine: function(line) {if (isLine(line)) return getLine(line).text;}, getLineHandle: function(line) {if (isLine(line)) return getLine(line);}, setLine: operation(function(line, text) { if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length}); }), removeLine: operation(function(line) { if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0})); }), replaceRange: operation(replaceRange), getRange: function(from, to, lineSep) {return getRange(clipPos(from), clipPos(to), lineSep);}, triggerOnKeyDown: operation(onKeyDown), execCommand: function(cmd) {return commands[cmd](instance);}, // Stuff used by commands, probably not much use to outside code. moveH: operation(moveH), deleteH: operation(deleteH), moveV: operation(moveV), toggleOverwrite: function() { if(overwrite){ overwrite = false; cursor.className = cursor.className.replace(" CodeMirror-overwrite", ""); } else { overwrite = true; cursor.className += " CodeMirror-overwrite"; } }, posFromIndex: function(off) { var lineNo = 0, ch; doc.iter(0, doc.size, function(line) { var sz = line.text.length + 1; if (sz > off) { ch = off; return true; } off -= sz; ++lineNo; }); return clipPos({line: lineNo, ch: ch}); }, indexFromPos: function (coords) { if (coords.line < 0 || coords.ch < 0) return 0; var index = coords.ch; doc.iter(0, coords.line, function (line) { index += line.text.length + 1; }); return index; }, scrollTo: function(x, y) { if (x != null) scroller.scrollLeft = x; if (y != null) scrollbar.scrollTop = scroller.scrollTop = y; updateDisplay([]); }, getScrollInfo: function() { return {x: scroller.scrollLeft, y: scrollbar.scrollTop, height: scrollbar.scrollHeight, width: scroller.scrollWidth}; }, setSize: function(width, height) { function interpret(val) { val = String(val); return /^\d+$/.test(val) ? val + "px" : val; } if (width != null) wrapper.style.width = interpret(width); if (height != null) scroller.style.height = interpret(height); instance.refresh(); }, operation: function(f){return operation(f)();}, compoundChange: function(f){return compoundChange(f);}, refresh: function(){ updateDisplay(true, null, lastScrollTop); if (scrollbar.scrollHeight > lastScrollTop) scrollbar.scrollTop = lastScrollTop; }, getInputField: function(){return input;}, getWrapperElement: function(){return wrapper;}, getScrollerElement: function(){return scroller;}, getGutterElement: function(){return gutter;} }; function getLine(n) { return getLineAt(doc, n); } function updateLineHeight(line, height) { gutterDirty = true; var diff = height - line.height; for (var n = line; n; n = n.parent) n.height += diff; } function lineContent(line, wrapAt) { if (!line.styles) line.highlight(mode, line.stateAfter = getStateBefore(lineNo(line)), options.tabSize); return line.getContent(options.tabSize, wrapAt, options.lineWrapping); } function setValue(code) { var top = {line: 0, ch: 0}; updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length}, splitLines(code), top, top); updateInput = true; } function getValue(lineSep) { var text = []; doc.iter(0, doc.size, function(line) { text.push(line.text); }); return text.join(lineSep || "\n"); } function onScrollBar(e) { if (scrollbar.scrollTop != lastScrollTop) { lastScrollTop = scroller.scrollTop = scrollbar.scrollTop; updateDisplay([]); } } function onScrollMain(e) { if (options.fixedGutter && gutter.style.left != scroller.scrollLeft + "px") gutter.style.left = scroller.scrollLeft + "px"; if (scroller.scrollTop != lastScrollTop) { lastScrollTop = scroller.scrollTop; if (scrollbar.scrollTop != lastScrollTop) scrollbar.scrollTop = lastScrollTop; updateDisplay([]); } if (options.onScroll) options.onScroll(instance); } function onMouseDown(e) { setShift(e_prop(e, "shiftKey")); // Check whether this is a click in a widget for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == sizer && n != mover) return; // See if this is a click in the gutter for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == gutterText) { if (options.onGutterClick) options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e); return e_preventDefault(e); } var start = posFromMouse(e); switch (e_button(e)) { case 3: if (gecko) onContextMenu(e); return; case 2: if (start) setCursor(start.line, start.ch, true); setTimeout(focusInput, 20); e_preventDefault(e); return; } // For button 1, if it was clicked inside the editor // (posFromMouse returning non-null), we have to adjust the // selection. if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;} if (!focused) onFocus(); var now = +new Date, type = "single"; if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { type = "triple"; e_preventDefault(e); setTimeout(focusInput, 20); selectLine(start.line); } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { type = "double"; lastDoubleClick = {time: now, pos: start}; e_preventDefault(e); var word = findWordAt(start); setSelectionUser(word.from, word.to); } else { lastClick = {time: now, pos: start}; } function dragEnd(e2) { if (webkit) scroller.draggable = false; draggingText = false; up(); drop(); if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { e_preventDefault(e2); setCursor(start.line, start.ch, true); focusInput(); } } var last = start, going; if (options.dragDrop && dragAndDrop && !options.readOnly && !posEq(sel.from, sel.to) && !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { // Let the drag handler handle this. if (webkit) scroller.draggable = true; var up = connect(document, "mouseup", operation(dragEnd), true); var drop = connect(scroller, "drop", operation(dragEnd), true); draggingText = true; // IE's approach to draggable if (scroller.dragDrop) scroller.dragDrop(); return; } e_preventDefault(e); if (type == "single") setCursor(start.line, start.ch, true); var startstart = sel.from, startend = sel.to; function doSelect(cur) { if (type == "single") { setSelectionUser(start, cur); } else if (type == "double") { var word = findWordAt(cur); if (posLess(cur, startstart)) setSelectionUser(word.from, startend); else setSelectionUser(startstart, word.to); } else if (type == "triple") { if (posLess(cur, startstart)) setSelectionUser(startend, clipPos({line: cur.line, ch: 0})); else setSelectionUser(startstart, clipPos({line: cur.line + 1, ch: 0})); } } function extend(e) { var cur = posFromMouse(e, true); if (cur && !posEq(cur, last)) { if (!focused) onFocus(); last = cur; doSelect(cur); updateInput = false; var visible = visibleLines(); if (cur.line >= visible.to || cur.line < visible.from) going = setTimeout(operation(function(){extend(e);}), 150); } } function done(e) { clearTimeout(going); var cur = posFromMouse(e); if (cur) doSelect(cur); e_preventDefault(e); focusInput(); updateInput = true; move(); up(); } var move = connect(document, "mousemove", operation(function(e) { clearTimeout(going); e_preventDefault(e); if (!ie && !e_button(e)) done(e); else extend(e); }), true); var up = connect(document, "mouseup", operation(done), true); } function onDoubleClick(e) { for (var n = e_target(e); n != wrapper; n = n.parentNode) if (n.parentNode == gutterText) return e_preventDefault(e); e_preventDefault(e); } function onDrop(e) { if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return; e_preventDefault(e); var pos = posFromMouse(e, true), files = e.dataTransfer.files; if (!pos || options.readOnly) return; if (files && files.length && window.FileReader && window.File) { var n = files.length, text = Array(n), read = 0; var loadFile = function(file, i) { var reader = new FileReader; reader.onload = function() { text[i] = reader.result; if (++read == n) { pos = clipPos(pos); operation(function() { var end = replaceRange(text.join(""), pos, pos); setSelectionUser(pos, end); })(); } }; reader.readAsText(file); }; for (var i = 0; i < n; ++i) loadFile(files[i], i); } else { // Don't do a replace if the drop happened inside of the selected text. if (draggingText && !(posLess(pos, sel.from) || posLess(sel.to, pos))) return; try { var text = e.dataTransfer.getData("Text"); if (text) { compoundChange(function() { var curFrom = sel.from, curTo = sel.to; setSelectionUser(pos, pos); if (draggingText) replaceRange("", curFrom, curTo); replaceSelection(text); focusInput(); }); } } catch(e){} } } function onDragStart(e) { var txt = getSelection(); e.dataTransfer.setData("Text", txt); // Use dummy image instead of default browsers image. if (e.dataTransfer.setDragImage) e.dataTransfer.setDragImage(elt('img'), 0, 0); } function doHandleBinding(bound, dropShift) { if (typeof bound == "string") { bound = commands[bound]; if (!bound) return false; } var prevShift = shiftSelecting; try { if (options.readOnly) suppressEdits = true; if (dropShift) shiftSelecting = null; bound(instance); } catch(e) { if (e != Pass) throw e; return false; } finally { shiftSelecting = prevShift; suppressEdits = false; } return true; } var maybeTransition; function handleKeyBinding(e) { // Handle auto keymap transitions var startMap = getKeyMap(options.keyMap), next = startMap.auto; clearTimeout(maybeTransition); if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { if (getKeyMap(options.keyMap) == startMap) { options.keyMap = (next.call ? next.call(null, instance) : next); } }, 50); var name = keyNames[e_prop(e, "keyCode")], handled = false; var flipCtrlCmd = opera && mac; if (name == null || e.altGraphKey) return false; if (e_prop(e, "altKey")) name = "Alt-" + name; if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name; if (e_prop(e, flipCtrlCmd ? "ctrlKey" : "metaKey")) name = "Cmd-" + name; var stopped = false; function stop() { stopped = true; } if (e_prop(e, "shiftKey")) { handled = lookupKey("Shift-" + name, options.extraKeys, options.keyMap, function(b) {return doHandleBinding(b, true);}, stop) || lookupKey(name, options.extraKeys, options.keyMap, function(b) { if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(b); }, stop); } else { handled = lookupKey(name, options.extraKeys, options.keyMap, doHandleBinding, stop); } if (stopped) handled = false; if (handled) { e_preventDefault(e); restartBlink(); if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } } return handled; } function handleCharBinding(e, ch) { var handled = lookupKey("'" + ch + "'", options.extraKeys, options.keyMap, function(b) { return doHandleBinding(b, true); }); if (handled) { e_preventDefault(e); restartBlink(); } return handled; } var lastStoppedKey = null; function onKeyDown(e) { if (!focused) onFocus(); if (ie && e.keyCode == 27) { e.returnValue = false; } if (pollingFast) { if (readInput()) pollingFast = false; } if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; var code = e_prop(e, "keyCode"); // IE does strange things with escape. setShift(code == 16 || e_prop(e, "shiftKey")); // First give onKeyEvent option a chance to handle this. var handled = handleKeyBinding(e); if (opera) { lastStoppedKey = handled ? code : null; // Opera has no cut event... we try to at least catch the key combo if (!handled && code == 88 && e_prop(e, mac ? "metaKey" : "ctrlKey")) replaceSelection(""); } } function onKeyPress(e) { if (pollingFast) readInput(); if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode"); if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(e)) return; var ch = String.fromCharCode(charCode == null ? keyCode : charCode); if (options.electricChars && mode.electricChars && options.smartIndent && !options.readOnly) { if (mode.electricChars.indexOf(ch) > -1) setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75); } if (handleCharBinding(e, ch)) return; fastPoll(); } function onKeyUp(e) { if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return; if (e_prop(e, "keyCode") == 16) shiftSelecting = null; } function onFocus() { if (options.readOnly == "nocursor") return; if (!focused) { if (options.onFocus) options.onFocus(instance); focused = true; if (scroller.className.search(/\bCodeMirror-focused\b/) == -1) scroller.className += " CodeMirror-focused"; } slowPoll(); restartBlink(); } function onBlur() { if (focused) { if (options.onBlur) options.onBlur(instance); focused = false; if (bracketHighlighted) operation(function(){ if (bracketHighlighted) { bracketHighlighted(); bracketHighlighted = null; } })(); scroller.className = scroller.className.replace(" CodeMirror-focused", ""); } clearInterval(blinker); setTimeout(function() {if (!focused) shiftSelecting = null;}, 150); } // Replace the range from from to to by the strings in newText. // Afterwards, set the selection to selFrom, selTo. function updateLines(from, to, newText, selFrom, selTo) { if (suppressEdits) return; var old = []; doc.iter(from.line, to.line + 1, function(line) { old.push(newHL(line.text, line.markedSpans)); }); if (history) { history.addChange(from.line, newText.length, old); while (history.done.length > options.undoDepth) history.done.shift(); } var lines = updateMarkedSpans(hlSpans(old[0]), hlSpans(lst(old)), from.ch, to.ch, newText); updateLinesNoUndo(from, to, lines, selFrom, selTo); } function unredoHelper(from, to) { if (!from.length) return; var set = from.pop(), out = []; for (var i = set.length - 1; i >= 0; i -= 1) { var change = set[i]; var replaced = [], end = change.start + change.added; doc.iter(change.start, end, function(line) { replaced.push(newHL(line.text, line.markedSpans)); }); out.push({start: change.start, added: change.old.length, old: replaced}); var pos = {line: change.start + change.old.length - 1, ch: editEnd(hlText(lst(replaced)), hlText(lst(change.old)))}; updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos); } updateInput = true; to.push(out); } function undo() {unredoHelper(history.done, history.undone);} function redo() {unredoHelper(history.undone, history.done);} function updateLinesNoUndo(from, to, lines, selFrom, selTo) { if (suppressEdits) return; var recomputeMaxLength = false, maxLineLength = maxLine.text.length; if (!options.lineWrapping) doc.iter(from.line, to.line + 1, function(line) { if (!line.hidden && line.text.length == maxLineLength) {recomputeMaxLength = true; return true;} }); if (from.line != to.line || lines.length > 1) gutterDirty = true; var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line); var lastHL = lst(lines); // First adjust the line structure if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == "") { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. var added = [], prevLine = null; for (var i = 0, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); lastLine.update(lastLine.text, hlSpans(lastHL)); if (nlines) doc.remove(from.line, nlines, callbacks); if (added.length) doc.insert(from.line, added); } else if (firstLine == lastLine) { if (lines.length == 1) { firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + firstLine.text.slice(to.ch), hlSpans(lines[0])); } else { for (var added = [], i = 1, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); added.push(new Line(hlText(lastHL) + firstLine.text.slice(to.ch), hlSpans(lastHL))); firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); doc.insert(from.line + 1, added); } } else if (lines.length == 1) { firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + lastLine.text.slice(to.ch), hlSpans(lines[0])); doc.remove(from.line + 1, nlines, callbacks); } else { var added = []; firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); lastLine.update(hlText(lastHL) + lastLine.text.slice(to.ch), hlSpans(lastHL)); for (var i = 1, e = lines.length - 1; i < e; ++i) added.push(new Line(hlText(lines[i]), hlSpans(lines[i]))); if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks); doc.insert(from.line + 1, added); } if (options.lineWrapping) { var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3); doc.iter(from.line, from.line + lines.length, function(line) { if (line.hidden) return; var guess = Math.ceil(line.text.length / perLine) || 1; if (guess != line.height) updateLineHeight(line, guess); }); } else { doc.iter(from.line, from.line + lines.length, function(line) { var l = line.text; if (!line.hidden && l.length > maxLineLength) { maxLine = line; maxLineLength = l.length; maxLineChanged = true; recomputeMaxLength = false; } }); if (recomputeMaxLength) updateMaxLine = true; } // Adjust frontier, schedule worker frontier = Math.min(frontier, from.line); startWorker(400); var lendiff = lines.length - nlines - 1; // Remember that these lines changed, for updating the display changes.push({from: from.line, to: to.line + 1, diff: lendiff}); if (options.onChange) { // Normalize lines to contain only strings, since that's what // the change event handler expects for (var i = 0; i < lines.length; ++i) if (typeof lines[i] != "string") lines[i] = lines[i].text; var changeObj = {from: from, to: to, text: lines}; if (textChanged) { for (var cur = textChanged; cur.next; cur = cur.next) {} cur.next = changeObj; } else textChanged = changeObj; } // Update the selection function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;} setSelection(clipPos(selFrom), clipPos(selTo), updateLine(sel.from.line), updateLine(sel.to.line)); } function needsScrollbar() { var realHeight = doc.height * textHeight() + 2 * paddingTop(); return realHeight * .99 > scroller.offsetHeight ? realHeight : false; } function updateVerticalScroll(scrollTop) { var scrollHeight = needsScrollbar(); scrollbar.style.display = scrollHeight ? "block" : "none"; if (scrollHeight) { scrollbarInner.style.height = sizer.style.minHeight = scrollHeight + "px"; scrollbar.style.height = scroller.clientHeight + "px"; if (scrollTop != null) { scrollbar.scrollTop = scroller.scrollTop = scrollTop; // 'Nudge' the scrollbar to work around a Webkit bug where, // in some situations, we'd end up with a scrollbar that // reported its scrollTop (and looked) as expected, but // *behaved* as if it was still in a previous state (i.e. // couldn't scroll up, even though it appeared to be at the // bottom). if (webkit) setTimeout(function() { if (scrollbar.scrollTop != scrollTop) return; scrollbar.scrollTop = scrollTop + (scrollTop ? -1 : 1); scrollbar.scrollTop = scrollTop; }, 0); } } else { sizer.style.minHeight = ""; } // Position the mover div to align with the current virtual scroll position mover.style.top = displayOffset * textHeight() + "px"; } function computeMaxLength() { maxLine = getLine(0); maxLineChanged = true; var maxLineLength = maxLine.text.length; doc.iter(1, doc.size, function(line) { var l = line.text; if (!line.hidden && l.length > maxLineLength) { maxLineLength = l.length; maxLine = line; } }); updateMaxLine = false; } function replaceRange(code, from, to) { from = clipPos(from); if (!to) to = from; else to = clipPos(to); code = splitLines(code); function adjustPos(pos) { if (posLess(pos, from)) return pos; if (!posLess(to, pos)) return end; var line = pos.line + code.length - (to.line - from.line) - 1; var ch = pos.ch; if (pos.line == to.line) ch += lst(code).length - (to.ch - (to.line == from.line ? from.ch : 0)); return {line: line, ch: ch}; } var end; replaceRange1(code, from, to, function(end1) { end = end1; return {from: adjustPos(sel.from), to: adjustPos(sel.to)}; }); return end; } function replaceSelection(code, collapse) { replaceRange1(splitLines(code), sel.from, sel.to, function(end) { if (collapse == "end") return {from: end, to: end}; else if (collapse == "start") return {from: sel.from, to: sel.from}; else return {from: sel.from, to: end}; }); } function replaceRange1(code, from, to, computeSel) { var endch = code.length == 1 ? code[0].length + from.ch : lst(code).length; var newSel = computeSel({line: from.line + code.length - 1, ch: endch}); updateLines(from, to, code, newSel.from, newSel.to); } function getRange(from, to, lineSep) { var l1 = from.line, l2 = to.line; if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch); var code = [getLine(l1).text.slice(from.ch)]; doc.iter(l1 + 1, l2, function(line) { code.push(line.text); }); code.push(getLine(l2).text.slice(0, to.ch)); return code.join(lineSep || "\n"); } function getSelection(lineSep) { return getRange(sel.from, sel.to, lineSep); } function slowPoll() { if (pollingFast) return; poll.set(options.pollInterval, function() { readInput(); if (focused) slowPoll(); }); } function fastPoll() { var missed = false; pollingFast = true; function p() { var changed = readInput(); if (!changed && !missed) {missed = true; poll.set(60, p);} else {pollingFast = false; slowPoll();} } poll.set(20, p); } // Previnput is a hack to work with IME. If we reset the textarea // on every change, that breaks IME. So we look for changes // compared to the previous content instead. (Modern browsers have // events that indicate IME taking place, but these are not widely // supported or compatible enough yet to rely on.) var prevInput = ""; function readInput() { if (!focused || hasSelection(input) || options.readOnly) return false; var text = input.value; if (text == prevInput) return false; if (!nestedOperation) startOperation(); shiftSelecting = null; var same = 0, l = Math.min(prevInput.length, text.length); while (same < l && prevInput[same] == text[same]) ++same; if (same < prevInput.length) sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)}; else if (overwrite && posEq(sel.from, sel.to) && !pasteIncoming) sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))}; replaceSelection(text.slice(same), "end"); if (text.length > 1000) { input.value = prevInput = ""; } else prevInput = text; if (!nestedOperation) endOperation(); pasteIncoming = false; return true; } function resetInput(user) { if (!posEq(sel.from, sel.to)) { prevInput = ""; input.value = getSelection(); if (focused) selectInput(input); } else if (user) prevInput = input.value = ""; } function focusInput() { if (options.readOnly != "nocursor") input.focus(); } function scrollCursorIntoView() { var coords = calculateCursorCoords(); scrollIntoView(coords.x, coords.y, coords.x, coords.yBot); if (!focused) return; var box = sizer.getBoundingClientRect(), doScroll = null; if (coords.y + box.top < 0) doScroll = true; else if (coords.y + box.top + textHeight() > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null) { var hidden = cursor.style.display == "none"; if (hidden) { cursor.style.display = ""; cursor.style.left = coords.x + "px"; cursor.style.top = (coords.y - displayOffset) + "px"; } cursor.scrollIntoView(doScroll); if (hidden) cursor.style.display = "none"; } } function calculateCursorCoords() { var cursor = localCoords(sel.inverted ? sel.from : sel.to); var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x; return {x: x, y: cursor.y, yBot: cursor.yBot}; } function scrollIntoView(x1, y1, x2, y2) { var scrollPos = calculateScrollPos(x1, y1, x2, y2); if (scrollPos.scrollLeft != null) {scroller.scrollLeft = scrollPos.scrollLeft;} if (scrollPos.scrollTop != null) {scrollbar.scrollTop = scroller.scrollTop = scrollPos.scrollTop;} } function calculateScrollPos(x1, y1, x2, y2) { var pl = paddingLeft(), pt = paddingTop(); y1 += pt; y2 += pt; x1 += pl; x2 += pl; var screen = scroller.clientHeight, screentop = scrollbar.scrollTop, result = {}; var docBottom = needsScrollbar() || Infinity; var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft; var gutterw = options.fixedGutter ? gutter.clientWidth : 0; var atLeft = x1 < gutterw + pl + 10; if (x1 < screenleft + gutterw || atLeft) { if (atLeft) x1 = 0; result.scrollLeft = Math.max(0, x1 - 10 - gutterw); } else if (x2 > screenw + screenleft - 3) { result.scrollLeft = x2 + 10 - screenw; } return result; } function visibleLines(scrollTop) { var lh = textHeight(), top = (scrollTop != null ? scrollTop : scrollbar.scrollTop) - paddingTop(); var fromHeight = Math.max(0, Math.floor(top / lh)); var toHeight = Math.ceil((top + scroller.clientHeight) / lh); return {from: lineAtHeight(doc, fromHeight), to: lineAtHeight(doc, toHeight)}; } // Uses a set of changes plus the current scroll position to // determine which DOM updates have to be made, and makes the // updates. function updateDisplay(changes, suppressCallback, scrollTop) { if (!scroller.clientWidth) { showingFrom = showingTo = displayOffset = 0; return; } // Compute the new visible window // If scrollTop is specified, use that to determine which lines // to render instead of the current scrollbar position. var visible = visibleLines(scrollTop); // Bail out if the visible area is already rendered and nothing changed. if (changes !== true && changes.length == 0 && visible.from > showingFrom && visible.to < showingTo) { updateVerticalScroll(scrollTop); return; } var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100); if (showingFrom < from && from - showingFrom < 20) from = showingFrom; if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo); // Create a range of theoretically intact lines, and punch holes // in that using the change info. var intact = changes === true ? [] : computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes); // Clip off the parts that won't be visible var intactLines = 0; for (var i = 0; i < intact.length; ++i) { var range = intact[i]; if (range.from < from) {range.domStart += (from - range.from); range.from = from;} if (range.to > to) range.to = to; if (range.from >= range.to) intact.splice(i--, 1); else intactLines += range.to - range.from; } if (intactLines == to - from && from == showingFrom && to == showingTo) { updateVerticalScroll(scrollTop); return; } intact.sort(function(a, b) {return a.domStart - b.domStart;}); var th = textHeight(), gutterDisplay = gutter.style.display; lineDiv.style.display = "none"; patchDisplay(from, to, intact); lineDiv.style.display = gutter.style.display = ""; var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th; // This is just a bogus formula that detects when the editor is // resized or the font size changes. if (different) lastSizeC = scroller.clientHeight + th; if (from != showingFrom || to != showingTo && options.onViewportChange) setTimeout(function(){ if (options.onViewportChange) options.onViewportChange(instance, from, to); }); showingFrom = from; showingTo = to; displayOffset = heightAtLine(doc, from); startWorker(100); // Since this is all rather error prone, it is honoured with the // only assertion in the whole file. if (lineDiv.childNodes.length != showingTo - showingFrom) throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) + " nodes=" + lineDiv.childNodes.length); function checkHeights() { var curNode = lineDiv.firstChild, heightChanged = false; doc.iter(showingFrom, showingTo, function(line) { // Work around bizarro IE7 bug where, sometimes, our curNode // is magically replaced with a new node in the DOM, leaving // us with a reference to an orphan (nextSibling-less) node. if (!curNode) return; if (!line.hidden) { var height = Math.round(curNode.offsetHeight / th) || 1; if (line.height != height) { updateLineHeight(line, height); gutterDirty = heightChanged = true; } } curNode = curNode.nextSibling; }); return heightChanged; } if (options.lineWrapping) checkHeights(); gutter.style.display = gutterDisplay; if (different || gutterDirty) { // If the gutter grew in size, re-check heights. If those changed, re-draw gutter. updateGutter() && options.lineWrapping && checkHeights() && updateGutter(); } updateVerticalScroll(scrollTop); updateSelection(); if (!suppressCallback && options.onUpdate) options.onUpdate(instance); return true; } function computeIntact(intact, changes) { for (var i = 0, l = changes.length || 0; i < l; ++i) { var change = changes[i], intact2 = [], diff = change.diff || 0; for (var j = 0, l2 = intact.length; j < l2; ++j) { var range = intact[j]; if (change.to <= range.from && change.diff) intact2.push({from: range.from + diff, to: range.to + diff, domStart: range.domStart}); else if (change.to <= range.from || change.from >= range.to) intact2.push(range); else { if (change.from > range.from) intact2.push({from: range.from, to: change.from, domStart: range.domStart}); if (change.to < range.to) intact2.push({from: change.to + diff, to: range.to + diff, domStart: range.domStart + (change.to - range.from)}); } } intact = intact2; } return intact; } function patchDisplay(from, to, intact) { function killNode(node) { var tmp = node.nextSibling; node.parentNode.removeChild(node); return tmp; } // The first pass removes the DOM nodes that aren't intact. if (!intact.length) removeChildren(lineDiv); else { var domPos = 0, curNode = lineDiv.firstChild, n; for (var i = 0; i < intact.length; ++i) { var cur = intact[i]; while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;} for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;} } while (curNode) curNode = killNode(curNode); } // This pass fills in the lines that actually changed. var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from; doc.iter(from, to, function(line) { if (nextIntact && nextIntact.to == j) nextIntact = intact.shift(); if (!nextIntact || nextIntact.from > j) { if (line.hidden) var lineElement = elt("pre"); else { var lineElement = lineContent(line); if (line.className) lineElement.className = line.className; // Kludge to make sure the styled element lies behind the selection (by z-index) if (line.bgClassName) { var pre = elt("pre", "\u00a0", line.bgClassName, "position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2"); lineElement = elt("div", [pre, lineElement], null, "position: relative"); } } lineDiv.insertBefore(lineElement, curNode); } else { curNode = curNode.nextSibling; } ++j; }); } function updateGutter() { if (!options.gutter && !options.lineNumbers) return; var hText = mover.offsetHeight, hEditor = scroller.clientHeight; gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px"; var fragment = document.createDocumentFragment(), i = showingFrom, normalNode; doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) { if (line.hidden) { fragment.appendChild(elt("pre")); } else { var marker = line.gutterMarker; var text = options.lineNumbers ? options.lineNumberFormatter(i + options.firstLineNumber) : null; if (marker && marker.text) text = marker.text.replace("%N%", text != null ? text : ""); else if (text == null) text = "\u00a0"; var markerElement = fragment.appendChild(elt("pre", null, marker && marker.style)); markerElement.innerHTML = text; for (var j = 1; j < line.height; ++j) { markerElement.appendChild(elt("br")); markerElement.appendChild(document.createTextNode("\u00a0")); } if (!marker) normalNode = i; } ++i; }); gutter.style.display = "none"; removeChildrenAndAdd(gutterText, fragment); // Make sure scrolling doesn't cause number gutter size to pop if (normalNode != null && options.lineNumbers) { var node = gutterText.childNodes[normalNode - showingFrom]; var minwidth = String(doc.size).length, val = eltText(node.firstChild), pad = ""; while (val.length + pad.length < minwidth) pad += "\u00a0"; if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild); } gutter.style.display = ""; var resized = Math.abs((parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth) > 2; lineSpace.style.marginLeft = gutter.offsetWidth + "px"; gutterDirty = false; return resized; } function updateSelection() { var collapsed = posEq(sel.from, sel.to); var fromPos = localCoords(sel.from, true); var toPos = collapsed ? fromPos : localCoords(sel.to, true); var headPos = sel.inverted ? fromPos : toPos, th = textHeight(); var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv); inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px"; inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px"; if (collapsed) { cursor.style.top = headPos.y + "px"; cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px"; cursor.style.display = ""; selectionDiv.style.display = "none"; } else { var sameLine = fromPos.y == toPos.y, fragment = document.createDocumentFragment(); var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth; var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight; var add = function(left, top, right, height) { var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px" : "right: " + right + "px"; fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px; top: " + top + "px; " + rstyle + "; height: " + height + "px")); }; if (sel.from.ch && fromPos.y >= 0) { var right = sameLine ? clientWidth - toPos.x : 0; add(fromPos.x, fromPos.y, right, th); } var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0)); var middleHeight = Math.min(toPos.y, clientHeight) - middleStart; if (middleHeight > 0.2 * th) add(0, middleStart, 0, middleHeight); if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th) add(0, toPos.y, clientWidth - toPos.x, th); removeChildrenAndAdd(selectionDiv, fragment); cursor.style.display = "none"; selectionDiv.style.display = ""; } } function setShift(val) { if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from); else shiftSelecting = null; } function setSelectionUser(from, to) { var sh = shiftSelecting && clipPos(shiftSelecting); if (sh) { if (posLess(sh, from)) from = sh; else if (posLess(to, sh)) to = sh; } setSelection(from, to); userSelChange = true; } // Update the selection. Last two args are only used by // updateLines, since they have to be expressed in the line // numbers before the update. function setSelection(from, to, oldFrom, oldTo) { goalColumn = null; if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;} if (posEq(sel.from, from) && posEq(sel.to, to)) return; if (posLess(to, from)) {var tmp = to; to = from; from = tmp;} // Skip over hidden lines. if (from.line != oldFrom) { var from1 = skipHidden(from, oldFrom, sel.from.ch); // If there is no non-hidden line left, force visibility on current line if (!from1) setLineHidden(from.line, false); else from = from1; } if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch); if (posEq(from, to)) sel.inverted = false; else if (posEq(from, sel.to)) sel.inverted = false; else if (posEq(to, sel.from)) sel.inverted = true; if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) { var head = sel.inverted ? from : to; if (head.line != sel.from.line && sel.from.line < doc.size) { var oldLine = getLine(sel.from.line); if (/^\s+$/.test(oldLine.text)) setTimeout(operation(function() { if (oldLine.parent && /^\s+$/.test(oldLine.text)) { var no = lineNo(oldLine); replaceRange("", {line: no, ch: 0}, {line: no, ch: oldLine.text.length}); } }, 10)); } } sel.from = from; sel.to = to; selectionChanged = true; } function skipHidden(pos, oldLine, oldCh) { function getNonHidden(dir) { var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1; while (lNo != end) { var line = getLine(lNo); if (!line.hidden) { var ch = pos.ch; if (toEnd || ch > oldCh || ch > line.text.length) ch = line.text.length; return {line: lNo, ch: ch}; } lNo += dir; } } var line = getLine(pos.line); var toEnd = pos.ch == line.text.length && pos.ch != oldCh; if (!line.hidden) return pos; if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1); else return getNonHidden(-1) || getNonHidden(1); } function setCursor(line, ch, user) { var pos = clipPos({line: line, ch: ch || 0}); (user ? setSelectionUser : setSelection)(pos, pos); } function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));} function clipPos(pos) { if (pos.line < 0) return {line: 0, ch: 0}; if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length}; var ch = pos.ch, linelen = getLine(pos.line).text.length; if (ch == null || ch > linelen) return {line: pos.line, ch: linelen}; else if (ch < 0) return {line: pos.line, ch: 0}; else return pos; } function findPosH(dir, unit) { var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch; var lineObj = getLine(line); function findNextLine() { for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) { var lo = getLine(l); if (!lo.hidden) { line = l; lineObj = lo; return true; } } } function moveOnce(boundToLine) { if (ch == (dir < 0 ? 0 : lineObj.text.length)) { if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0; else return false; } else ch += dir; return true; } if (unit == "char") moveOnce(); else if (unit == "column") moveOnce(true); else if (unit == "word") { var sawWord = false; for (;;) { if (dir < 0) if (!moveOnce()) break; if (isWordChar(lineObj.text.charAt(ch))) sawWord = true; else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;} if (dir > 0) if (!moveOnce()) break; } } return {line: line, ch: ch}; } function moveH(dir, unit) { var pos = dir < 0 ? sel.from : sel.to; if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit); setCursor(pos.line, pos.ch, true); } function deleteH(dir, unit) { if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to); else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to); else replaceRange("", sel.from, findPosH(dir, unit)); userSelChange = true; } function moveV(dir, unit) { var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true); if (goalColumn != null) pos.x = goalColumn; if (unit == "page") { var screen = Math.min(scroller.clientHeight, window.innerHeight || document.documentElement.clientHeight); var target = coordsChar(pos.x, pos.y + screen * dir); } else if (unit == "line") { var th = textHeight(); var target = coordsChar(pos.x, pos.y + .5 * th + dir * th); } if (unit == "page") scrollbar.scrollTop += localCoords(target, true).y - pos.y; setCursor(target.line, target.ch, true); goalColumn = pos.x; } function findWordAt(pos) { var line = getLine(pos.line).text; var start = pos.ch, end = pos.ch; if (line) { if (pos.after === false || end == line.length) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar) ? isWordChar : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : function(ch) {return !/\s/.test(ch) && isWordChar(ch);}; while (start > 0 && check(line.charAt(start - 1))) --start; while (end < line.length && check(line.charAt(end))) ++end; } return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: end}}; } function selectLine(line) { setSelectionUser({line: line, ch: 0}, clipPos({line: line + 1, ch: 0})); } function indentSelected(mode) { if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode); var e = sel.to.line - (sel.to.ch ? 0 : 1); for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode); } function indentLine(n, how) { if (!how) how = "add"; if (how == "smart") { if (!mode.indent) how = "prev"; else var state = getStateBefore(n); } var line = getLine(n), curSpace = line.indentation(options.tabSize), curSpaceString = line.text.match(/^\s*/)[0], indentation; if (how == "smart") { indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text); if (indentation == Pass) how = "prev"; } if (how == "prev") { if (n) indentation = getLine(n-1).indentation(options.tabSize); else indentation = 0; } else if (how == "add") indentation = curSpace + options.indentUnit; else if (how == "subtract") indentation = curSpace - options.indentUnit; indentation = Math.max(0, indentation); var diff = indentation - curSpace; var indentString = "", pos = 0; if (options.indentWithTabs) for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";} if (pos < indentation) indentString += spaceStr(indentation - pos); if (indentString != curSpaceString) replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length}); line.stateAfter = null; } function loadMode() { mode = CodeMirror.getMode(options, options.mode); doc.iter(0, doc.size, function(line) { line.stateAfter = null; }); frontier = 0; startWorker(100); } function gutterChanged() { var visible = options.gutter || options.lineNumbers; gutter.style.display = visible ? "" : "none"; if (visible) gutterDirty = true; else lineDiv.parentNode.style.marginLeft = 0; } function wrappingChanged(from, to) { if (options.lineWrapping) { wrapper.className += " CodeMirror-wrap"; var perLine = scroller.clientWidth / charWidth() - 3; doc.iter(0, doc.size, function(line) { if (line.hidden) return; var guess = Math.ceil(line.text.length / perLine) || 1; if (guess != 1) updateLineHeight(line, guess); }); lineSpace.style.minWidth = widthForcer.style.left = ""; } else { wrapper.className = wrapper.className.replace(" CodeMirror-wrap", ""); computeMaxLength(); doc.iter(0, doc.size, function(line) { if (line.height != 1 && !line.hidden) updateLineHeight(line, 1); }); } changes.push({from: 0, to: doc.size}); } function themeChanged() { scroller.className = scroller.className.replace(/\s*cm-s-\S+/g, "") + options.theme.replace(/(^|\s)\s*/g, " cm-s-"); } function keyMapChanged() { var style = keyMap[options.keyMap].style; wrapper.className = wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (style ? " cm-keymap-" + style : ""); } function TextMarker(type, style) { this.lines = []; this.type = type; if (style) this.style = style; } TextMarker.prototype.clear = operation(function() { var min, max; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null) min = lineNo(line); if (span.to != null) max = lineNo(line); line.markedSpans = removeMarkedSpan(line.markedSpans, span); } if (min != null) changes.push({from: min, to: max + 1}); this.lines.length = 0; this.explicitlyCleared = true; }); TextMarker.prototype.find = function() { var from, to; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null || span.to != null) { var found = lineNo(line); if (span.from != null) from = {line: found, ch: span.from}; if (span.to != null) to = {line: found, ch: span.to}; } } if (this.type == "bookmark") return from; return from && {from: from, to: to}; }; function markText(from, to, className, options) { from = clipPos(from); to = clipPos(to); var marker = new TextMarker("range", className); if (options) for (var opt in options) if (options.hasOwnProperty(opt)) marker[opt] = options[opt]; var curLine = from.line; doc.iter(curLine, to.line + 1, function(line) { var span = {from: curLine == from.line ? from.ch : null, to: curLine == to.line ? to.ch : null, marker: marker}; line.markedSpans = (line.markedSpans || []).concat([span]); marker.lines.push(line); ++curLine; }); changes.push({from: from.line, to: to.line + 1}); return marker; } function setBookmark(pos) { pos = clipPos(pos); var marker = new TextMarker("bookmark"), line = getLine(pos.line); history.addChange(pos.line, 1, [newHL(line.text, line.markedSpans)], true); var span = {from: pos.ch, to: pos.ch, marker: marker}; line.markedSpans = (line.markedSpans || []).concat([span]); marker.lines.push(line); return marker; } function findMarksAt(pos) { pos = clipPos(pos); var markers = [], spans = getLine(pos.line).markedSpans; if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) markers.push(span.marker); } return markers; } function addGutterMarker(line, text, className) { if (typeof line == "number") line = getLine(clipLine(line)); line.gutterMarker = {text: text, style: className}; gutterDirty = true; return line; } function removeGutterMarker(line) { if (typeof line == "number") line = getLine(clipLine(line)); line.gutterMarker = null; gutterDirty = true; } function changeLine(handle, op) { var no = handle, line = handle; if (typeof handle == "number") line = getLine(clipLine(handle)); else no = lineNo(handle); if (no == null) return null; if (op(line, no)) changes.push({from: no, to: no + 1}); else return null; return line; } function setLineClass(handle, className, bgClassName) { return changeLine(handle, function(line) { if (line.className != className || line.bgClassName != bgClassName) { line.className = className; line.bgClassName = bgClassName; return true; } }); } function setLineHidden(handle, hidden) { return changeLine(handle, function(line, no) { if (line.hidden != hidden) { line.hidden = hidden; if (!options.lineWrapping) { if (hidden && line.text.length == maxLine.text.length) { updateMaxLine = true; } else if (!hidden && line.text.length > maxLine.text.length) { maxLine = line; updateMaxLine = false; } } updateLineHeight(line, hidden ? 0 : 1); var fline = sel.from.line, tline = sel.to.line; if (hidden && (fline == no || tline == no)) { var from = fline == no ? skipHidden({line: fline, ch: 0}, fline, 0) : sel.from; var to = tline == no ? skipHidden({line: tline, ch: 0}, tline, 0) : sel.to; // Can't hide the last visible line, we'd have no place to put the cursor if (!to) return; setSelection(from, to); } return (gutterDirty = true); } }); } function lineInfo(line) { if (typeof line == "number") { if (!isLine(line)) return null; var n = line; line = getLine(line); if (!line) return null; } else { var n = lineNo(line); if (n == null) return null; } var marker = line.gutterMarker; return {line: n, handle: line, text: line.text, markerText: marker && marker.text, markerClass: marker && marker.style, lineClass: line.className, bgClass: line.bgClassName}; } function measureLine(line, ch) { if (ch == 0) return {top: 0, left: 0}; var pre = lineContent(line, ch); removeChildrenAndAdd(measure, pre); var anchor = pre.anchor; var top = anchor.offsetTop, left = anchor.offsetLeft; // Older IEs report zero offsets for spans directly after a wrap if (ie && top == 0 && left == 0) { var backup = elt("span", "x"); anchor.parentNode.insertBefore(backup, anchor.nextSibling); top = backup.offsetTop; } return {top: top, left: left}; } function localCoords(pos, inLineWrap) { var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0)); if (pos.ch == 0) x = 0; else { var sp = measureLine(getLine(pos.line), pos.ch); x = sp.left; if (options.lineWrapping) y += Math.max(0, sp.top); } return {x: x, y: y, yBot: y + lh}; } // Coords must be lineSpace-local function coordsChar(x, y) { var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th); if (heightPos < 0) return {line: 0, ch: 0}; var lineNo = lineAtHeight(doc, heightPos); if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length}; var lineObj = getLine(lineNo), text = lineObj.text; var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0; if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0}; var wrongLine = false; function getX(len) { var sp = measureLine(lineObj, len); if (tw) { var off = Math.round(sp.top / th); wrongLine = off != innerOff; return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth); } return sp.left; } var from = 0, fromX = 0, to = text.length, toX; // Guess a suitable upper bound for our search. var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw)); for (;;) { var estX = getX(estimated); if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2)); else {toX = estX; to = estimated; break;} } if (x > toX) return {line: lineNo, ch: to}; // Try to guess a suitable lower bound as well. estimated = Math.floor(to * 0.8); estX = getX(estimated); if (estX < x) {from = estimated; fromX = estX;} // Do a binary search between these bounds. for (;;) { if (to - from <= 1) { var after = x - fromX < toX - x; return {line: lineNo, ch: after ? from : to, after: after}; } var middle = Math.ceil((from + to) / 2), middleX = getX(middle); if (middleX > x) {to = middle; toX = middleX; if (wrongLine) toX += 1000; } else {from = middle; fromX = middleX;} } } function pageCoords(pos) { var local = localCoords(pos, true), off = eltOffset(lineSpace); return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot}; } var cachedHeight, cachedHeightFor, measurePre; function textHeight() { if (measurePre == null) { measurePre = elt("pre"); for (var i = 0; i < 49; ++i) { measurePre.appendChild(document.createTextNode("x")); measurePre.appendChild(elt("br")); } measurePre.appendChild(document.createTextNode("x")); } var offsetHeight = lineDiv.clientHeight; if (offsetHeight == cachedHeightFor) return cachedHeight; cachedHeightFor = offsetHeight; removeChildrenAndAdd(measure, measurePre.cloneNode(true)); cachedHeight = measure.firstChild.offsetHeight / 50 || 1; removeChildren(measure); return cachedHeight; } var cachedWidth, cachedWidthFor = 0; function charWidth() { if (scroller.clientWidth == cachedWidthFor) return cachedWidth; cachedWidthFor = scroller.clientWidth; var anchor = elt("span", "x"); var pre = elt("pre", [anchor]); removeChildrenAndAdd(measure, pre); return (cachedWidth = anchor.offsetWidth || 10); } function paddingTop() {return lineSpace.offsetTop;} function paddingLeft() {return lineSpace.offsetLeft;} function posFromMouse(e, liberal) { var offW = eltOffset(scroller, true), x, y; // Fails unpredictably on IE[67] when mouse is dragged around quickly. try { x = e.clientX; y = e.clientY; } catch (e) { return null; } // This is a mess of a heuristic to try and determine whether a // scroll-bar was clicked or not, and to return null if one was // (and !liberal). if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight)) return null; var offL = eltOffset(lineSpace, true); return coordsChar(x - offL.left, y - offL.top); } var detectingSelectAll; function onContextMenu(e) { var pos = posFromMouse(e), scrollPos = scrollbar.scrollTop; if (!pos || opera) return; // Opera is difficult. if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) operation(setCursor)(pos.line, pos.ch); var oldCSS = input.style.cssText; inputDiv.style.position = "absolute"; input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " + "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; focusInput(); resetInput(true); // Adds "Select all" to context menu in FF if (posEq(sel.from, sel.to)) input.value = prevInput = " "; function rehide() { inputDiv.style.position = "relative"; input.style.cssText = oldCSS; if (ie_lt9) scrollbar.scrollTop = scrollPos; slowPoll(); // Try to detect the user choosing select-all if (input.selectionStart != null) { clearTimeout(detectingSelectAll); var extval = input.value = " " + (posEq(sel.from, sel.to) ? "" : input.value), i = 0; prevInput = " "; input.selectionStart = 1; input.selectionEnd = extval.length; detectingSelectAll = setTimeout(function poll(){ if (prevInput == " " && input.selectionStart == 0) operation(commands.selectAll)(instance); else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); else resetInput(); }, 200); } } if (gecko) { e_stop(e); var mouseup = connect(window, "mouseup", function() { mouseup(); setTimeout(rehide, 20); }, true); } else { setTimeout(rehide, 50); } } // Cursor-blinking function restartBlink() { clearInterval(blinker); var on = true; cursor.style.visibility = ""; blinker = setInterval(function() { cursor.style.visibility = (on = !on) ? "" : "hidden"; }, options.cursorBlinkRate); } var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; function matchBrackets(autoclear) { var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1; var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; if (!match) return; var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles; for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2) if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;} var stack = [line.text.charAt(pos)], re = /[(){}[\]]/; function scan(line, from, to) { if (!line.text) return; var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur; for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) { var text = st[i]; if (st[i+1] != style) {pos += d * text.length; continue;} for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) { if (pos >= from && pos < to && re.test(cur = text.charAt(j))) { var match = matching[cur]; if (match.charAt(1) == ">" == forward) stack.push(cur); else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false}; else if (!stack.length) return {pos: pos, match: true}; } } } } for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) { var line = getLine(i), first = i == head.line; var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length); if (found) break; } if (!found) found = {pos: null, match: false}; var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style), two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style); var clear = operation(function(){one.clear(); two && two.clear();}); if (autoclear) setTimeout(clear, 800); else bracketHighlighted = clear; } // Finds the line to start with when starting a parse. Tries to // find a line with a stateAfter, so that it can start with a // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. function findStartLine(n) { var minindent, minline; for (var search = n, lim = n - 40; search > lim; --search) { if (search == 0) return 0; var line = getLine(search-1); if (line.stateAfter) return search; var indented = line.indentation(options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; minindent = indented; } } return minline; } function getStateBefore(n) { var pos = findStartLine(n), state = pos && getLine(pos-1).stateAfter; if (!state) state = startState(mode); else state = copyState(mode, state); doc.iter(pos, n, function(line) { line.process(mode, state, options.tabSize); line.stateAfter = (pos == n - 1 || pos % 5 == 0) ? copyState(mode, state) : null; }); return state; } function highlightWorker() { if (frontier >= showingTo) return; var end = +new Date + options.workTime, state = copyState(mode, getStateBefore(frontier)); var startFrontier = frontier; doc.iter(frontier, showingTo, function(line) { if (frontier >= showingFrom) { // Visible line.highlight(mode, state, options.tabSize); line.stateAfter = copyState(mode, state); } else { line.process(mode, state, options.tabSize); line.stateAfter = frontier % 5 == 0 ? copyState(mode, state) : null; } ++frontier; if (+new Date > end) { startWorker(options.workDelay); return true; } }); if (showingTo > startFrontier && frontier >= showingFrom) operation(function() {changes.push({from: startFrontier, to: frontier});})(); } function startWorker(time) { if (frontier < showingTo) highlight.set(time, highlightWorker); } // Operations are used to wrap changes in such a way that each // change won't have to update the cursor and display (which would // be awkward, slow, and error-prone), but instead updates are // batched and then all combined and executed at once. function startOperation() { updateInput = userSelChange = textChanged = null; changes = []; selectionChanged = false; callbacks = []; } function endOperation() { if (updateMaxLine) computeMaxLength(); if (maxLineChanged && !options.lineWrapping) { var cursorWidth = widthForcer.offsetWidth, left = measureLine(maxLine, maxLine.text.length).left; if (!ie_lt8) { widthForcer.style.left = left + "px"; lineSpace.style.minWidth = (left + cursorWidth) + "px"; } maxLineChanged = false; } var newScrollPos, updated; if (selectionChanged) { var coords = calculateCursorCoords(); newScrollPos = calculateScrollPos(coords.x, coords.y, coords.x, coords.yBot); } if (changes.length || newScrollPos && newScrollPos.scrollTop != null) updated = updateDisplay(changes, true, newScrollPos && newScrollPos.scrollTop); if (!updated) { if (selectionChanged) updateSelection(); if (gutterDirty) updateGutter(); } if (newScrollPos) scrollCursorIntoView(); if (selectionChanged) restartBlink(); if (focused && (updateInput === true || (updateInput !== false && selectionChanged))) resetInput(userSelChange); if (selectionChanged && options.matchBrackets) setTimeout(operation(function() { if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;} if (posEq(sel.from, sel.to)) matchBrackets(false); }), 20); var sc = selectionChanged, cbs = callbacks; // these can be reset by callbacks if (textChanged && options.onChange && instance) options.onChange(instance, textChanged); if (sc && options.onCursorActivity) options.onCursorActivity(instance); for (var i = 0; i < cbs.length; ++i) cbs[i](instance); if (updated && options.onUpdate) options.onUpdate(instance); } var nestedOperation = 0; function operation(f) { return function() { if (!nestedOperation++) startOperation(); try {var result = f.apply(this, arguments);} finally {if (!--nestedOperation) endOperation();} return result; }; } function compoundChange(f) { history.startCompound(); try { return f(); } finally { history.endCompound(); } } for (var ext in extensions) if (extensions.propertyIsEnumerable(ext) && !instance.propertyIsEnumerable(ext)) instance[ext] = extensions[ext]; for (var i = 0; i < initHooks.length; ++i) initHooks[i](instance); return instance; } // (end of function CodeMirror) // The default configuration options. CodeMirror.defaults = { value: "", mode: null, theme: "default", indentUnit: 2, indentWithTabs: false, smartIndent: true, tabSize: 4, keyMap: "default", extraKeys: null, electricChars: true, autoClearEmptyLines: false, onKeyEvent: null, onDragEvent: null, lineWrapping: false, lineNumbers: false, gutter: false, fixedGutter: false, firstLineNumber: 1, readOnly: false, dragDrop: true, onChange: null, onCursorActivity: null, onViewportChange: null, onGutterClick: null, onUpdate: null, onFocus: null, onBlur: null, onScroll: null, matchBrackets: false, cursorBlinkRate: 530, workTime: 100, workDelay: 200, pollInterval: 100, undoDepth: 40, tabindex: null, autofocus: null, lineNumberFormatter: function(integer) { return integer; } }; var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); var mac = ios || /Mac/.test(navigator.platform); var win = /Win/.test(navigator.platform); // Known modes, by name and by MIME var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; CodeMirror.defineMode = function(name, mode) { if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (arguments.length > 2) { mode.dependencies = []; for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); } modes[name] = mode; }; CodeMirror.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) spec = mimeModes[spec]; else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) return CodeMirror.resolveMode("application/xml"); if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; CodeMirror.getMode = function(options, spec) { var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); if (modeExtensions.hasOwnProperty(spec.name)) { var exts = modeExtensions[spec.name]; for (var prop in exts) if (exts.hasOwnProperty(prop)) modeObj[prop] = exts[prop]; } modeObj.name = spec.name; return modeObj; }; CodeMirror.listModes = function() { var list = []; for (var m in modes) if (modes.propertyIsEnumerable(m)) list.push(m); return list; }; CodeMirror.listMIMEs = function() { var list = []; for (var m in mimeModes) if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]}); return list; }; var extensions = CodeMirror.extensions = {}; CodeMirror.defineExtension = function(name, func) { extensions[name] = func; }; var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; var modeExtensions = CodeMirror.modeExtensions = {}; CodeMirror.extendMode = function(mode, properties) { var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); for (var prop in properties) if (properties.hasOwnProperty(prop)) exts[prop] = properties[prop]; }; var commands = CodeMirror.commands = { selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});}, killLine: function(cm) { var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0}); else cm.replaceRange("", from, sel ? to : {line: from.line}); }, deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});}, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, goDocStart: function(cm) {cm.setCursor(0, 0, true);}, goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);}, goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);}, goLineStartSmart: function(cm) { var cur = cm.getCursor(); var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/)); cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true); }, goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);}, goLineUp: function(cm) {cm.moveV(-1, "line");}, goLineDown: function(cm) {cm.moveV(1, "line");}, goPageUp: function(cm) {cm.moveV(-1, "page");}, goPageDown: function(cm) {cm.moveV(1, "page");}, goCharLeft: function(cm) {cm.moveH(-1, "char");}, goCharRight: function(cm) {cm.moveH(1, "char");}, goColumnLeft: function(cm) {cm.moveH(-1, "column");}, goColumnRight: function(cm) {cm.moveH(1, "column");}, goWordLeft: function(cm) {cm.moveH(-1, "word");}, goWordRight: function(cm) {cm.moveH(1, "word");}, delCharLeft: function(cm) {cm.deleteH(-1, "char");}, delCharRight: function(cm) {cm.deleteH(1, "char");}, delWordLeft: function(cm) {cm.deleteH(-1, "word");}, delWordRight: function(cm) {cm.deleteH(1, "word");}, indentAuto: function(cm) {cm.indentSelection("smart");}, indentMore: function(cm) {cm.indentSelection("add");}, indentLess: function(cm) {cm.indentSelection("subtract");}, insertTab: function(cm) {cm.replaceSelection("\t", "end");}, defaultTab: function(cm) { if (cm.somethingSelected()) cm.indentSelection("add"); else cm.replaceSelection("\t", "end"); }, transposeChars: function(cm) { var cur = cm.getCursor(), line = cm.getLine(cur.line); if (cur.ch > 0 && cur.ch < line.length - 1) cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1}); }, newlineAndIndent: function(cm) { cm.replaceSelection("\n", "end"); cm.indentLine(cm.getCursor().line); }, toggleOverwrite: function(cm) {cm.toggleOverwrite();} }; var keyMap = CodeMirror.keyMap = {}; keyMap.basic = { "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "defaultTab", "Shift-Tab": "indentAuto", "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" }; // Note that the save and find-related commands aren't defined by // default. Unknown commands are simply ignored. keyMap.pcDefault = { "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", fallthrough: "basic" }; keyMap.macDefault = { "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft", "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft", "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; keyMap.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft", "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" }; function getKeyMap(val) { if (typeof val == "string") return keyMap[val]; else return val; } function lookupKey(name, extraMap, map, handle, stop) { function lookup(map) { map = getKeyMap(map); var found = map[name]; if (found === false) { if (stop) stop(); return true; } if (found != null && handle(found)) return true; if (map.nofallthrough) { if (stop) stop(); return true; } var fallthrough = map.fallthrough; if (fallthrough == null) return false; if (Object.prototype.toString.call(fallthrough) != "[object Array]") return lookup(fallthrough); for (var i = 0, e = fallthrough.length; i < e; ++i) { if (lookup(fallthrough[i])) return true; } return false; } if (extraMap && lookup(extraMap)) return true; return lookup(map); } function isModifierKey(event) { var name = keyNames[e_prop(event, "keyCode")]; return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; } CodeMirror.isModifierKey = isModifierKey; CodeMirror.fromTextArea = function(textarea, options) { if (!options) options = {}; options.value = textarea.value; if (!options.tabindex && textarea.tabindex) options.tabindex = textarea.tabindex; // Set autofocus to true if this textarea is focused, or if it has // autofocus and no other element is focused. if (options.autofocus == null) { var hasFocus = document.body; // doc.activeElement occasionally throws on IE try { hasFocus = document.activeElement; } catch(e) {} options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; } function save() {textarea.value = instance.getValue();} if (textarea.form) { // Deplorable hack to make the submit method do the right thing. var rmSubmit = connect(textarea.form, "submit", save, true); if (typeof textarea.form.submit == "function") { var realSubmit = textarea.form.submit; textarea.form.submit = function wrappedSubmit() { save(); textarea.form.submit = realSubmit; textarea.form.submit(); textarea.form.submit = wrappedSubmit; }; } } textarea.style.display = "none"; var instance = CodeMirror(function(node) { textarea.parentNode.insertBefore(node, textarea.nextSibling); }, options); instance.save = save; instance.getTextArea = function() { return textarea; }; instance.toTextArea = function() { save(); textarea.parentNode.removeChild(instance.getWrapperElement()); textarea.style.display = ""; if (textarea.form) { rmSubmit(); if (typeof textarea.form.submit == "function") textarea.form.submit = realSubmit; } }; return instance; }; var gecko = /gecko\/\d{7}/i.test(navigator.userAgent); var ie = /MSIE \d/.test(navigator.userAgent); var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent); var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent); var quirksMode = ie && document.documentMode == 5; var webkit = /WebKit\//.test(navigator.userAgent); var chrome = /Chrome\//.test(navigator.userAgent); var opera = /Opera\//.test(navigator.userAgent); var safari = /Apple Computer/.test(navigator.vendor); var khtml = /KHTML\//.test(navigator.userAgent); var mac_geLion = /Mac OS X 10\D([7-9]|\d\d)\D/.test(navigator.userAgent); // Utility functions for working with state. Exported because modes // sometimes need to do this. function copyState(mode, state) { if (state === true) return state; if (mode.copyState) return mode.copyState(state); var nstate = {}; for (var n in state) { var val = state[n]; if (val instanceof Array) val = val.concat([]); nstate[n] = val; } return nstate; } CodeMirror.copyState = copyState; function startState(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; } CodeMirror.startState = startState; CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); state = info.state; mode = info.mode; } return info || {mode: mode, state: state}; }; // The character stream used by a mode's parser. function StringStream(string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == 0;}, peek: function() {return this.string.charAt(this.pos) || undefined;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() {return countColumn(this.string, this.start, this.tabSize);}, indentation: function() {return countColumn(this.string, null, this.tabSize);}, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);} }; CodeMirror.StringStream = StringStream; function MarkedSpan(from, to, marker) { this.from = from; this.to = to; this.marker = marker; } function getMarkedSpanFor(spans, marker) { if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.marker == marker) return span; } } function removeMarkedSpan(spans, span) { var r; for (var i = 0; i < spans.length; ++i) if (spans[i] != span) (r || (r = [])).push(spans[i]); return r; } function markedSpansBefore(old, startCh, endCh) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); if (startsBefore || marker.type == "bookmark" && span.from == startCh && span.from != endCh) { var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); (nw || (nw = [])).push({from: span.from, to: endsAfter ? null : span.to, marker: marker}); } } return nw; } function markedSpansAfter(old, endCh) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); if (endsAfter || marker.type == "bookmark" && span.from == endCh) { var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, to: span.to == null ? null : span.to - endCh, marker: marker}); } } return nw; } function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) { if (!oldFirst && !oldLast) return newText; // Get the spans that 'stick out' on both sides var first = markedSpansBefore(oldFirst, startCh); var last = markedSpansAfter(oldLast, endCh); // Next, merge those two ends var sameLine = newText.length == 1, offset = lst(newText).length + (sameLine ? startCh : 0); if (first) { // Fix up .to properties of first for (var i = 0; i < first.length; ++i) { var span = first[i]; if (span.to == null) { var found = getMarkedSpanFor(last, span.marker); if (!found) span.to = startCh; else if (sameLine) span.to = found.to == null ? null : found.to + offset; } } } if (last) { // Fix up .from in last (or move them into first in case of sameLine) for (var i = 0; i < last.length; ++i) { var span = last[i]; if (span.to != null) span.to += offset; if (span.from == null) { var found = getMarkedSpanFor(first, span.marker); if (!found) { span.from = offset; if (sameLine) (first || (first = [])).push(span); } } else { span.from += offset; if (sameLine) (first || (first = [])).push(span); } } } var newMarkers = [newHL(newText[0], first)]; if (!sameLine) { // Fill gap with whole-line-spans var gap = newText.length - 2, gapMarkers; if (gap > 0 && first) for (var i = 0; i < first.length; ++i) if (first[i].to == null) (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); for (var i = 0; i < gap; ++i) newMarkers.push(newHL(newText[i+1], gapMarkers)); newMarkers.push(newHL(lst(newText), last)); } return newMarkers; } // hl stands for history-line, a data structure that can be either a // string (line without markers) or a {text, markedSpans} object. function hlText(val) { return typeof val == "string" ? val : val.text; } function hlSpans(val) { if (typeof val == "string") return null; var spans = val.markedSpans, out = null; for (var i = 0; i < spans.length; ++i) { if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } else if (out) out.push(spans[i]); } return !out ? spans : out.length ? out : null; } function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; } function detachMarkedSpans(line) { var spans = line.markedSpans; if (!spans) return; for (var i = 0; i < spans.length; ++i) { var lines = spans[i].marker.lines; var ix = indexOf(lines, line); lines.splice(ix, 1); } line.markedSpans = null; } function attachMarkedSpans(line, spans) { if (!spans) return; for (var i = 0; i < spans.length; ++i) var marker = spans[i].marker.lines.push(line); line.markedSpans = spans; } // When measuring the position of the end of a line, different // browsers require different approaches. If an empty span is added, // many browsers report bogus offsets. Of those, some (Webkit, // recent IE) will accept a space without moving the whole span to // the next line when wrapping it, others work with a zero-width // space. var eolSpanContent = " "; if (gecko || (ie && !ie_lt8)) eolSpanContent = "\u200b"; else if (opera) eolSpanContent = ""; // Line objects. These hold state related to a line, including // highlighting info (the styles array). function Line(text, markedSpans) { this.text = text; this.height = 1; attachMarkedSpans(this, markedSpans); } Line.prototype = { update: function(text, markedSpans) { this.text = text; this.stateAfter = this.styles = null; detachMarkedSpans(this); attachMarkedSpans(this, markedSpans); }, // Run the given mode's parser over a line, update the styles // array, which contains alternating fragments of text and CSS // classes. highlight: function(mode, state, tabSize) { var stream = new StringStream(this.text, tabSize), st = this.styles || (this.styles = []); var pos = st.length = 0; if (this.text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { var style = mode.token(stream, state), substr = stream.current(); stream.start = stream.pos; if (pos && st[pos-1] == style) { st[pos-2] += substr; } else if (substr) { st[pos++] = substr; st[pos++] = style; } // Give up when line is ridiculously long if (stream.pos > 5000) { st[pos++] = this.text.slice(stream.pos); st[pos++] = null; break; } } }, process: function(mode, state, tabSize) { var stream = new StringStream(this.text, tabSize); if (this.text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol() && stream.pos <= 5000) { mode.token(stream, state); stream.start = stream.pos; } }, // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). getTokenAt: function(mode, state, tabSize, ch) { var txt = this.text, stream = new StringStream(txt, tabSize); while (stream.pos < ch && !stream.eol()) { stream.start = stream.pos; var style = mode.token(stream, state); } return {start: stream.start, end: stream.pos, string: stream.current(), className: style || null, state: state}; }, indentation: function(tabSize) {return countColumn(this.text, null, tabSize);}, // Produces an HTML fragment for the line, taking selection, // marking, and highlighting into account. getContent: function(tabSize, wrapAt, compensateForWrapping) { var first = true, col = 0, specials = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g; var pre = elt("pre"); function span_(html, text, style) { if (!text) return; // Work around a bug where, in some compat modes, IE ignores leading spaces if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1); first = false; if (!specials.test(text)) { col += text.length; var content = document.createTextNode(text); } else { var content = document.createDocumentFragment(), pos = 0; while (true) { specials.lastIndex = pos; var m = specials.exec(text); var skipped = m ? m.index - pos : text.length - pos; if (skipped) { content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); col += skipped; } if (!m) break; pos += skipped + 1; if (m[0] == "\t") { var tabWidth = tabSize - col % tabSize; content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); col += tabWidth; } else { var token = elt("span", "\u2022", "cm-invalidchar"); token.title = "\\u" + m[0].charCodeAt(0).toString(16); content.appendChild(token); col += 1; } } } if (style) html.appendChild(elt("span", [content], style)); else html.appendChild(content); } var span = span_; if (wrapAt != null) { var outPos = 0, anchor = pre.anchor = elt("span"); span = function(html, text, style) { var l = text.length; if (wrapAt >= outPos && wrapAt < outPos + l) { var cut = wrapAt - outPos; if (cut) { span_(html, text.slice(0, cut), style); // See comment at the definition of spanAffectsWrapping if (compensateForWrapping) { var view = text.slice(cut - 1, cut + 1); if (spanAffectsWrapping.test(view)) html.appendChild(elt("wbr")); else if (!ie_lt8 && /\w\w/.test(view)) html.appendChild(document.createTextNode("\u200d")); } } html.appendChild(anchor); span_(anchor, opera ? text.slice(cut, cut + 1) : text.slice(cut), style); if (opera) span_(html, text.slice(cut + 1), style); wrapAt--; outPos += l; } else { outPos += l; span_(html, text, style); if (outPos == wrapAt && outPos == len) { setTextContent(anchor, eolSpanContent); html.appendChild(anchor); } // Stop outputting HTML when gone sufficiently far beyond measure else if (outPos > wrapAt + 10 && /\s/.test(text)) span = function(){}; } }; } var st = this.styles, allText = this.text, marked = this.markedSpans; var len = allText.length; function styleToClass(style) { if (!style) return null; return "cm-" + style.replace(/ +/g, " cm-"); } if (!allText && wrapAt == null) { span(pre, " "); } else if (!marked || !marked.length) { for (var i = 0, ch = 0; ch < len; i+=2) { var str = st[i], style = st[i+1], l = str.length; if (ch + l > len) str = str.slice(0, len - ch); ch += l; span(pre, str, styleToClass(style)); } } else { marked.sort(function(a, b) { return a.from - b.from; }); var pos = 0, i = 0, text = "", style, sg = 0; var nextChange = marked[0].from || 0, marks = [], markpos = 0; var advanceMarks = function() { var m; while (markpos < marked.length && ((m = marked[markpos]).from == pos || m.from == null)) { if (m.marker.type == "range") marks.push(m); ++markpos; } nextChange = markpos < marked.length ? marked[markpos].from : Infinity; for (var i = 0; i < marks.length; ++i) { var to = marks[i].to; if (to == null) to = Infinity; if (to == pos) marks.splice(i--, 1); else nextChange = Math.min(to, nextChange); } }; var m = 0; while (pos < len) { if (nextChange == pos) advanceMarks(); var upto = Math.min(len, nextChange); while (true) { if (text) { var end = pos + text.length; var appliedStyle = style; for (var j = 0; j < marks.length; ++j) { var mark = marks[j]; appliedStyle = (appliedStyle ? appliedStyle + " " : "") + mark.marker.style; if (mark.marker.endStyle && mark.to === Math.min(end, upto)) appliedStyle += " " + mark.marker.endStyle; if (mark.marker.startStyle && mark.from === pos) appliedStyle += " " + mark.marker.startStyle; } span(pre, end > upto ? text.slice(0, upto - pos) : text, appliedStyle); if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; } text = st[i++]; style = styleToClass(st[i++]); } } } return pre; }, cleanUp: function() { this.parent = null; detachMarkedSpans(this); } }; // Data structure that holds the sequence of lines. function LeafChunk(lines) { this.lines = lines; this.parent = null; for (var i = 0, e = lines.length, height = 0; i < e; ++i) { lines[i].parent = this; height += lines[i].height; } this.height = height; } LeafChunk.prototype = { chunkSize: function() { return this.lines.length; }, remove: function(at, n, callbacks) { for (var i = at, e = at + n; i < e; ++i) { var line = this.lines[i]; this.height -= line.height; line.cleanUp(); if (line.handlers) for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]); } this.lines.splice(at, n); }, collapse: function(lines) { lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); }, insertHeight: function(at, lines, height) { this.height += height; this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; }, iterN: function(at, n, op) { for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true; } }; function BranchChunk(children) { this.children = children; var size = 0, height = 0; for (var i = 0, e = children.length; i < e; ++i) { var ch = children[i]; size += ch.chunkSize(); height += ch.height; ch.parent = this; } this.size = size; this.height = height; this.parent = null; } BranchChunk.prototype = { chunkSize: function() { return this.size; }, remove: function(at, n, callbacks) { this.size -= n; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var rm = Math.min(n, sz - at), oldHeight = child.height; child.remove(at, rm, callbacks); this.height -= oldHeight - child.height; if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } if ((n -= rm) == 0) break; at = 0; } else at -= sz; } if (this.size - n < 25) { var lines = []; this.collapse(lines); this.children = [new LeafChunk(lines)]; this.children[0].parent = this; } }, collapse: function(lines) { for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); }, insert: function(at, lines) { var height = 0; for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; this.insertHeight(at, lines, height); }, insertHeight: function(at, lines, height) { this.size += lines.length; this.height += height; for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at <= sz) { child.insertHeight(at, lines, height); if (child.lines && child.lines.length > 50) { while (child.lines.length > 50) { var spilled = child.lines.splice(child.lines.length - 25, 25); var newleaf = new LeafChunk(spilled); child.height -= newleaf.height; this.children.splice(i + 1, 0, newleaf); newleaf.parent = this; } this.maybeSpill(); } break; } at -= sz; } }, maybeSpill: function() { if (this.children.length <= 10) return; var me = this; do { var spilled = me.children.splice(me.children.length - 5, 5); var sibling = new BranchChunk(spilled); if (!me.parent) { // Become the parent node var copy = new BranchChunk(me.children); copy.parent = me; me.children = [copy, sibling]; me = copy; } else { me.size -= sibling.size; me.height -= sibling.height; var myIndex = indexOf(me.parent.children, me); me.parent.children.splice(myIndex + 1, 0, sibling); } sibling.parent = me.parent; } while (me.children.length > 10); me.parent.maybeSpill(); }, iter: function(from, to, op) { this.iterN(from, to - from, op); }, iterN: function(at, n, op) { for (var i = 0, e = this.children.length; i < e; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var used = Math.min(n, sz - at); if (child.iterN(at, used, op)) return true; if ((n -= used) == 0) break; at = 0; } else at -= sz; } } }; function getLineAt(chunk, n) { while (!chunk.lines) { for (var i = 0;; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; break; } n -= sz; } } return chunk.lines[n]; } function lineNo(line) { if (line.parent == null) return null; var cur = line.parent, no = indexOf(cur.lines, line); for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { for (var i = 0, e = chunk.children.length; ; ++i) { if (chunk.children[i] == cur) break; no += chunk.children[i].chunkSize(); } } return no; } function lineAtHeight(chunk, h) { var n = 0; outer: do { for (var i = 0, e = chunk.children.length; i < e; ++i) { var child = chunk.children[i], ch = child.height; if (h < ch) { chunk = child; continue outer; } h -= ch; n += child.chunkSize(); } return n; } while (!chunk.lines); for (var i = 0, e = chunk.lines.length; i < e; ++i) { var line = chunk.lines[i], lh = line.height; if (h < lh) break; h -= lh; } return n + i; } function heightAtLine(chunk, n) { var h = 0; outer: do { for (var i = 0, e = chunk.children.length; i < e; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; continue outer; } n -= sz; h += child.height; } return h; } while (!chunk.lines); for (var i = 0; i < n; ++i) h += chunk.lines[i].height; return h; } // The history object 'chunks' changes that are made close together // and at almost the same time into bigger undoable units. function History() { this.time = 0; this.done = []; this.undone = []; this.compound = 0; this.closed = false; } History.prototype = { addChange: function(start, added, old) { this.undone.length = 0; var time = +new Date, cur = lst(this.done), last = cur && lst(cur); var dtime = time - this.time; if (cur && !this.closed && this.compound) { cur.push({start: start, added: added, old: old}); } else if (dtime > 400 || !last || this.closed || last.start > start + old.length || last.start + last.added < start) { this.done.push([{start: start, added: added, old: old}]); this.closed = false; } else { var startBefore = Math.max(0, last.start - start), endAfter = Math.max(0, (start + old.length) - (last.start + last.added)); for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]); for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]); if (startBefore) last.start = start; last.added += added - (old.length - startBefore - endAfter); } this.time = time; }, startCompound: function() { if (!this.compound++) this.closed = true; }, endCompound: function() { if (!--this.compound) this.closed = true; } }; function stopMethod() {e_stop(this);} // Ensure an event has a stop method. function addStop(event) { if (!event.stop) event.stop = stopMethod; return event; } function e_preventDefault(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } function e_stopPropagation(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; } function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} CodeMirror.e_stop = e_stop; CodeMirror.e_preventDefault = e_preventDefault; CodeMirror.e_stopPropagation = e_stopPropagation; function e_target(e) {return e.target || e.srcElement;} function e_button(e) { var b = e.which; if (b == null) { if (e.button & 1) b = 1; else if (e.button & 2) b = 3; else if (e.button & 4) b = 2; } if (mac && e.ctrlKey && b == 1) b = 3; return b; } // Allow 3rd-party code to override event properties by adding an override // object to an event object. function e_prop(e, prop) { var overridden = e.override && e.override.hasOwnProperty(prop); return overridden ? e.override[prop] : e[prop]; } // Event handler registration. If disconnect is true, it'll return a // function that unregisters the handler. function connect(node, type, handler, disconnect) { if (typeof node.addEventListener == "function") { node.addEventListener(type, handler, false); if (disconnect) return function() {node.removeEventListener(type, handler, false);}; } else { var wrapHandler = function(event) {handler(event || window.event);}; node.attachEvent("on" + type, wrapHandler); if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);}; } } CodeMirror.connect = connect; function Delayed() {this.id = null;} Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; // Detect drag-and-drop var dragAndDrop = function() { // There is *some* kind of drag-and-drop support in IE6-8, but I // couldn't get it to work yet. if (ie_lt9) return false; var div = elt('div'); return "draggable" in div || "dragDrop" in div; }(); // Feature-detect whether newlines in textareas are converted to \r\n var lineSep = function () { var te = elt("textarea"); te.value = "foo\nbar"; if (te.value.indexOf("\r") > -1) return "\r\n"; return "\n"; }(); // For a reason I have yet to figure out, some browsers disallow // word wrapping between certain characters *only* if a new inline // element is started between them. This makes it hard to reliably // measure the position of things, since that requires inserting an // extra span. This terribly fragile set of regexps matches the // character combinations that suffer from this phenomenon on the // various browsers. var spanAffectsWrapping = /^$/; // Won't match any two-character string if (gecko) spanAffectsWrapping = /$'/; else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/; // Counts the column offset in a string, taking tabs into account. // Used mostly to find indentation. function countColumn(string, end, tabSize) { if (end == null) { end = string.search(/[^\s\u00a0]/); if (end == -1) end = string.length; } for (var i = 0, n = 0; i < end; ++i) { if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); else ++n; } return n; } function eltOffset(node, screen) { // Take the parts of bounding client rect that we are interested in so we are able to edit if need be, // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page) try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; } catch(e) { box = {top: 0, left: 0}; } if (!screen) { // Get the toplevel scroll, working around browser differences. if (window.pageYOffset == null) { var t = document.documentElement || document.body.parentNode; if (t.scrollTop == null) t = document.body; box.top += t.scrollTop; box.left += t.scrollLeft; } else { box.top += window.pageYOffset; box.left += window.pageXOffset; } } return box; } function eltText(node) { return node.textContent || node.innerText || node.nodeValue || ""; } var spaceStrs = [""]; function spaceStr(n) { while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + " "); return spaceStrs[n]; } function lst(arr) { return arr[arr.length-1]; } function selectInput(node) { if (ios) { // Mobile Safari apparently has a bug where select() is broken. node.selectionStart = 0; node.selectionEnd = node.value.length; } else node.select(); } // Operations on {line, ch} objects. function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} function copyPos(x) {return {line: x.line, ch: x.ch};} function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") setTextContent(e, content); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } function removeChildren(e) { e.innerHTML = ""; return e; } function removeChildrenAndAdd(parent, e) { removeChildren(parent).appendChild(e); } function setTextContent(e, str) { if (ie_lt9) { e.innerHTML = ""; e.appendChild(document.createTextNode(str)); } else e.textContent = str; } // Used to position the cursor after an undo/redo by finding the // last edited character. function editEnd(from, to) { if (!to) return 0; if (!from) return to.length; for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j) if (from.charAt(i) != to.charAt(j)) break; return j + 1; } function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } function isWordChar(ch) { return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase() || /[\u4E00-\u9FA5]/.test(ch); } // See if "".split is the broken IE version, if so, provide an // alternative way to split lines. var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { var pos = 0, result = [], l = string.length; while (pos <= l) { var nl = string.indexOf("\n", pos); if (nl == -1) nl = string.length; var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); var rt = line.indexOf("\r"); if (rt != -1) { result.push(line.slice(0, rt)); pos += rt + 1; } else { result.push(line); pos = nl + 1; } } return result; } : function(string){return string.split(/\r\n?|\n/);}; CodeMirror.splitLines = splitLines; var hasSelection = window.getSelection ? function(te) { try { return te.selectionStart != te.selectionEnd; } catch(e) { return false; } } : function(te) { try {var range = te.ownerDocument.selection.createRange();} catch(e) {} if (!range || range.parentElement() != te) return false; return range.compareEndPoints("StartToEnd", range) != 0; }; CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; CodeMirror.keyNames = keyNames; (function() { // Number keys for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); // Alphabetic keys for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); // Function keys for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; })(); CodeMirror.version = "2.35"; return CodeMirror; })(); mode/000077500000000000000000000000001315737174100425135ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirrorjavascript/000077500000000000000000000000001315737174100446615ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/modeindex.html000066400000000000000000000054701315737174100466640ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/mode/javascript CodeMirror: JavaScript mode

      CodeMirror: JavaScript mode

      JavaScript mode supports a two configuration options:

      • json which will set the mode to expect JSON data rather than a JavaScript program.
      • typescript which will activate additional syntax highlighting and some other things for TypeScript code (demo).

      MIME types defined: text/javascript, application/json, text/typescript, application/typescript.

      javascript.js000066400000000000000000000340761315737174100473770ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/mode/javascript// TODO actually recognize syntax of TypeScript constructs CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var jsonMode = parserConfig.json; var isTS = parserConfig.typescript; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}; var jsKeywords = { "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "var": kw("var"), "const": kw("var"), "let": kw("var"), "function": kw("function"), "catch": kw("catch"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "typeof": operator, "instanceof": operator, "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("interface"), "class": kw("class"), "extends": kw("extends"), "constructor": kw("constructor"), // scope modifiers "public": kw("public"), "private": kw("private"), "protected": kw("protected"), "static": kw("static"), "super": kw("super"), // types "string": type, "number": type, "bool": type, "any": type }; for (var attr in tsKeywords) { jsKeywords[attr] = tsKeywords[attr]; } } return jsKeywords; }(); var isOperatorChar = /[+\-*&%=<>!?|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function nextUntilUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == end && !escaped) return false; escaped = !escaped && next == "\\"; } return escaped; } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function jsTokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") return chain(stream, state, jsTokenString(ch)); else if (/[\[\]{}\(\),;\:\.]/.test(ch)) return ret(ch); else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, jsTokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else if (state.lastType == "operator" || state.lastType == "keyword c" || /^[\[{}\(,;:]$/.test(state.lastType)) { nextUntilUnescaped(stream, "/"); stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla return ret("regexp", "string-2"); } else { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } } else if (ch == "#") { stream.skipToEnd(); return ret("error", "error"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } else { stream.eatWhile(/[\w\$_]/); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.lastType != ".") ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } function jsTokenString(quote) { return function(stream, state) { if (!nextUntilUnescaped(stream, quote)) state.tokenize = jsTokenBase; return ret("string", "string"); }; } function jsTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; function JSLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; } function parseJS(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; return style; } } } // Combinator utils var cx = {state: null, column: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { var state = cx.state; if (state.context) { cx.marked = "def"; for (var v = state.localVars; v; v = v.next) if (v.name == varname) return; state.localVars = {name: varname, next: state.localVars}; } } // Combinators var defaultVars = {name: "this", next: {name: "arguments"}}; function pushcontext() { cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; cx.state.localVars = defaultVars; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state; state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { return function expecting(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(arguments.callee); }; } function statement(type) { if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), block, poplex); if (type == ";") return cont(); if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), poplex, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); if (type == "function") return cont(functiondef); if (type == "keyword c") return cont(maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); if (type == "operator") return cont(expression); if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeoperator(type, value) { if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); if (type == "operator" && value == "?") return cont(expression, expect(":"), expression); if (type == ";") return; if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); if (type == ".") return cont(property, maybeoperator); if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperator, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type) { if (type == "variable") cx.marked = "property"; if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); } function commasep(what, end) { function proceed(type) { if (type == ",") return cont(what, proceed); if (type == end) return cont(); return cont(expect(end)); } return function commaSeparated(type) { if (type == end) return cont(); else return pass(what, proceed); }; } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function maybetype(type) { if (type == ":") return cont(typedef); return pass(); } function typedef(type) { if (type == "variable"){cx.marked = "variable-3"; return cont();} return pass(); } function vardef1(type, value) { if (type == "variable") { register(value); return isTS ? cont(maybetype, vardef2) : cont(vardef2); } return pass(); } function vardef2(type, value) { if (value == "=") return cont(expression, vardef2); if (type == ",") return cont(vardef1); } function forspec1(type) { if (type == "var") return cont(vardef1, expect(";"), forspec2); if (type == ";") return cont(forspec2); if (type == "variable") return cont(formaybein); return cont(forspec2); } function formaybein(type, value) { if (value == "in") return cont(expression); return cont(maybeoperator, forspec2); } function forspec2(type, value) { if (type == ";") return cont(forspec3); if (value == "in") return cont(expression); return cont(expression, expect(";"), forspec3); } function forspec3(type) { if (type != ")") cont(expression); } function functiondef(type, value) { if (type == "variable") {register(value); return cont(functiondef);} if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext); } function funarg(type, value) { if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();} } // Interface return { startState: function(basecolumn) { return { tokenize: jsTokenBase, lastType: null, cc: [], lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.lastType = type; return parseJS(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize == jsTokenComment) return CodeMirror.Pass; if (state.tokenize != jsTokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0); else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "form") return lexical.indented + indentUnit; else if (type == "stat") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? indentUnit : 0); else if (lexical.info == "switch" && !closing) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricChars: ":{}" }; }); CodeMirror.defineMIME("text/javascript", "javascript"); CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); typescript.html000066400000000000000000000022711315737174100477570ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/mode/javascript CodeMirror: TypeScript mode

      CodeMirror: TypeScript mode

      This is a specialization of the JavaScript mode.

      xml/000077500000000000000000000000001315737174100433135ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/modeindex.html000066400000000000000000000032161315737174100453120ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/mode/xml CodeMirror: XML mode

      CodeMirror: XML mode

      The XML mode supports two configuration parameters:

      htmlMode (boolean)
      This switches the mode to parse HTML instead of XML. This means attributes do not have to be quoted, and some elements (such as br) do not require a closing tag.
      alignCDATA (boolean)
      Setting this to true will force the opening tag of CDATA blocks to not be indented.

      MIME types defined: application/xml, text/html.

      xml.js000066400000000000000000000232661315737174100444620ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/mode/xmlCodeMirror.defineMode("xml", function(config, parserConfig) { var indentUnit = config.indentUnit; var Kludges = parserConfig.htmlMode ? { autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, 'track': true, 'wbr': true}, implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, 'th': true, 'tr': true}, contextGrabbers: { 'dd': {'dd': true, 'dt': true}, 'dt': {'dd': true, 'dt': true}, 'li': {'li': true}, 'option': {'option': true, 'optgroup': true}, 'optgroup': {'optgroup': true}, 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, 'rp': {'rp': true, 'rt': true}, 'rt': {'rp': true, 'rt': true}, 'tbody': {'tbody': true, 'tfoot': true}, 'td': {'td': true, 'th': true}, 'tfoot': {'tbody': true}, 'th': {'td': true, 'th': true}, 'thead': {'tbody': true, 'tfoot': true}, 'tr': {'tr': true} }, doNotIndent: {"pre": true}, allowUnquoted: true, allowMissing: true } : { autoSelfClosers: {}, implicitlyClosed: {}, contextGrabbers: {}, doNotIndent: {}, allowUnquoted: false, allowMissing: false }; var alignCDATA = parserConfig.alignCDATA; // Return variables for tokenizers var tagName, type; function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var ch = stream.next(); if (ch == "<") { if (stream.eat("!")) { if (stream.eat("[")) { if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); else return null; } else if (stream.match("--")) return chain(inBlock("comment", "-->")); else if (stream.match("DOCTYPE", true, true)) { stream.eatWhile(/[\w\._\-]/); return chain(doctype(1)); } else return null; } else if (stream.eat("?")) { stream.eatWhile(/[\w\._\-]/); state.tokenize = inBlock("meta", "?>"); return "meta"; } else { type = stream.eat("/") ? "closeTag" : "openTag"; stream.eatSpace(); tagName = ""; var c; while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; state.tokenize = inTag; return "tag"; } } else if (ch == "&") { var ok; if (stream.eat("#")) { if (stream.eat("x")) { ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); } else { ok = stream.eatWhile(/[\d]/) && stream.eat(";"); } } else { ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); } return ok ? "atom" : "error"; } else { stream.eatWhile(/[^&<]/); return null; } } function inTag(stream, state) { var ch = stream.next(); if (ch == ">" || (ch == "/" && stream.eat(">"))) { state.tokenize = inText; type = ch == ">" ? "endTag" : "selfcloseTag"; return "tag"; } else if (ch == "=") { type = "equals"; return null; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); return state.tokenize(stream, state); } else { stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/); return "word"; } } function inAttribute(quote) { return function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inTag; break; } } return "string"; }; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } return style; }; } function doctype(depth) { return function(stream, state) { var ch; while ((ch = stream.next()) != null) { if (ch == "<") { state.tokenize = doctype(depth + 1); return state.tokenize(stream, state); } else if (ch == ">") { if (depth == 1) { state.tokenize = inText; break; } else { state.tokenize = doctype(depth - 1); return state.tokenize(stream, state); } } } return "meta"; }; } var curState, setStyle; function pass() { for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function pushContext(tagName, startOfLine) { var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent); curState.context = { prev: curState.context, tagName: tagName, indent: curState.indented, startOfLine: startOfLine, noIndent: noIndent }; } function popContext() { if (curState.context) curState.context = curState.context.prev; } function element(type) { if (type == "openTag") { curState.tagName = tagName; return cont(attributes, endtag(curState.startOfLine)); } else if (type == "closeTag") { var err = false; if (curState.context) { if (curState.context.tagName != tagName) { if (Kludges.implicitlyClosed.hasOwnProperty(curState.context.tagName.toLowerCase())) { popContext(); } err = !curState.context || curState.context.tagName != tagName; } } else { err = true; } if (err) setStyle = "error"; return cont(endclosetag(err)); } return cont(); } function endtag(startOfLine) { return function(type) { if (type == "selfcloseTag" || (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase()))) { maybePopContext(curState.tagName.toLowerCase()); return cont(); } if (type == "endTag") { maybePopContext(curState.tagName.toLowerCase()); pushContext(curState.tagName, startOfLine); return cont(); } return cont(); }; } function endclosetag(err) { return function(type) { if (err) setStyle = "error"; if (type == "endTag") { popContext(); return cont(); } setStyle = "error"; return cont(arguments.callee); }; } function maybePopContext(nextTagName) { var parentTagName; while (true) { if (!curState.context) { return; } parentTagName = curState.context.tagName.toLowerCase(); if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) || !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { return; } popContext(); } } function attributes(type) { if (type == "word") {setStyle = "attribute"; return cont(attribute, attributes);} if (type == "endTag" || type == "selfcloseTag") return pass(); setStyle = "error"; return cont(attributes); } function attribute(type) { if (type == "equals") return cont(attvalue, attributes); if (!Kludges.allowMissing) setStyle = "error"; return (type == "endTag" || type == "selfcloseTag") ? pass() : cont(); } function attvalue(type) { if (type == "string") return cont(attvaluemaybe); if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();} setStyle = "error"; return (type == "endTag" || type == "selfCloseTag") ? pass() : cont(); } function attvaluemaybe(type) { if (type == "string") return cont(attvaluemaybe); else return pass(); } return { startState: function() { return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null}; }, token: function(stream, state) { if (stream.sol()) { state.startOfLine = true; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; setStyle = type = tagName = null; var style = state.tokenize(stream, state); state.type = type; if ((style || type) && style != "comment") { curState = state; while (true) { var comb = state.cc.pop() || element; if (comb(type || style)) break; } } state.startOfLine = false; return setStyle || style; }, indent: function(state, textAfter, fullLine) { var context = state.context; if ((state.tokenize != inTag && state.tokenize != inText) || context && context.noIndent) return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; if (alignCDATA && /" character of a start tag has been typed. It can * also complete " * Contributed under the same license terms as CodeMirror. */ (function() { /** Option that allows tag closing behavior to be toggled. Default is true. */ CodeMirror.defaults['closeTagEnabled'] = true; /** Array of tag names to add indentation after the start tag for. Default is the list of block-level html tags. */ CodeMirror.defaults['closeTagIndent'] = ['applet', 'blockquote', 'body', 'button', 'div', 'dl', 'fieldset', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', 'iframe', 'layer', 'legend', 'object', 'ol', 'p', 'select', 'table', 'ul']; /** Array of tag names where an end tag is forbidden. */ CodeMirror.defaults['closeTagVoid'] = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr']; function innerState(cm, state) { return CodeMirror.innerMode(cm.getMode(), state).state; } /** * Call during key processing to close tags. Handles the key event if the tag is closed, otherwise throws CodeMirror.Pass. * - cm: The editor instance. * - ch: The character being processed. * - indent: Optional. An array of tag names to indent when closing. Omit or pass true to use the default indentation tag list defined in the 'closeTagIndent' option. * Pass false to disable indentation. Pass an array to override the default list of tag names. * - vd: Optional. An array of tag names that should not be closed. Omit to use the default void (end tag forbidden) tag list defined in the 'closeTagVoid' option. Ignored in xml mode. */ CodeMirror.defineExtension("closeTag", function(cm, ch, indent, vd) { if (!cm.getOption('closeTagEnabled')) { throw CodeMirror.Pass; } /* * Relevant structure of token: * * htmlmixed * className * state * htmlState * type * tagName * context * tagName * mode * * xml * className * state * tagName * type */ var pos = cm.getCursor(); var tok = cm.getTokenAt(pos); var state = innerState(cm, tok.state); if (state) { if (ch == '>') { var type = state.type; if (tok.className == 'tag' && type == 'closeTag') { throw CodeMirror.Pass; // Don't process the '>' at the end of an end-tag. } cm.replaceSelection('>'); // Mode state won't update until we finish the tag. pos = {line: pos.line, ch: pos.ch + 1}; cm.setCursor(pos); tok = cm.getTokenAt(cm.getCursor()); state = innerState(cm, tok.state); if (!state) throw CodeMirror.Pass; var type = state.type; if (tok.className == 'tag' && type != 'selfcloseTag') { var tagName = state.tagName; if (tagName.length > 0 && shouldClose(cm, vd, tagName)) { insertEndTag(cm, indent, pos, tagName); } return; } // Undo the '>' insert and allow cm to handle the key instead. cm.setSelection({line: pos.line, ch: pos.ch - 1}, pos); cm.replaceSelection(""); } else if (ch == '/') { if (tok.className == 'tag' && tok.string == '<') { var ctx = state.context, tagName = ctx ? ctx.tagName : ''; if (tagName.length > 0) { completeEndTag(cm, pos, tagName); return; } } } } throw CodeMirror.Pass; // Bubble if not handled }); function insertEndTag(cm, indent, pos, tagName) { if (shouldIndent(cm, indent, tagName)) { cm.replaceSelection('\n\n', 'end'); cm.indentLine(pos.line + 1); cm.indentLine(pos.line + 2); cm.setCursor({line: pos.line + 1, ch: cm.getLine(pos.line + 1).length}); } else { cm.replaceSelection(''); cm.setCursor(pos); } } function shouldIndent(cm, indent, tagName) { if (typeof indent == 'undefined' || indent == null || indent == true) { indent = cm.getOption('closeTagIndent'); } if (!indent) { indent = []; } return indexOf(indent, tagName.toLowerCase()) != -1; } function shouldClose(cm, vd, tagName) { if (cm.getOption('mode') == 'xml') { return true; // always close xml tags } if (typeof vd == 'undefined' || vd == null) { vd = cm.getOption('closeTagVoid'); } if (!vd) { vd = []; } return indexOf(vd, tagName.toLowerCase()) == -1; } // C&P from codemirror.js...would be nice if this were visible to utilities. function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } function completeEndTag(cm, pos, tagName) { cm.replaceSelection('/' + tagName + '>'); cm.setCursor({line: pos.line, ch: pos.ch + tagName.length + 2 }); } })(); dialog.css000066400000000000000000000007011315737174100445130ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util.CodeMirror-dialog { position: relative; } .CodeMirror-dialog > div { position: absolute; top: 0; left: 0; right: 0; background: white; border-bottom: 1px solid #eee; z-index: 15; padding: .1em .8em; overflow: hidden; color: #333; } .CodeMirror-dialog input { border: none; outline: none; background: transparent; width: 20em; color: inherit; font-family: monospace; } .CodeMirror-dialog button { font-size: 70%; }dialog.js000066400000000000000000000042441315737174100443450ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// Open simple dialogs on top of an editor. Relies on dialog.css. (function() { function dialogDiv(cm, template) { var wrap = cm.getWrapperElement(); var dialog = wrap.insertBefore(document.createElement("div"), wrap.firstChild); dialog.className = "CodeMirror-dialog"; dialog.innerHTML = '
      ' + template + '
      '; return dialog; } CodeMirror.defineExtension("openDialog", function(template, callback) { var dialog = dialogDiv(this, template); var closed = false, me = this; function close() { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); } var inp = dialog.getElementsByTagName("input")[0], button; if (inp) { CodeMirror.connect(inp, "keydown", function(e) { if (e.keyCode == 13 || e.keyCode == 27) { CodeMirror.e_stop(e); close(); me.focus(); if (e.keyCode == 13) callback(inp.value); } }); inp.focus(); CodeMirror.connect(inp, "blur", close); } else if (button = dialog.getElementsByTagName("button")[0]) { CodeMirror.connect(button, "click", function() { close(); me.focus(); }); button.focus(); CodeMirror.connect(button, "blur", close); } return close; }); CodeMirror.defineExtension("openConfirm", function(template, callbacks) { var dialog = dialogDiv(this, template); var buttons = dialog.getElementsByTagName("button"); var closed = false, me = this, blurring = 1; function close() { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); me.focus(); } buttons[0].focus(); for (var i = 0; i < buttons.length; ++i) { var b = buttons[i]; (function(callback) { CodeMirror.connect(b, "click", function(e) { CodeMirror.e_preventDefault(e); close(); if (callback) callback(me); }); })(callbacks[i]); CodeMirror.connect(b, "blur", function() { --blurring; setTimeout(function() { if (blurring <= 0) close(); }, 200); }); CodeMirror.connect(b, "focus", function() { ++blurring; }); } }); })(); foldcode.js000066400000000000000000000142441315737174100446660ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// the tagRangeFinder function is // Copyright (C) 2011 by Daniel Glazman // released under the MIT license (../../LICENSE) like the rest of CodeMirror CodeMirror.tagRangeFinder = function(cm, line, hideEnd) { var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; var xmlNAMERegExp = new RegExp("^[" + nameStartChar + "][" + nameChar + "]*"); var lineText = cm.getLine(line); var found = false; var tag = null; var pos = 0; while (!found) { pos = lineText.indexOf("<", pos); if (-1 == pos) // no tag on line return; if (pos + 1 < lineText.length && lineText[pos + 1] == "/") { // closing tag pos++; continue; } // ok we weem to have a start tag if (!lineText.substr(pos + 1).match(xmlNAMERegExp)) { // not a tag name... pos++; continue; } var gtPos = lineText.indexOf(">", pos + 1); if (-1 == gtPos) { // end of start tag not in line var l = line + 1; var foundGt = false; var lastLine = cm.lineCount(); while (l < lastLine && !foundGt) { var lt = cm.getLine(l); var gt = lt.indexOf(">"); if (-1 != gt) { // found a > foundGt = true; var slash = lt.lastIndexOf("/", gt); if (-1 != slash && slash < gt) { var str = lineText.substr(slash, gt - slash + 1); if (!str.match( /\/\s*\>/ )) { // yep, that's the end of empty tag if (hideEnd === true) l++; return l; } } } l++; } found = true; } else { var slashPos = lineText.lastIndexOf("/", gtPos); if (-1 == slashPos) { // cannot be empty tag found = true; // don't continue } else { // empty tag? // check if really empty tag var str = lineText.substr(slashPos, gtPos - slashPos + 1); if (!str.match( /\/\s*\>/ )) { // finally not empty found = true; // don't continue } } } if (found) { var subLine = lineText.substr(pos + 1); tag = subLine.match(xmlNAMERegExp); if (tag) { // we have an element name, wooohooo ! tag = tag[0]; // do we have the close tag on same line ??? if (-1 != lineText.indexOf("", pos)) // yep { found = false; } // we don't, so we have a candidate... } else found = false; } if (!found) pos++; } if (found) { var startTag = "(\\<\\/" + tag + "\\>)|(\\<" + tag + "\\>)|(\\<" + tag + "\\s)|(\\<" + tag + "$)"; var startTagRegExp = new RegExp(startTag, "g"); var endTag = ""; var depth = 1; var l = line + 1; var lastLine = cm.lineCount(); while (l < lastLine) { lineText = cm.getLine(l); var match = lineText.match(startTagRegExp); if (match) { for (var i = 0; i < match.length; i++) { if (match[i] == endTag) depth--; else depth++; if (!depth) { if (hideEnd === true) l++; return l; } } } l++; } return; } }; CodeMirror.braceRangeFinder = function(cm, line, hideEnd) { var lineText = cm.getLine(line), at = lineText.length, startChar, tokenType; for (;;) { var found = lineText.lastIndexOf("{", at); if (found < 0) break; tokenType = cm.getTokenAt({line: line, ch: found}).className; if (!/^(comment|string)/.test(tokenType)) { startChar = found; break; } at = found - 1; } if (startChar == null || lineText.lastIndexOf("}") > startChar) return; var count = 1, lastLine = cm.lineCount(), end; outer: for (var i = line + 1; i < lastLine; ++i) { var text = cm.getLine(i), pos = 0; for (;;) { var nextOpen = text.indexOf("{", pos), nextClose = text.indexOf("}", pos); if (nextOpen < 0) nextOpen = text.length; if (nextClose < 0) nextClose = text.length; pos = Math.min(nextOpen, nextClose); if (pos == text.length) break; if (cm.getTokenAt({line: i, ch: pos + 1}).className == tokenType) { if (pos == nextOpen) ++count; else if (!--count) { end = i; break outer; } } ++pos; } } if (end == null || end == line + 1) return; if (hideEnd === true) end++; return end; }; CodeMirror.indentRangeFinder = function(cm, line) { var tabSize = cm.getOption("tabSize"); var myIndent = cm.getLineHandle(line).indentation(tabSize), last; for (var i = line + 1, end = cm.lineCount(); i < end; ++i) { var handle = cm.getLineHandle(i); if (!/^\s*$/.test(handle.text)) { if (handle.indentation(tabSize) <= myIndent) break; last = i; } } if (!last) return null; return last + 1; }; CodeMirror.newFoldFunction = function(rangeFinder, markText, hideEnd) { var folded = []; if (markText == null) markText = '
      %N%'; function isFolded(cm, n) { for (var i = 0; i < folded.length; ++i) { var start = cm.lineInfo(folded[i].start); if (!start) folded.splice(i--, 1); else if (start.line == n) return {pos: i, region: folded[i]}; } } function expand(cm, region) { cm.clearMarker(region.start); for (var i = 0; i < region.hidden.length; ++i) cm.showLine(region.hidden[i]); } return function(cm, line) { cm.operation(function() { var known = isFolded(cm, line); if (known) { folded.splice(known.pos, 1); expand(cm, known.region); } else { var end = rangeFinder(cm, line, hideEnd); if (end == null) return; var hidden = []; for (var i = line + 1; i < end; ++i) { var handle = cm.hideLine(i); if (handle) hidden.push(handle); } var first = cm.setMarker(line, markText); var region = {start: first, hidden: hidden}; cm.onDeleteLine(first, function() { expand(cm, region); }); folded.push(region); } }); }; }; formatting.js000066400000000000000000000163341315737174100452630ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// ============== Formatting extensions ============================ (function() { // Define extensions for a few modes CodeMirror.extendMode("css", { commentStart: "/*", commentEnd: "*/", wordWrapChars: [";", "\\{", "\\}"], autoFormatLineBreaks: function (text) { return text.replace(new RegExp("(;|\\{|\\})([^\r\n])", "g"), "$1\n$2"); } }); function jsNonBreakableBlocks(text) { var nonBreakableRegexes = [/for\s*?\((.*?)\)/, /\"(.*?)(\"|$)/, /\'(.*?)(\'|$)/, /\/\*(.*?)(\*\/|$)/, /\/\/.*/]; var nonBreakableBlocks = []; for (var i = 0; i < nonBreakableRegexes.length; i++) { var curPos = 0; while (curPos < text.length) { var m = text.substr(curPos).match(nonBreakableRegexes[i]); if (m != null) { nonBreakableBlocks.push({ start: curPos + m.index, end: curPos + m.index + m[0].length }); curPos += m.index + Math.max(1, m[0].length); } else { // No more matches break; } } } nonBreakableBlocks.sort(function (a, b) { return a.start - b.start; }); return nonBreakableBlocks; } CodeMirror.extendMode("javascript", { commentStart: "/*", commentEnd: "*/", wordWrapChars: [";", "\\{", "\\}"], autoFormatLineBreaks: function (text) { var curPos = 0; var reLinesSplitter = /(;|\{|\})([^\r\n;])/g; var nonBreakableBlocks = jsNonBreakableBlocks(text); if (nonBreakableBlocks != null) { var res = ""; for (var i = 0; i < nonBreakableBlocks.length; i++) { if (nonBreakableBlocks[i].start > curPos) { // Break lines till the block res += text.substring(curPos, nonBreakableBlocks[i].start).replace(reLinesSplitter, "$1\n$2"); curPos = nonBreakableBlocks[i].start; } if (nonBreakableBlocks[i].start <= curPos && nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block res += text.substring(curPos, nonBreakableBlocks[i].end); curPos = nonBreakableBlocks[i].end; } } if (curPos < text.length) res += text.substr(curPos).replace(reLinesSplitter, "$1\n$2"); return res; } else { return text.replace(reLinesSplitter, "$1\n$2"); } } }); CodeMirror.extendMode("xml", { commentStart: "", wordWrapChars: [">"], autoFormatLineBreaks: function (text) { var lines = text.split("\n"); var reProcessedPortion = new RegExp("(^\\s*?<|^[^<]*?)(.+)(>\\s*?$|[^>]*?$)"); var reOpenBrackets = new RegExp("<", "g"); var reCloseBrackets = new RegExp("(>)([^\r\n])", "g"); for (var i = 0; i < lines.length; i++) { var mToProcess = lines[i].match(reProcessedPortion); if (mToProcess != null && mToProcess.length > 3) { // The line starts with whitespaces and ends with whitespaces lines[i] = mToProcess[1] + mToProcess[2].replace(reOpenBrackets, "\n$&").replace(reCloseBrackets, "$1\n$2") + mToProcess[3]; continue; } } return lines.join("\n"); } }); function localModeAt(cm, pos) { return CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(pos).state).mode; } function enumerateModesBetween(cm, line, start, end) { var outer = cm.getMode(), text = cm.getLine(line); if (end == null) end = text.length; if (!outer.innerMode) return [{from: start, to: end, mode: outer}]; var state = cm.getTokenAt({line: line, ch: start}).state; var mode = CodeMirror.innerMode(outer, state).mode; var found = [], stream = new CodeMirror.StringStream(text); stream.pos = stream.start = start; for (;;) { outer.token(stream, state); var curMode = CodeMirror.innerMode(outer, state).mode; if (curMode != mode) { var cut = stream.start; // Crappy heuristic to deal with the fact that a change in // mode can occur both at the end and the start of a token, // and we don't know which it was. if (mode.name == "xml" && text.charAt(stream.pos - 1) == ">") cut = stream.pos; found.push({from: start, to: cut, mode: mode}); start = cut; mode = curMode; } if (stream.pos >= end) break; stream.start = stream.pos; } if (start < end) found.push({from: start, to: end, mode: mode}); return found; } // Comment/uncomment the specified range CodeMirror.defineExtension("commentRange", function (isComment, from, to) { var curMode = localModeAt(this, from), cm = this; this.operation(function() { if (isComment) { // Comment range cm.replaceRange(curMode.commentEnd, to); cm.replaceRange(curMode.commentStart, from); if (from.line == to.line && from.ch == to.ch) // An empty comment inserted - put cursor inside cm.setCursor(from.line, from.ch + curMode.commentStart.length); } else { // Uncomment range var selText = cm.getRange(from, to); var startIndex = selText.indexOf(curMode.commentStart); var endIndex = selText.lastIndexOf(curMode.commentEnd); if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) { // Take string till comment start selText = selText.substr(0, startIndex) // From comment start till comment end + selText.substring(startIndex + curMode.commentStart.length, endIndex) // From comment end till string end + selText.substr(endIndex + curMode.commentEnd.length); } cm.replaceRange(selText, from, to); } }); }); // Applies automatic mode-aware indentation to the specified range CodeMirror.defineExtension("autoIndentRange", function (from, to) { var cmInstance = this; this.operation(function () { for (var i = from.line; i <= to.line; i++) { cmInstance.indentLine(i, "smart"); } }); }); // Applies automatic formatting to the specified range CodeMirror.defineExtension("autoFormatRange", function (from, to) { var cm = this; cm.operation(function () { for (var cur = from.line, end = to.line; cur <= end; ++cur) { var f = {line: cur, ch: cur == from.line ? from.ch : 0}; var t = {line: cur, ch: cur == end ? to.ch : null}; var modes = enumerateModesBetween(cm, cur, f.ch, t.ch), mangled = ""; var text = cm.getRange(f, t); for (var i = 0; i < modes.length; ++i) { var part = modes.length > 1 ? text.slice(modes[i].from, modes[i].to) : text; if (mangled) mangled += "\n"; if (modes[i].mode.autoFormatLineBreaks) { mangled += modes[i].mode.autoFormatLineBreaks(part); } else mangled += text; } if (mangled != text) { for (var count = 0, pos = mangled.indexOf("\n"); pos != -1; pos = mangled.indexOf("\n", pos + 1), ++count) {} cm.replaceRange(mangled, f, t); cur += count; end += count; } } for (var cur = from.line + 1; cur <= end; ++cur) cm.indentLine(cur, "smart"); cm.setSelection(from, cm.getCursor(false)); }); }); })(); javascript-hint.js000066400000000000000000000124141315737174100462120ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util(function () { function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) { return true; } } return false; } return arr.indexOf(item) != -1; } function scriptHint(editor, keywords, getToken) { // Find the token at the cursor var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token; // If it's not a 'word-style' token, ignore the token. if (!/^[\w$_]*$/.test(token.string)) { token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state, className: token.string == "." ? "property" : null}; } // If it is a property, find out what it is a property of. while (tprop.className == "property") { tprop = getToken(editor, {line: cur.line, ch: tprop.start}); if (tprop.string != ".") return; tprop = getToken(editor, {line: cur.line, ch: tprop.start}); if (tprop.string == ')') { var level = 1; do { tprop = getToken(editor, {line: cur.line, ch: tprop.start}); switch (tprop.string) { case ')': level++; break; case '(': level--; break; default: break; } } while (level > 0); tprop = getToken(editor, {line: cur.line, ch: tprop.start}); if (tprop.className == 'variable') tprop.className = 'function'; else return; // no clue } if (!context) var context = []; context.push(tprop); } return {list: getCompletions(token, context, keywords), from: {line: cur.line, ch: token.start}, to: {line: cur.line, ch: token.end}}; } CodeMirror.javascriptHint = function(editor) { return scriptHint(editor, javascriptKeywords, function (e, cur) {return e.getTokenAt(cur);}); }; function getCoffeeScriptToken(editor, cur) { // This getToken, it is for coffeescript, imitates the behavior of // getTokenAt method in javascript.js, that is, returning "property" // type and treat "." as indepenent token. var token = editor.getTokenAt(cur); if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { token.end = token.start; token.string = '.'; token.className = "property"; } else if (/^\.[\w$_]*$/.test(token.string)) { token.className = "property"; token.start++; token.string = token.string.replace(/\./, ''); } return token; } CodeMirror.coffeescriptHint = function(editor) { return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken); }; var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + "toUpperCase toLowerCase split concat match replace search").split(" "); var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); var funcProps = "prototype apply call bind".split(" "); var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + "if in instanceof new null return switch throw true try typeof var void while with").split(" "); var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); function getCompletions(token, context, keywords) { var found = [], start = token.string; function maybeAdd(str) { if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str); } function gatherCompletions(obj) { if (typeof obj == "string") forEach(stringProps, maybeAdd); else if (obj instanceof Array) forEach(arrayProps, maybeAdd); else if (obj instanceof Function) forEach(funcProps, maybeAdd); for (var name in obj) maybeAdd(name); } if (context) { // If this is a property, see if it belongs to some object we can // find in the current environment. var obj = context.pop(), base; if (obj.className == "variable") base = window[obj.string]; else if (obj.className == "string") base = ""; else if (obj.className == "atom") base = 1; else if (obj.className == "function") { if (window.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && (typeof window.jQuery == 'function')) base = window.jQuery(); else if (window._ != null && (obj.string == '_') && (typeof window._ == 'function')) base = window._(); } while (base != null && context.length) base = base[context.pop().string]; if (base != null) gatherCompletions(base); } else { // If not, just look in the window object and any local scope // (reading into JS mode internals to get at the local variables) for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); gatherCompletions(window); forEach(keywords, maybeAdd); } return found; } })(); loadmode.js000066400000000000000000000033731315737174100446740ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util(function() { if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; var loading = {}; function splitCallback(cont, n) { var countDown = n; return function() { if (--countDown == 0) cont(); }; } function ensureDeps(mode, cont) { var deps = CodeMirror.modes[mode].dependencies; if (!deps) return cont(); var missing = []; for (var i = 0; i < deps.length; ++i) { if (!CodeMirror.modes.hasOwnProperty(deps[i])) missing.push(deps[i]); } if (!missing.length) return cont(); var split = splitCallback(cont, missing.length); for (var i = 0; i < missing.length; ++i) CodeMirror.requireMode(missing[i], split); } CodeMirror.requireMode = function(mode, cont) { if (typeof mode != "string") mode = mode.name; if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); var script = document.createElement("script"); script.src = CodeMirror.modeURL.replace(/%N/g, mode); var others = document.getElementsByTagName("script")[0]; others.parentNode.insertBefore(script, others); var list = loading[mode] = [cont]; var count = 0, poll = setInterval(function() { if (++count > 100) return clearInterval(poll); if (CodeMirror.modes.hasOwnProperty(mode)) { clearInterval(poll); loading[mode] = null; ensureDeps(mode, function() { for (var i = 0; i < list.length; ++i) list[i](); }); } }, 200); }; CodeMirror.autoLoadMode = function(instance, mode) { if (!CodeMirror.modes.hasOwnProperty(mode)) CodeMirror.requireMode(mode, function() { instance.setOption("mode", instance.getOption("mode")); }); }; }()); match-highlighter.js000066400000000000000000000032221315737174100464710ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// Define match-highlighter commands. Depends on searchcursor.js // Use by attaching the following function call to the onCursorActivity event: //myCodeMirror.matchHighlight(minChars); // And including a special span.CodeMirror-matchhighlight css class (also optionally a separate one for .CodeMirror-focused -- see demo matchhighlighter.html) (function() { var DEFAULT_MIN_CHARS = 2; function MatchHighlightState() { this.marked = []; } function getMatchHighlightState(cm) { return cm._matchHighlightState || (cm._matchHighlightState = new MatchHighlightState()); } function clearMarks(cm) { var state = getMatchHighlightState(cm); for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); state.marked = []; } function markDocument(cm, className, minChars) { clearMarks(cm); minChars = (typeof minChars !== 'undefined' ? minChars : DEFAULT_MIN_CHARS); if (cm.somethingSelected() && cm.getSelection().replace(/^\s+|\s+$/g, "").length >= minChars) { var state = getMatchHighlightState(cm); var query = cm.getSelection(); cm.operation(function() { if (cm.lineCount() < 2000) { // This is too expensive on big documents. for (var cursor = cm.getSearchCursor(query); cursor.findNext();) { //Only apply matchhighlight to the matches other than the one actually selected if (!(cursor.from().line === cm.getCursor(true).line && cursor.from().ch === cm.getCursor(true).ch)) state.marked.push(cm.markText(cursor.from(), cursor.to(), className)); } } }); } } CodeMirror.defineExtension("matchHighlight", function(className, minChars) { markDocument(this, className, minChars); }); })(); multiplex.js000066400000000000000000000054621315737174100451340ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/utilCodeMirror.multiplexingMode = function(outer /*, others */) { // Others should be {open, close, mode [, delimStyle]} objects var others = Array.prototype.slice.call(arguments, 1); var n_others = others.length; function indexOf(string, pattern, from) { if (typeof pattern == "string") return string.indexOf(pattern, from); var m = pattern.exec(from ? string.slice(from) : string); return m ? m.index + from : -1; } return { startState: function() { return { outer: CodeMirror.startState(outer), innerActive: null, inner: null }; }, copyState: function(state) { return { outer: CodeMirror.copyState(outer, state.outer), innerActive: state.innerActive, inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) }; }, token: function(stream, state) { if (!state.innerActive) { var cutOff = Infinity, oldContent = stream.string; for (var i = 0; i < n_others; ++i) { var other = others[i]; var found = indexOf(oldContent, other.open, stream.pos); if (found == stream.pos) { stream.match(other.open); state.innerActive = other; state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); return other.delimStyle; } else if (found != -1 && found < cutOff) { cutOff = found; } } if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); var outerToken = outer.token(stream, state.outer); if (cutOff != Infinity) stream.string = oldContent; return outerToken; } else { var curInner = state.innerActive, oldContent = stream.string; var found = indexOf(oldContent, curInner.close, stream.pos); if (found == stream.pos) { stream.match(curInner.close); state.innerActive = state.inner = null; return curInner.delimStyle; } if (found > -1) stream.string = oldContent.slice(0, found); var innerToken = curInner.mode.token(stream, state.inner); if (found > -1) stream.string = oldContent; var cur = stream.current(), found = cur.indexOf(curInner.close); if (found > -1) stream.backUp(cur.length - found); return innerToken; } }, indent: function(state, textAfter) { var mode = state.innerActive ? state.innerActive.mode : outer; if (!mode.indent) return CodeMirror.Pass; return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); }, electricChars: outer.electricChars, innerMode: function(state) { return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; } }; }; overlay.js000066400000000000000000000042121315737174100445620ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// Utility function that allows modes to be combined. The mode given // as the base argument takes care of most of the normal mode // functionality, but a second (typically simple) mode is used, which // can override the style of text. Both modes get to parse all of the // text, but when both assign a non-null style to a piece of code, the // overlay wins, unless the combine argument was true, in which case // the styles are combined. // overlayParser is the old, deprecated name CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, combine) { return { startState: function() { return { base: CodeMirror.startState(base), overlay: CodeMirror.startState(overlay), basePos: 0, baseCur: null, overlayPos: 0, overlayCur: null }; }, copyState: function(state) { return { base: CodeMirror.copyState(base, state.base), overlay: CodeMirror.copyState(overlay, state.overlay), basePos: state.basePos, baseCur: null, overlayPos: state.overlayPos, overlayCur: null }; }, token: function(stream, state) { if (stream.start == state.basePos) { state.baseCur = base.token(stream, state.base); state.basePos = stream.pos; } if (stream.start == state.overlayPos) { stream.pos = stream.start; state.overlayCur = overlay.token(stream, state.overlay); state.overlayPos = stream.pos; } stream.pos = Math.min(state.basePos, state.overlayPos); if (stream.eol()) state.basePos = state.overlayPos = 0; if (state.overlayCur == null) return state.baseCur; if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur; else return state.overlayCur; }, indent: base.indent && function(state, textAfter) { return base.indent(state.base, textAfter); }, electricChars: base.electricChars, innerMode: function(state) { return {state: state.base, mode: base}; }, blankLine: function(state) { if (base.blankLine) base.blankLine(state.base); if (overlay.blankLine) overlay.blankLine(state.overlay); } }; }; pig-hint.js000066400000000000000000000121301315737174100446160ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util(function () { function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) { return true; } } return false; } return arr.indexOf(item) != -1; } function scriptHint(editor, keywords, getToken) { // Find the token at the cursor var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token; // If it's not a 'word-style' token, ignore the token. if (!/^[\w$_]*$/.test(token.string)) { token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state, className: token.string == ":" ? "pig-type" : null}; } if (!context) var context = []; context.push(tprop); var completionList = getCompletions(token, context); completionList = completionList.sort(); //prevent autocomplete for last word, instead show dropdown with one word if(completionList.length == 1) { completionList.push(" "); } return {list: completionList, from: {line: cur.line, ch: token.start}, to: {line: cur.line, ch: token.end}}; } CodeMirror.pigHint = function(editor) { return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);}); }; function toTitleCase(str) { return str.replace(/(?:^|\s)\w/g, function(match) { return match.toUpperCase(); }); } var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + "NEQ MATCHES TRUE FALSE"; var pigKeywordsU = pigKeywords.split(" "); var pigKeywordsL = pigKeywords.toLowerCase().split(" "); var pigTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP"; var pigTypesU = pigTypes.split(" "); var pigTypesL = pigTypes.toLowerCase().split(" "); var pigBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER"; var pigBuiltinsU = pigBuiltins.split(" ").join("() ").split(" "); var pigBuiltinsL = pigBuiltins.toLowerCase().split(" ").join("() ").split(" "); var pigBuiltinsC = ("BagSize BinStorage Bloom BuildBloom ConstantSize CubeDimensions DoubleAbs " + "DoubleAvg DoubleBase DoubleMax DoubleMin DoubleRound DoubleSum FloatAbs FloatAvg FloatMax " + "FloatMin FloatRound FloatSum GenericInvoker IntAbs IntAvg IntMax IntMin IntSum " + "InvokeForDouble InvokeForFloat InvokeForInt InvokeForLong InvokeForString Invoker " + "IsEmpty JsonLoader JsonMetadata JsonStorage LongAbs LongAvg LongMax LongMin LongSum MapSize " + "MonitoredUDF Nondeterministic OutputSchema PigStorage PigStreaming StringConcat StringMax " + "StringMin StringSize TextLoader TupleSize Utf8StorageConverter").split(" ").join("() ").split(" "); function getCompletions(token, context) { var found = [], start = token.string; function maybeAdd(str) { if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str); } function gatherCompletions(obj) { if(obj == ":") { forEach(pigTypesL, maybeAdd); } else { forEach(pigBuiltinsU, maybeAdd); forEach(pigBuiltinsL, maybeAdd); forEach(pigBuiltinsC, maybeAdd); forEach(pigTypesU, maybeAdd); forEach(pigTypesL, maybeAdd); forEach(pigKeywordsU, maybeAdd); forEach(pigKeywordsL, maybeAdd); } } if (context) { // If this is a property, see if it belongs to some object we can // find in the current environment. var obj = context.pop(), base; if (obj.className == "pig-word") base = obj.string; else if(obj.className == "pig-type") base = ":" + obj.string; while (base != null && context.length) base = base[context.pop().string]; if (base != null) gatherCompletions(base); } return found; } })(); runmode-standalone.js000066400000000000000000000061561315737174100467110ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util/* Just enough of CodeMirror to run runMode under node.js */ function splitLines(string){ return string.split(/\r?\n|\r/); }; function StringStream(string) { this.pos = this.start = 0; this.string = string; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == 0;}, peek: function() {return this.string.charAt(this.pos) || null;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() {return this.start;}, indentation: function() {return 0;}, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { function cased(str) {return caseInsensitive ? str.toLowerCase() : str;} if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);} }; exports.StringStream = StringStream; exports.startState = function(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; }; var modes = exports.modes = {}, mimeModes = exports.mimeModes = {}; exports.defineMode = function(name, mode) { modes[name] = mode; }; exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; exports.getMode = function(options, spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) spec = mimeModes[spec]; if (typeof spec == "string") var mname = spec, config = {}; else if (spec != null) var mname = spec.name, config = spec; var mfactory = modes[mname]; if (!mfactory) throw new Error("Unknown mode: " + spec); return mfactory(options, config || {}); }; exports.runMode = function(string, modespec, callback) { var mode = exports.getMode({indentUnit: 2}, modespec); var lines = splitLines(string), state = exports.startState(mode); for (var i = 0, e = lines.length; i < e; ++i) { if (i) callback("\n"); var stream = new exports.StringStream(lines[i]); while (!stream.eol()) { var style = mode.token(stream, state); callback(stream.current(), style, i, stream.start); stream.start = stream.pos; } } }; runmode.js000066400000000000000000000032111315737174100445500ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/utilCodeMirror.runMode = function(string, modespec, callback, options) { function esc(str) { return str.replace(/[<&]/g, function(ch) { return ch == "<" ? "<" : "&"; }); } var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); var isNode = callback.nodeType == 1; var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; if (isNode) { var node = callback, accum = [], col = 0; callback = function(text, style) { if (text == "\n") { accum.push("
      "); col = 0; return; } var escaped = ""; // HTML-escape and replace tabs for (var pos = 0;;) { var idx = text.indexOf("\t", pos); if (idx == -1) { escaped += esc(text.slice(pos)); col += text.length - pos; break; } else { col += idx - pos; escaped += esc(text.slice(pos, idx)); var size = tabSize - col % tabSize; col += size; for (var i = 0; i < size; ++i) escaped += " "; pos = idx + 1; } } if (style) accum.push("" + escaped + ""); else accum.push(escaped); }; } var lines = CodeMirror.splitLines(string), state = CodeMirror.startState(mode); for (var i = 0, e = lines.length; i < e; ++i) { if (i) callback("\n"); var stream = new CodeMirror.StringStream(lines[i]); while (!stream.eol()) { var style = mode.token(stream, state); callback(stream.current(), style, i, stream.start); stream.start = stream.pos; } } if (isNode) node.innerHTML = accum.join(""); }; search.js000066400000000000000000000117141315737174100443530ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util// Define search commands. Depends on dialog.js or another // implementation of the openDialog method. // Replace works a little oddly -- it will do the replace on the next // Ctrl-G (or whatever is bound to findNext) press. You prevent a // replace by making sure the match is no longer selected when hitting // Ctrl-G. (function() { function SearchState() { this.posFrom = this.posTo = this.query = null; this.marked = []; } function getSearchState(cm) { return cm._searchState || (cm._searchState = new SearchState()); } function getSearchCursor(cm, query, pos) { // Heuristic: if the query string is all lowercase, do a case insensitive search. return cm.getSearchCursor(query, pos, typeof query == "string" && query == query.toLowerCase()); } function dialog(cm, text, shortText, f) { if (cm.openDialog) cm.openDialog(text, f); else f(prompt(shortText, "")); } function confirmDialog(cm, text, shortText, fs) { if (cm.openConfirm) cm.openConfirm(text, fs); else if (confirm(shortText)) fs[0](); } function parseQuery(query) { var isRE = query.match(/^\/(.*)\/([a-z]*)$/); return isRE ? new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i") : query; } var queryDialog = 'Search: (Use /re/ syntax for regexp search)'; function doSearch(cm, rev) { var state = getSearchState(cm); if (state.query) return findNext(cm, rev); dialog(cm, queryDialog, "Search for:", function(query) { cm.operation(function() { if (!query || state.query) return; state.query = parseQuery(query); if (cm.lineCount() < 2000) { // This is too expensive on big documents. for (var cursor = getSearchCursor(cm, state.query); cursor.findNext();) state.marked.push(cm.markText(cursor.from(), cursor.to(), "CodeMirror-searching")); } state.posFrom = state.posTo = cm.getCursor(); findNext(cm, rev); }); }); } function findNext(cm, rev) {cm.operation(function() { var state = getSearchState(cm); var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); if (!cursor.find(rev)) { cursor = getSearchCursor(cm, state.query, rev ? {line: cm.lineCount() - 1} : {line: 0, ch: 0}); if (!cursor.find(rev)) return; } cm.setSelection(cursor.from(), cursor.to()); state.posFrom = cursor.from(); state.posTo = cursor.to(); });} function clearSearch(cm) {cm.operation(function() { var state = getSearchState(cm); if (!state.query) return; state.query = null; for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); state.marked.length = 0; });} var replaceQueryDialog = 'Replace: (Use /re/ syntax for regexp search)'; var replacementQueryDialog = 'With: '; var doReplaceConfirm = "Replace? "; function replace(cm, all) { dialog(cm, replaceQueryDialog, "Replace:", function(query) { if (!query) return; query = parseQuery(query); dialog(cm, replacementQueryDialog, "Replace with:", function(text) { if (all) { cm.compoundChange(function() { cm.operation(function() { for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { if (typeof query != "string") { var match = cm.getRange(cursor.from(), cursor.to()).match(query); cursor.replace(text.replace(/\$(\d)/, function(w, i) {return match[i];})); } else cursor.replace(text); } });}); } else { clearSearch(cm); var cursor = getSearchCursor(cm, query, cm.getCursor()); function advance() { var start = cursor.from(), match; if (!(match = cursor.findNext())) { cursor = getSearchCursor(cm, query); if (!(match = cursor.findNext()) || (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; } cm.setSelection(cursor.from(), cursor.to()); confirmDialog(cm, doReplaceConfirm, "Replace?", [function() {doReplace(match);}, advance]); } function doReplace(match) { cursor.replace(typeof query == "string" ? text : text.replace(/\$(\d)/, function(w, i) {return match[i];})); advance(); } advance(); } }); }); } CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; CodeMirror.commands.findNext = doSearch; CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; CodeMirror.commands.clearSearch = clearSearch; CodeMirror.commands.replace = replace; CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; })(); searchcursor.js000066400000000000000000000112761315737174100456140ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util(function(){ function SearchCursor(cm, query, pos, caseFold) { this.atOccurrence = false; this.cm = cm; if (caseFold == null && typeof query == "string") caseFold = false; pos = pos ? cm.clipPos(pos) : {line: 0, ch: 0}; this.pos = {from: pos, to: pos}; // The matches method is filled in based on the type of query. // It takes a position and a direction, and returns an object // describing the next occurrence of the query, or null if no // more matches were found. if (typeof query != "string") { // Regexp match if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); this.matches = function(reverse, pos) { if (reverse) { query.lastIndex = 0; var line = cm.getLine(pos.line).slice(0, pos.ch), match = query.exec(line), start = 0; while (match) { start += match.index + 1; line = line.slice(start); query.lastIndex = 0; var newmatch = query.exec(line); if (newmatch) match = newmatch; else break; } start--; } else { query.lastIndex = pos.ch; var line = cm.getLine(pos.line), match = query.exec(line), start = match && match.index; } if (match) return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: start + match[0].length}, match: match}; }; } else { // String query if (caseFold) query = query.toLowerCase(); var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; var target = query.split("\n"); // Different methods for single-line and multi-line queries if (target.length == 1) this.matches = function(reverse, pos) { var line = fold(cm.getLine(pos.line)), len = query.length, match; if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1) : (match = line.indexOf(query, pos.ch)) != -1) return {from: {line: pos.line, ch: match}, to: {line: pos.line, ch: match + len}}; }; else this.matches = function(reverse, pos) { var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(cm.getLine(ln)); var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match)); if (reverse ? offsetA >= pos.ch || offsetA != match.length : offsetA <= pos.ch || offsetA != line.length - match.length) return; for (;;) { if (reverse ? !ln : ln == cm.lineCount() - 1) return; line = fold(cm.getLine(ln += reverse ? -1 : 1)); match = target[reverse ? --idx : ++idx]; if (idx > 0 && idx < target.length - 1) { if (line != match) return; else continue; } var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length); if (reverse ? offsetB != line.length - match.length : offsetB != match.length) return; var start = {line: pos.line, ch: offsetA}, end = {line: ln, ch: offsetB}; return {from: reverse ? end : start, to: reverse ? start : end}; } }; } } SearchCursor.prototype = { findNext: function() {return this.find(false);}, findPrevious: function() {return this.find(true);}, find: function(reverse) { var self = this, pos = this.cm.clipPos(reverse ? this.pos.from : this.pos.to); function savePosAndFail(line) { var pos = {line: line, ch: 0}; self.pos = {from: pos, to: pos}; self.atOccurrence = false; return false; } for (;;) { if (this.pos = this.matches(reverse, pos)) { this.atOccurrence = true; return this.pos.match || true; } if (reverse) { if (!pos.line) return savePosAndFail(0); pos = {line: pos.line-1, ch: this.cm.getLine(pos.line-1).length}; } else { var maxLine = this.cm.lineCount(); if (pos.line == maxLine - 1) return savePosAndFail(maxLine); pos = {line: pos.line+1, ch: 0}; } } }, from: function() {if (this.atOccurrence) return this.pos.from;}, to: function() {if (this.atOccurrence) return this.pos.to;}, replace: function(newText) { var self = this; if (this.atOccurrence) self.pos.to = this.cm.replaceRange(newText, self.pos.from, self.pos.to); } }; CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { return new SearchCursor(this, query, pos, caseFold); }); })(); simple-hint.css000066400000000000000000000005601315737174100455100ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util.CodeMirror-completions { position: absolute; z-index: 10; overflow: hidden; -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0,0,0,.2); } .CodeMirror-completions select { background: #fafafa; outline: none; border: none; padding: 0; margin: 0; font-family: monospace; } simple-hint.js000066400000000000000000000102611315737174100453330ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util(function() { CodeMirror.simpleHint = function(editor, getHints, givenOptions) { // Determine effective options based on given values and defaults. var options = {}, defaults = CodeMirror.simpleHint.defaults; for (var opt in defaults) if (defaults.hasOwnProperty(opt)) options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt]; function collectHints(previousToken) { // We want a single cursor position. if (editor.somethingSelected()) return; var tempToken = editor.getTokenAt(editor.getCursor()); // Don't show completions if token has changed and the option is set. if (options.closeOnTokenChange && previousToken != null && (tempToken.start != previousToken.start || tempToken.className != previousToken.className)) { return; } var result = getHints(editor); if (!result || !result.list.length) return; var completions = result.list; function insert(str) { editor.replaceRange(str, result.from, result.to); } // When there is only one completion, use it directly. if (options.completeSingle && completions.length == 1) { insert(completions[0]); return true; } // Build the select widget var complete = document.createElement("div"); complete.className = "CodeMirror-completions"; var sel = complete.appendChild(document.createElement("select")); // Opera doesn't move the selection when pressing up/down in a // multi-select, but it does properly support the size property on // single-selects, so no multi-select is necessary. if (!window.opera) sel.multiple = true; for (var i = 0; i < completions.length; ++i) { var opt = sel.appendChild(document.createElement("option")); opt.appendChild(document.createTextNode(completions[i])); } sel.firstChild.selected = true; sel.size = Math.min(10, completions.length); var pos = options.alignWithWord ? editor.charCoords(result.from) : editor.cursorCoords(); complete.style.left = pos.x + "px"; complete.style.top = pos.yBot + "px"; document.body.appendChild(complete); // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); if(winW - pos.x < sel.clientWidth) complete.style.left = (pos.x - sel.clientWidth) + "px"; // Hack to hide the scrollbar. if (completions.length <= 10) complete.style.width = (sel.clientWidth - 1) + "px"; var done = false; function close() { if (done) return; done = true; complete.parentNode.removeChild(complete); } function pick() { insert(completions[sel.selectedIndex]); close(); setTimeout(function(){editor.focus();}, 50); } CodeMirror.connect(sel, "blur", close); CodeMirror.connect(sel, "keydown", function(event) { var code = event.keyCode; // Enter if (code == 13) {CodeMirror.e_stop(event); pick();} // Escape else if (code == 27) {CodeMirror.e_stop(event); close(); editor.focus();} else if (code != 38 && code != 40 && code != 33 && code != 34 && !CodeMirror.isModifierKey(event)) { close(); editor.focus(); // Pass the event to the CodeMirror instance so that it can handle things like backspace properly. editor.triggerOnKeyDown(event); // Don't show completions if the code is backspace and the option is set. if (!options.closeOnBackspace || code != 8) { setTimeout(function(){collectHints(tempToken);}, 50); } } }); CodeMirror.connect(sel, "dblclick", pick); sel.focus(); // Opera sometimes ignores focusing a freshly created node if (window.opera) setTimeout(function(){if (!done) sel.focus();}, 100); return true; } return collectHints(); }; CodeMirror.simpleHint.defaults = { closeOnBackspace: true, closeOnTokenChange: false, completeSingle: true, alignWithWord: true }; })(); xml-hint.js000066400000000000000000000066771315737174100446620ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/codemirror/util (function() { CodeMirror.xmlHints = []; CodeMirror.xmlHint = function(cm, simbol) { if(simbol.length > 0) { var cursor = cm.getCursor(); cm.replaceSelection(simbol); cursor = {line: cursor.line, ch: cursor.ch + 1}; cm.setCursor(cursor); } // dirty hack for simple-hint to receive getHint event on space var getTokenAt = editor.getTokenAt; editor.getTokenAt = function() { return 'disabled'; }; CodeMirror.simpleHint(cm, getHint); editor.getTokenAt = getTokenAt; }; var getHint = function(cm) { var cursor = cm.getCursor(); if (cursor.ch > 0) { var text = cm.getRange({line: 0, ch: 0}, cursor); var typed = ''; var simbol = ''; for(var i = text.length - 1; i >= 0; i--) { if(text[i] == ' ' || text[i] == '<') { simbol = text[i]; break; } else { typed = text[i] + typed; } } text = text.slice(0, text.length - typed.length); var path = getActiveElement(cm, text) + simbol; var hints = CodeMirror.xmlHints[path]; if(typeof hints === 'undefined') hints = ['']; else { hints = hints.slice(0); for (var i = hints.length - 1; i >= 0; i--) { if(hints[i].indexOf(typed) != 0) hints.splice(i, 1); } } return { list: hints, from: { line: cursor.line, ch: cursor.ch - typed.length }, to: cursor }; }; }; var getActiveElement = function(codeMirror, text) { var element = ''; if(text.length >= 0) { var regex = new RegExp('<([^!?][^\\s/>]*).*?>', 'g'); var matches = []; var match; while ((match = regex.exec(text)) != null) { matches.push({ tag: match[1], selfclose: (match[0].slice(match[0].length - 2) === '/>') }); } for (var i = matches.length - 1, skip = 0; i >= 0; i--) { var item = matches[i]; if (item.tag[0] == '/') { skip++; } else if (item.selfclose == false) { if (skip > 0) { skip--; } else { element = '<' + item.tag + '>' + element; } } } element += getOpenTag(text); } return element; }; var getOpenTag = function(text) { var open = text.lastIndexOf('<'); var close = text.lastIndexOf('>'); if (close < open) { text = text.slice(open); if(text != '<') { var space = text.indexOf(' '); if(space < 0) space = text.indexOf('\t'); if(space < 0) space = text.indexOf('\n'); if (space < 0) space = text.length; return text.slice(0, space); } } return ''; }; })(); jquery-1.11.0.min.js000066400000000000000000002741751315737174100426150ustar00rootroot00000000000000pgcharts/web/highcharts/exporting-server/java/highcharts-export/highcharts-export-web/src/main/webapp/resources/lib/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
      ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f }}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
      a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:l.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("