.gitignore000066400000000000000000000004331516076205000130500ustar00rootroot00000000000000cache/ vendor/ build/ *.diff *.err *.orig *.log *.rej *.swo *.swp *.zip *.vi *~ *.sass-cache .DS_Store ._* Thumbs.db .cache .project .settings .tmproj *.esproj nbproject *.sublime-project *.sublime-workspace .hg .svn .CVS .idea node_modules config.ini cache.properties composer.phar .htaccess000066400000000000000000000003361516076205000126600ustar00rootroot00000000000000 Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] order allow,deny deny from all .travis.yml000066400000000000000000000002341516076205000131700ustar00rootroot00000000000000language: php before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev php: - 5.3 - 5.4 script: phpunit INSTALL.md000066400000000000000000000037031516076205000125130ustar00rootroot00000000000000# GitList Installation * Download GitList from [gitlist.org](http://gitlist.org/) and decompress to your `/var/www/gitlist` folder, or anywhere else you want to place GitList. * Rename the `config.ini-example` file to `config.ini`. * Open up the `config.ini` and configure your installation. You'll have to provide where your repositories are located and the base GitList URL (in our case, http://localhost/gitlist). * Create the cache folder and give read/write permissions to your web server user: ``` cd /var/www/gitlist mkdir cache chmod 777 cache ``` That's it, installation complete! ## Webserver configuration Apache is the "default" webserver for GitList. You will find the configuration inside the `.htaccess` file. However, nginx and lighttpd are also supported. ### nginx server.conf ``` server { server_name MYSERVER; access_log /var/log/nginx/MYSERVER.access_log main; error_log /var/log/nginx/MYSERVER.error_log debug_http; root /var/www/DIR; index index.php; # auth_basic "Restricted"; # auth_basic_user_file rhtpasswd; location = /robots.txt { allow all; log_not_found off; access_log off; } location ~* ^/index.php.*$ { fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; } location / { try_files $uri @gitlist; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { add_header Vary "Accept-Encoding"; expires max; try_files $uri @gitlist; tcp_nodelay off; tcp_nopush on; } # location ~* \.(git|svn|patch|htaccess|log|route|plist|inc|json|pl|po|sh|ini|sample|kdev4)$ { # deny all; # } location @gitlist { rewrite ^/.*$ /index.php; } } ``` ### lighttpd ``` # GitList is located in /var/www/gitlist server.document-root = "/var/www" url.rewrite-once = ( "^/gitlist/web/.+" => "$0", "^/gitlist/favicon\.ico$" => "$0", "^/gitlist(/[^\?]*)(\?.*)?" => "/gitlist/index.php$1$2" ) ```LICENSE.txt000066400000000000000000000027051516076205000127070ustar00rootroot00000000000000Copyright (c) 2012, Klaus Silveira and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of GitList nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. README.md000066400000000000000000000120341516076205000123370ustar00rootroot00000000000000# GitList: an elegant and modern git repository viewer [![Build Status](https://secure.travis-ci.org/klaussilveira/gitlist.png)](http://travis-ci.org/klaussilveira/gitlist) GitList is an elegant and modern web interface for interacting with multiple git repositories. It allows you to browse repositories using your favorite browser, viewing files under different revisions, commit history, diffs. It also generates RSS feeds for each repository, allowing you to stay up-to-date with the latest changes anytime, anywhere. GitList was written in PHP, on top of the [Silex](http://silex.sensiolabs.org/) microframework and powered by the Twig template engine. This means that GitList is easy to install and easy to customize. Also, the GitList gorgeous interface was made possible due to [Bootstrap](http://twitter.github.com/bootstrap/). ## Features * Multiple repository support * Multiple branch support * Multiple tag support * Commit history, blame, diff * RSS feeds * Syntax highlighting * Repository statistics ## Screenshots [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th1.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/1.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th2.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/2.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th3.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/3.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th4.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/4.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th5.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/5.jpg) You can also see a live demo [here](http://git.gofedora.com). ## Authors and contributors * [Klaus Silveira](http://www.klaussilveira.com) (Creator, developer) ## License [New BSD license](http://www.opensource.org/licenses/bsd-license.php) ## Todo * improve the current test code coverage * test the interface * error handling can be greatly improved during parsing * submodule support * multilanguage support ## Requirements In order to run GitList on your server, you'll need: * git * Apache with mod_rewrite enabled or nginx * PHP 5.3.3 ## Installing * Download GitList from [gitlist.org](http://gitlist.org/) and decompress to your `/var/www/gitlist` folder, or anywhere else you want to place GitList. * Rename the `config.ini-example` file to `config.ini`. * Open up the `config.ini` and configure your installation. You'll have to provide where your repositories are located and the base GitList URL (in our case, http://localhost/gitlist). * Create the cache folder and give read/write permissions to your web server user: ``` cd /var/www/gitlist mkdir cache chmod 777 cache ``` That's it, installation complete! If you're having problems, check this [tutorial](http://gofedora.com/insanely-awesome-web-interface-git-repos/) by Kulbir Saini or the [Troubleshooting](https://github.com/klaussilveira/gitlist/wiki/Troubleshooting) page. ## Building GitList uses [Composer](http://getcomposer.org/) to manage dependencies and [Ant](http://ant.apache.org/) to build the project. In order to run all the targets in the build script, you will need [PHPUnit](http://www.phpunit.de/), [phpcpd](https://github.com/sebastianbergmann/phpcpd), [phploc](https://github.com/sebastianbergmann/phploc), [PHPMD](http://phpmd.org/) and [PHP_Depend](http://pdepend.org). Once you have all the dependencies set, you can clone the repository and run Ant: ``` git clone https://github.com/klaussilveira/gitlist.git ant ``` If you just want to get the project dependencies, instead of building everything: ``` git clone https://github.com/klaussilveira/gitlist.git curl -s http://getcomposer.org/installer | php php composer.phar install ``` If you have Composer in your path, things get easier. But you know the drill. ## Contributing If you are a developer, we need your help. GitList is a young project and we have lot's of stuff to do. Some developers are contributing with new features, others with bug fixes. But you can also dedicate yourself to refactoring the current codebase and improving what we already have. This is very important, we want GitList to be a state-of-the-art application, and we need your help for that. * Stay tuned to possible bugs, suboptimal code, duplicated code, overcomplicated expressions and unused code with [PHPMD](http://ci.gitlist.org:8080/job/GitList%20\(master\)/9/pmdResult/?) in our CI server * Try to fix any [violations](http://ci.gitlist.org:8080/job/GitList%20\(master\)/violations/) reported * Improve the [test coverage](http://ci.gitlist.org:8080/job/GitList%20\(master\)/9/cloverphp-report/) by creating unit and functional tests ## Further information If you want to know more about customizing GitList, check the [Customization](https://github.com/klaussilveira/gitlist/wiki/Customizing) page on the wiki. Also, if you're having problems with GitList, check the [Troubleshooting](https://github.com/klaussilveira/gitlist/wiki/Troubleshooting) page. Don't forget to report issues and suggest new features! :) boot.php000066400000000000000000000010651516076205000125360ustar00rootroot00000000000000set('git', 'repositories', rtrim($config->get('git', 'repositories'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR); // Startup and configure Silex application $app = new GitList\Application($config, __DIR__); // Mount the controllers $app->mount('', new GitList\Controller\MainController()); $app->mount('', new GitList\Controller\BlobController()); $app->mount('', new GitList\Controller\CommitController()); $app->mount('', new GitList\Controller\TreeController()); return $app; build.xml000066400000000000000000000064631516076205000127120ustar00rootroot00000000000000 cache/000077500000000000000000000000001516076205000121235ustar00rootroot00000000000000cache/.gitkeep000066400000000000000000000000001516076205000135420ustar00rootroot00000000000000composer.json000066400000000000000000000006601516076205000136040ustar00rootroot00000000000000{ "require": { "silex/silex": "1.0.*", "twig/twig": "1.9.*", "symfony/twig-bridge": "2.1.*", "symfony/filesystem": "2.1.*", "klaussilveira/gitter": "0.1.1" }, "require-dev": { "symfony/browser-kit": "2.1.*", "symfony/css-selector": "2.1.*" }, "minimum-stability": "dev", "autoload": { "psr-0": { "GitList": "src/" } } } composer.lock000066400000000000000000000620201516076205000135610ustar00rootroot00000000000000{ "hash": "b7ee6754cba1641ef8c2b01dfdd977fd", "packages": [ { "name": "klaussilveira/gitter", "version": "0.1.1", "source": { "type": "git", "url": "https://github.com/klaussilveira/gitter", "reference": "0.1.1" }, "dist": { "type": "zip", "url": "https://github.com/klaussilveira/gitter/zipball/0.1.1", "reference": "0.1.1", "shasum": "" }, "require": { "php": ">=5.3.0", "symfony/process": "2.1.*" }, "require-dev": { "symfony/filesystem": "2.1.*" }, "time": "2012-09-19 12:31:50", "type": "library", "installation-source": "dist", "autoload": { "psr-0": { "Gitter": "lib/" } }, "license": [ "BSD-2-Clause" ], "authors": [ { "name": "Klaus Silveira", "email": "klaussilveira@php.net", "homepage": "http://www.klaussilveira.com/", "role": "Developer" } ], "description": "Gitter allows you to interact in an object oriented manner with Git repositories.", "homepage": "https://github.com/klaussilveira/gitter", "keywords": [ "git", "vcs" ] }, { "name": "pimple/pimple", "version": "dev-master", "source": { "type": "git", "url": "git://github.com/fabpot/Pimple.git", "reference": "b9f27b8dc18c08f00627dec02359b46a24791dc3" }, "dist": { "type": "zip", "url": "https://github.com/fabpot/Pimple/zipball/b9f27b8dc18c08f00627dec02359b46a24791dc3", "reference": "b9f27b8dc18c08f00627dec02359b46a24791dc3", "shasum": "" }, "require": { "php": ">=5.3.0" }, "time": "1347278988", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Pimple": "lib/" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" } ], "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", "homepage": "http://pimple.sensiolabs.org", "keywords": [ "dependency injection", "container" ] }, { "name": "silex/silex", "version": "dev-master", "source": { "type": "git", "url": "git://github.com/fabpot/Silex.git", "reference": "78efb9a6bef34e4547e937066707ee338f516698" }, "dist": { "type": "zip", "url": "https://github.com/fabpot/Silex/zipball/78efb9a6bef34e4547e937066707ee338f516698", "reference": "78efb9a6bef34e4547e937066707ee338f516698", "shasum": "" }, "require": { "symfony/event-dispatcher": "2.1.*", "symfony/http-foundation": "2.1.*", "symfony/http-kernel": "2.1.*", "symfony/routing": "2.1.*", "php": ">=5.3.3", "pimple/pimple": "1.*" }, "require-dev": { "symfony/form": "2.1.*", "symfony/translation": "2.1.*", "symfony/twig-bridge": "2.1.*", "symfony/validator": "2.1.*", "symfony/monolog-bridge": "2.1.*", "symfony/browser-kit": "2.1.*", "symfony/css-selector": "2.1.*", "symfony/finder": "2.1.*", "symfony/process": "2.1.*", "symfony/security": "2.1.*", "monolog/monolog": ">=1.0.0,<1.2-dev", "symfony/config": "2.1.*", "symfony/locale": "2.1.*", "twig/twig": ">=1.8.0,<2.0-dev", "swiftmailer/swiftmailer": "4.2.*", "doctrine/dbal": "2.2.*" }, "suggest": { "symfony/browser-kit": "2.1.*", "symfony/css-selector": "2.1.*", "symfony/dom-crawler": "2.1.*" }, "time": "1348027658", "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Silex": "src/" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch", "homepage": "http://wiedler.ch/igor/" } ], "description": "The PHP micro-framework based on the Symfony2 Components", "homepage": "http://silex.sensiolabs.org", "keywords": [ "microframework" ] }, { "name": "symfony/event-dispatcher", "version": "2.1.x-dev", "target-dir": "Symfony/Component/EventDispatcher", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher", "reference": "v2.1.1" }, "dist": { "type": "zip", "url": "https://github.com/symfony/EventDispatcher/zipball/v2.1.1", "reference": "v2.1.1", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/dependency-injection": "2.1.*" }, "suggest": { "symfony/dependency-injection": "2.1.*", "symfony/http-kernel": "2.1.*" }, "time": "1347274422", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\EventDispatcher": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony EventDispatcher Component", "homepage": "http://symfony.com" }, { "name": "symfony/filesystem", "version": "2.1.x-dev", "target-dir": "Symfony/Component/Filesystem", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem", "reference": "v2.1.0-RC2" }, "dist": { "type": "zip", "url": "https://github.com/symfony/Filesystem/zipball/v2.1.0-RC2", "reference": "v2.1.0-RC2", "shasum": "" }, "require": { "php": ">=5.3.3" }, "time": "1345643321", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\Filesystem": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Filesystem Component", "homepage": "http://symfony.com" }, { "name": "symfony/http-foundation", "version": "2.1.x-dev", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", "url": "https://github.com/symfony/HttpFoundation", "reference": "23f68b488570def9ebe874a748410285f9a4acc9" }, "dist": { "type": "zip", "url": "https://github.com/symfony/HttpFoundation/zipball/23f68b488570def9ebe874a748410285f9a4acc9", "reference": "23f68b488570def9ebe874a748410285f9a4acc9", "shasum": "" }, "require": { "php": ">=5.3.3" }, "time": "1347984592", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\HttpFoundation": "", "SessionHandlerInterface": "Symfony/Component/HttpFoundation/Resources/stubs" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony HttpFoundation Component", "homepage": "http://symfony.com" }, { "name": "symfony/http-kernel", "version": "2.1.x-dev", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel", "reference": "52820d9f3b80e3b8d31aba53bb792ec25894e092" }, "dist": { "type": "zip", "url": "https://github.com/symfony/HttpKernel/zipball/52820d9f3b80e3b8d31aba53bb792ec25894e092", "reference": "52820d9f3b80e3b8d31aba53bb792ec25894e092", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/event-dispatcher": "2.1.*", "symfony/http-foundation": "2.1.*" }, "require-dev": { "symfony/browser-kit": "2.1.*", "symfony/class-loader": "2.1.*", "symfony/config": "2.1.*", "symfony/console": "2.1.*", "symfony/dependency-injection": "2.1.*", "symfony/finder": "2.1.*", "symfony/process": "2.1.*", "symfony/routing": "2.1.*" }, "suggest": { "symfony/browser-kit": "2.1.*", "symfony/class-loader": "2.1.*", "symfony/config": "2.1.*", "symfony/console": "2.1.*", "symfony/dependency-injection": "2.1.*", "symfony/finder": "2.1.*" }, "time": "1347914517", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\HttpKernel": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony HttpKernel Component", "homepage": "http://symfony.com" }, { "name": "symfony/process", "version": "2.1.x-dev", "target-dir": "Symfony/Component/Process", "source": { "type": "git", "url": "https://github.com/symfony/Process", "reference": "c1a8adcce9ea176c3a725269603045f80c027f36" }, "dist": { "type": "zip", "url": "https://github.com/symfony/Process/zipball/c1a8adcce9ea176c3a725269603045f80c027f36", "reference": "c1a8adcce9ea176c3a725269603045f80c027f36", "shasum": "" }, "require": { "php": ">=5.3.3" }, "time": "1348007849", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\Process": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Process Component", "homepage": "http://symfony.com" }, { "name": "symfony/routing", "version": "2.1.x-dev", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", "url": "https://github.com/symfony/Routing", "reference": "v2.1.1" }, "dist": { "type": "zip", "url": "https://github.com/symfony/Routing/zipball/v2.1.1", "reference": "v2.1.1", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/config": "2.1.*", "symfony/yaml": "2.1.*", "symfony/http-kernel": "2.1.*", "doctrine/common": ">=2.2,<2.4-dev" }, "suggest": { "doctrine/common": ">=2.2,<2.4-dev", "symfony/config": "2.1.*", "symfony/yaml": "2.1.*" }, "time": "1347274422", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\Routing": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Routing Component", "homepage": "http://symfony.com" }, { "name": "symfony/twig-bridge", "version": "2.1.x-dev", "target-dir": "Symfony/Bridge/Twig", "source": { "type": "git", "url": "https://github.com/symfony/TwigBridge", "reference": "v2.1.1" }, "dist": { "type": "zip", "url": "https://github.com/symfony/TwigBridge/zipball/v2.1.1", "reference": "v2.1.1", "shasum": "" }, "require": { "php": ">=5.3.3", "twig/twig": ">=1.9.1,<2.0-dev" }, "require-dev": { "symfony/form": "2.1.*", "symfony/routing": "2.1.*", "symfony/templating": "2.1.*", "symfony/translation": "2.1.*", "symfony/yaml": "2.1.*", "symfony/security": "2.1.*" }, "suggest": { "symfony/form": "2.1.*", "symfony/routing": "2.1.*", "symfony/templating": "2.1.*", "symfony/translation": "2.1.*", "symfony/yaml": "2.1.*", "symfony/security": "2.1.*" }, "time": "1347274422", "type": "symfony-bridge", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Bridge\\Twig": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Twig Bridge", "homepage": "http://symfony.com" }, { "name": "twig/twig", "version": "v1.9.2", "source": { "type": "git", "url": "git://github.com/fabpot/Twig.git", "reference": "v1.9.2" }, "dist": { "type": "zip", "url": "https://github.com/fabpot/Twig/zipball/v1.9.2", "reference": "v1.9.2", "shasum": "" }, "require": { "php": ">=5.2.4" }, "time": "2012-08-25 17:32:57", "type": "library", "extra": { "branch-alias": { "dev-master": "1.9-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { "Twig_": "lib/" } }, "license": [ "BSD-3" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Armin Ronacher", "email": "armin.ronacher@active-4.com" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", "homepage": "http://twig.sensiolabs.org", "keywords": [ "templating" ] } ], "packages-dev": [ { "name": "symfony/browser-kit", "version": "2.1.x-dev", "target-dir": "Symfony/Component/BrowserKit", "source": { "type": "git", "url": "https://github.com/symfony/BrowserKit", "reference": "v2.1.1" }, "dist": { "type": "zip", "url": "https://github.com/symfony/BrowserKit/zipball/v2.1.1", "reference": "v2.1.1", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/dom-crawler": "2.1.*" }, "require-dev": { "symfony/process": "2.1.*", "symfony/css-selector": "2.1.*" }, "suggest": { "symfony/process": "2.1.*" }, "time": "1347274422", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\BrowserKit": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony BrowserKit Component", "homepage": "http://symfony.com" }, { "name": "symfony/css-selector", "version": "2.1.x-dev", "target-dir": "Symfony/Component/CssSelector", "source": { "type": "git", "url": "https://github.com/symfony/CssSelector", "reference": "v2.1.0-RC2" }, "dist": { "type": "zip", "url": "https://github.com/symfony/CssSelector/zipball/v2.1.0-RC2", "reference": "v2.1.0-RC2", "shasum": "" }, "require": { "php": ">=5.3.3" }, "time": "1345643321", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\CssSelector": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony CssSelector Component", "homepage": "http://symfony.com" }, { "name": "symfony/dom-crawler", "version": "2.1.x-dev", "target-dir": "Symfony/Component/DomCrawler", "source": { "type": "git", "url": "https://github.com/symfony/DomCrawler", "reference": "v2.1.1" }, "dist": { "type": "zip", "url": "https://github.com/symfony/DomCrawler/zipball/v2.1.1", "reference": "v2.1.1", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/css-selector": "2.1.*" }, "suggest": { "symfony/css-selector": "2.1.*" }, "time": "1347274422", "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "installation-source": "source", "autoload": { "psr-0": { "Symfony\\Component\\DomCrawler": "" } }, "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony DomCrawler Component", "homepage": "http://symfony.com" } ], "aliases": [ ], "minimum-stability": "dev", "stability-flags": [ ] } config.ini-example000066400000000000000000000011121516076205000144520ustar00rootroot00000000000000[git] client = '/usr/bin/git' ; Your git executable path repositories = '/var/www/projects/' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/var/www/projects/BetaTest' [app] debug = false ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to specify custom filetypes as binary or explicit as not binary for certain extensions, ; do this here [binary_filetypes] ; extension = true ; svh = false ; map = true index.php000066400000000000000000000002211516076205000126730ustar00rootroot00000000000000run();phpunit.xml.dist000066400000000000000000000013501516076205000142320ustar00rootroot00000000000000 ./tests/ src/000077500000000000000000000000001516076205000116475ustar00rootroot00000000000000src/GitList/000077500000000000000000000000001516076205000132265ustar00rootroot00000000000000src/GitList/Application.php000066400000000000000000000042431516076205000162050ustar00rootroot00000000000000get('app', 'debug'); $this['filetypes'] = $config->getSection('filetypes'); $this['cache.archives'] = $root . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'archives'; // Register services $this->register(new TwigServiceProvider(), array( 'twig.path' => $root . DIRECTORY_SEPARATOR . 'views', 'twig.options' => array('cache' => $root . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'views'), )); $this->register(new GitServiceProvider(), array( 'git.client' => $config->get('git', 'client'), 'git.repos' => $config->get('git', 'repositories'), 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(), )); $this->register(new ViewUtilServiceProvider()); $this->register(new RepositoryUtilServiceProvider()); $this->register(new UrlGeneratorServiceProvider()); $this['twig'] = $this->share($this->extend('twig', function($twig, $app) { $twig->addFilter('md5', new \Twig_Filter_Function('md5')); return $twig; })); // Handle errors $this->error(function (\Exception $e, $code) use ($app) { if ($app['debug']) { return; } return $app['twig']->render('error.twig', array( 'message' => $e->getMessage(), )); }); } } src/GitList/Config.php000066400000000000000000000022061516076205000151440ustar00rootroot00000000000000data = parse_ini_file($file, true); $this->validateOptions(); } public function get($section, $option) { if (!array_key_exists($section, $this->data)) { return false; } if (!array_key_exists($option, $this->data[$section])) { return false; } return $this->data[$section][$option]; } public function getSection($section) { if (!array_key_exists($section, $this->data)) { return false; } return $this->data[$section]; } public function set($section, $option, $value) { $this->data[$section][$option] = $value; } protected function validateOptions() { if (!$this->get('git', 'repositories') || !is_dir($this->get('git', 'repositories'))) { die("Please, edit the config file and provide your repositories directory"); } } }src/GitList/Controller/000077500000000000000000000000001516076205000153515ustar00rootroot00000000000000src/GitList/Controller/BlobController.php000066400000000000000000000042071516076205000210070ustar00rootroot00000000000000get('{repo}/blob/{branch}/{file}', function($repo, $branch, $file) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $blob = $repository->getBlob("$branch:\"$file\""); $breadcrumbs = $app['util.view']->getBreadcrumbs($file); $fileType = $app['util.repository']->getFileType($file); if ('image' !== $fileType && $app['util.repository']->isBinary($fileType)) { return $app->redirect($app['url_generator']->generate('blob_raw', array( 'repo' => $repo, 'branch' => $branch, 'file' => $file, ))); } return $app['twig']->render('file.twig', array( 'file' => $file, 'fileType' => $fileType, 'blob' => $blob->output(), 'repo' => $repo, 'branch' => $branch, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), )); })->assert('file', '.+') ->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('blob'); $route->get('{repo}/raw/{branch}/{file}', function($repo, $branch, $file) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $blob = $repository->getBlob("$branch:\"$file\"")->output(); return new Response($blob, 200, array('Content-Type' => 'text/plain')); })->assert('file', '.+') ->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('blob_raw'); return $route; } } src/GitList/Controller/CommitController.php000066400000000000000000000076671516076205000213760ustar00rootroot00000000000000get('{repo}/commits/{branch}/{file}', function($repo, $branch, $file) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $type = $file ? "$branch -- \"$file\"" : $branch; $pager = $app['util.view']->getPager($app['request']->get('page'), $repository->getTotalCommits($type)); $commits = $repository->getPaginatedCommits($type, $pager['current']); foreach ($commits as $commit) { $date = $commit->getDate(); $date = $date->format('m/d/Y'); $categorized[$date][] = $commit; } $template = $app['request']->isXmlHttpRequest() ? 'commits_list.twig' : 'commits.twig'; return $app['twig']->render($template, array( 'pager' => $pager, 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'commits' => $categorized, 'file' => $file, )); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->assert('file', '.+') ->value('branch', 'master') ->value('file', '') ->bind('commits'); $route->post('{repo}/commits/search', function(Request $request, $repo) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $commits = $repository->searchCommitLog($request->get('query')); foreach ($commits as $commit) { $date = $commit->getDate(); $date = $date->format('m/d/Y'); $categorized[$date][] = $commit; } return $app['twig']->render('searchcommits.twig', array( 'repo' => $repo, 'branch' => 'master', 'file' => '', 'commits' => $categorized, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), )); })->assert('repo', '[\w-._]+') ->bind('searchcommits'); $route->get('{repo}/commit/{commit}/', function($repo, $commit) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $commit = $repository->getCommit($commit); return $app['twig']->render('commit.twig', array( 'branch' => 'master', 'repo' => $repo, 'commit' => $commit, )); })->assert('repo', '[\w-._]+') ->assert('commit', '[a-f0-9^]+') ->bind('commit'); $route->get('{repo}/blame/{branch}/{file}', function($repo, $branch, $file) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $blames = $repository->getBlame("$branch -- \"$file\""); return $app['twig']->render('blame.twig', array( 'file' => $file, 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'blames' => $blames, )); })->assert('repo', '[\w-._]+') ->assert('file', '.+') ->assert('branch', '[\w-._]+') ->bind('blame'); return $route; } }src/GitList/Controller/MainController.php000066400000000000000000000040721516076205000210150ustar00rootroot00000000000000get('/', function() use ($app) { $repositories = $app['git']->getRepositories($app['git.repos']); return $app['twig']->render('index.twig', array( 'repositories' => $repositories, )); })->bind('homepage'); $route->get('{repo}/stats/{branch}', function($repo, $branch) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $stats = $repository->getStatistics($branch); $authors = $repository->getAuthorStatistics(); return $app['twig']->render('stats.twig', array( 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'stats' => $stats, 'authors' => $authors, )); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->value('branch', 'master') ->bind('stats'); $route->get('{repo}/{branch}/rss/', function($repo, $branch) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $commits = $repository->getPaginatedCommits($branch); $html = $app['twig']->render('rss.twig', array( 'repo' => $repo, 'branch' => $branch, 'commits' => $commits, )); return new Response($html, 200, array('Content-Type' => 'application/rss+xml')); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('rss'); return $route; } }src/GitList/Controller/TreeController.php000066400000000000000000000111431516076205000210250ustar00rootroot00000000000000get('{repo}/tree/{branch}/{tree}/', $treeController = function($repo, $branch = '', $tree = '') use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); if (!$branch) { $branch = $repository->getHead(); } $files = $repository->getTree($tree ? "$branch:\"$tree\"/" : $branch); $breadcrumbs = $app['util.view']->getBreadcrumbs($tree); $parent = null; if (($slash = strrpos($tree, '/')) !== false) { $parent = substr($tree, 0, $slash); } elseif (!empty($tree)) { $parent = ''; } return $app['twig']->render('tree.twig', array( 'files' => $files->output(), 'repo' => $repo, 'branch' => $branch, 'path' => $tree ? $tree . '/' : $tree, 'parent' => $parent, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'readme' => $app['util.repository']->getReadme($repo, $branch), )); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->assert('tree', '.+') ->bind('tree'); $route->post('{repo}/tree/{branch}/search', function(Request $request, $repo, $branch = '', $tree = '') use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); if (!$branch) { $branch = $repository->getHead(); } $breadcrumbs = $app['util.view']->getBreadcrumbs($tree); $results = $repository->searchTree($request->get('query'), $branch); return $app['twig']->render('search.twig', array( 'results' => $results, 'repo' => $repo, 'branch' => $branch, 'path' => $tree, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), )); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('search'); $route->get('{repo}/{branch}/', function($repo, $branch) use ($app, $treeController) { return $treeController($repo, $branch); })->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('branch'); $route->get('{repo}/', function($repo) use ($app, $treeController) { return $treeController($repo); })->assert('repo', '[\w-._]+') ->bind('repository'); $route->get('{repo}/{format}ball/{branch}', function($repo, $format, $branch) use ($app) { $repository = $app['git']->getRepository($app['git.repos'] . $repo); $tree = $repository->getBranchTree($branch); if (false === $tree) { return $app->abort(404, 'Invalid commit or tree reference: ' . $branch); } $file = $app['cache.archives'] . DIRECTORY_SEPARATOR . $repo . DIRECTORY_SEPARATOR . substr($tree, 0, 2) . DIRECTORY_SEPARATOR . substr($tree, 2) . '.' . $format; if (!file_exists($file)) { $repository->createArchive($tree, $file, $format); } return new StreamedResponse(function () use ($file) { readfile($file); }, 200, array( 'Content-type' => ('zip' === $format) ? 'application/zip' : 'application/x-tar', 'Content-Description' => 'File Transfer', 'Content-Disposition' => 'attachment; filename="'.$repo.'-'.substr($tree, 0, 6).'.'.$format.'"', 'Content-Transfer-Encoding' => 'binary', )); })->assert('format', '(zip|tar)') ->assert('repo', '[\w-._]+') ->assert('branch', '[\w-._]+') ->bind('archive'); return $route; } }src/GitList/Exception/000077500000000000000000000000001516076205000151645ustar00rootroot00000000000000src/GitList/Exception/BlankDataException.php000066400000000000000000000001321516076205000213710ustar00rootroot00000000000000create($bare); } /** * Opens a repository at the specified path * * @param string $path Path where the repository is located * @return Repository Instance of Repository */ public function getRepository($path) { if (!file_exists($path) || !file_exists($path . '/.git/HEAD') && !file_exists($path . '/HEAD')) { throw new \RuntimeException('There is no GIT repository at ' . $path); } if (in_array($path, $this->getHidden())) { throw new \RuntimeException('You don\'t have access to this repository'); } return new Repository($path, $this); } }src/GitList/Git/Repository.php000066400000000000000000000110231516076205000166360ustar00rootroot00000000000000%H%h%T%P%an%ae%at%cn%ce%ct'"; if ($file) { $command .= " $file"; } $logs = $this->getPrettyFormat($command); foreach ($logs as $log) { $commit = new Commit; $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchCommitLog($query) { $command = "log --grep='$query' --pretty=format:'%H%h%T%P%an%ae%at%cn%ce%ct'"; $logs = $this->getPrettyFormat($command); foreach ($logs as $log) { $commit = new Commit; $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchTree($query, $branch) { try { $results = $this->getClient()->run($this, "grep -I --line-number '$query' $branch"); } catch (\RuntimeException $e) { return false; } $results = explode("\n", $results); foreach ($results as $result) { if ($result == '') { continue; } preg_match_all('/([\w-._]+):(.+):([0-9]+):(.+)/', $result, $matches, PREG_SET_ORDER); $data['branch'] = $matches[0][1]; $data['file'] = $matches[0][2]; $data['line'] = $matches[0][3]; $data['match'] = $matches[0][4]; $searchResults[] = $data; } return $searchResults; } public function getAuthorStatistics() { $logs = $this->getClient()->run($this, 'log --pretty=format:"%an||%ae" ' . $this->getHead()); if (empty($logs)) { throw new \RuntimeException('No statistics available'); } $logs = explode("\n", $logs); $logs = array_count_values($logs); arsort($logs); foreach ($logs as $user => $count) { $user = explode('||', $user); $data[] = array('name' => $user[0], 'email' => $user[1], 'commits' => $count); } return $data; } public function getStatistics($branch) { // Calculate amount of files, extensions and file size $logs = $this->getClient()->run($this, 'ls-tree -r -l ' . $branch); $lines = explode("\n", $logs); $files = array(); $data['extensions'] = array(); $data['size'] = 0; $data['files'] = 0; foreach ($lines as $key => $line) { if (empty($line)) { unset($lines[$key]); continue; } $files[] = preg_split("/[\s]+/", $line); } foreach ($files as $file) { if ($file[1] == 'blob') { $data['files']++; } if (is_numeric($file[3])) { $data['size'] += $file[3]; } if (($pos = strrpos($file[4], '.')) !== FALSE) { $data['extensions'][] = substr($file[4], $pos); } } $data['extensions'] = array_count_values($data['extensions']); arsort($data['extensions']); return $data; } /** * Create a TAR or ZIP archive of a git tree * * @param string $tree Tree-ish reference * @param string $output Output File name * @param string $format Archive format */ public function createArchive($tree, $output, $format = 'zip') { $fs = new Filesystem; $fs->mkdir(dirname($output)); $this->getClient()->run($this, "archive --format=$format --output=$output $tree"); } } src/GitList/Provider/000077500000000000000000000000001516076205000150205ustar00rootroot00000000000000src/GitList/Provider/GitServiceProvider.php000066400000000000000000000012701516076205000213100ustar00rootroot00000000000000share(function () use ($app) { return new Repository($app); }); } public function boot(Application $app) { } } src/GitList/Provider/ViewUtilServiceProvider.php000066400000000000000000000010431516076205000223330ustar00rootroot00000000000000share(function () { return new View; }); } public function boot(Application $app) { } } src/GitList/Util/000077500000000000000000000000001516076205000141435ustar00rootroot00000000000000src/GitList/Util/Repository.php000066400000000000000000000124701516076205000170370ustar00rootroot00000000000000 'php', 'c' => 'clike', 'h' => 'clike', 'cpp' => 'clike', 'm' => 'clike', 'mm' => 'clike', 'cs' => 'text/x-csharp', 'java' => 'java', 'clj' => 'clojure', 'coffee' => 'coffeescript', 'css' => 'css', 'diff' => 'diff', 'ecl' => 'ecl', 'el' => 'erlang', 'go' => 'go', 'groovy' => 'groovy', 'hs' => 'haskell', 'lhs' => 'haskell', 'jsp' => 'htmlembedded', 'asp' => 'htmlembedded', 'aspx' => 'htmlembedded', 'html' => 'htmlmixed', 'tpl' => 'htmlmixed', 'js' => 'javascript', 'json' => 'javascript', 'less' => 'less', 'lua' => 'lua', 'md' => 'markdown', 'markdown' => 'markdown', 'sql' => 'mysql', 'pl' => 'perl', 'pm' => 'perl', 'pas' => 'pascal', 'ini' => 'properties', 'cfg' => 'properties', 'nt' => 'ntriples', 'py' => 'python', 'rb' => 'ruby', 'rst' => 'rst', 'r' => 'r', 'sh' => 'shell', 'ss' => 'scheme', 'scm' => 'scheme', 'sls' => 'scheme', 'sps' => 'scheme', 'rs' => 'rust', 'st' => 'smalltalk', 'tex' => 'stex', 'vbs' => 'vbscript', 'v' => 'verilog', 'xml' => 'xml', 'xsd' => 'xml', 'xsl' => 'xml', 'xul' => 'xml', 'xlf' => 'xml', 'xliff' => 'xml', 'xaml' => 'xml', 'wxs' => 'xml', 'wxl' => 'xml', 'wxi' => 'xml', 'wsdl' => 'xml', 'svg' => 'xml', 'rss' => 'xml', 'rdf' => 'xml', 'plist' => 'xml', 'mxml' => 'xml', 'kml' => 'xml', 'glade' => 'xml', 'xq' => 'xquery', 'xqm' => 'xquery', 'xquery' => 'xquery', 'xqy' => 'xquery', 'yml' => 'yaml', 'yaml' => 'yaml', 'png' => 'image', 'jpg' => 'image', 'gif' => 'image', 'jpeg' => 'image', 'bmp' => 'image', 'csproj' => 'xml', ); protected static $binaryTypes = array( 'exe', 'com', 'so', 'la', 'o', 'dll', 'pyc', 'jpg', 'jpeg', 'bmp', 'gif', 'png', 'xmp', 'pcx', 'svgz', 'ttf', 'tiff', 'oet', 'gz', 'tar', 'rar', 'zip', '7z', 'jar', 'class', 'odt', 'ods', 'pdf', 'doc', 'docx', 'dot', 'xls', 'xlsx', ); public function __construct(Application $app) { $this->app = $app; } /** * Returns the file type based on filename by treating the extension * * The file type is used by CodeMirror, a Javascript-based IDE implemented in * GitList, to properly highlight the blob syntax (if it's a source-code) * * @param string $file File name * @return mixed File type */ public function getFileType($file) { if (($pos = strrpos($file, '.')) !== FALSE) { $fileType = substr($file, $pos + 1); } else { return 'text'; } if (isset($this->defaultFileTypes[$fileType])) { return $this->defaultFileTypes[$fileType]; } if (!empty($this->app['filetypes'])) { if (isset($this->app['filetypes'][$fileType])) { return $this->app['filetypes'][$fileType]; } } return 'text'; } /** * Returns whether the file is binary. * * @param string $file * @param boolean $unknownAsBin if the file-type is unknown tread it as binary * * @return boolean */ public function isBinary($file, $unknownAsBin = false) { if (false !== ($pos = strrpos($file, '.'))) { $fileType = substr($file, $pos + 1); } elseif ($unknownAsBin) { return true; } else { return false; } if (in_array($fileType, self::$binaryTypes)) { return true; } if (!empty($this->app['binary_filetypes'])) { if (array_key_exists($fileType, $this->app['binary_filetypes'])) { return ('true' == $this->app['binary_filetypes'][$fileType]); } } if ($unknownAsBin) { return true; } else { return false; } } public function getReadme($repo, $branch = 'master') { $repository = $this->app['git']->getRepository($this->app['git.repos'] . $repo); $files = $repository->getTree($branch)->output(); foreach ($files as $file) { if (preg_match('/^readme*/i', $file['name'])) { return array( 'filename' => $file['name'], 'content' => $repository->getBlob("$branch:\"{$file['name']}\"")->output() ); } } return array(); } } src/GitList/Util/View.php000066400000000000000000000024071516076205000155710ustar00rootroot00000000000000 $path) { $breadcrumbs[] = array( 'dir' => $path, 'path' => implode('/', array_slice($paths, 0, $i + 1)), ); } return $breadcrumbs; } public function getPager($pageNumber, $totalCommits) { $pageNumber = (empty($pageNumber)) ? 0 : $pageNumber; $lastPage = intval($totalCommits / 15); // If total commits are integral multiple of 15, the lastPage will be commits/15 - 1. $lastPage = ($lastPage * 15 == $totalCommits) ? $lastPage - 1 : $lastPage; $nextPage = $pageNumber + 1; $previousPage = $pageNumber - 1; return array('current' => $pageNumber, 'next' => $nextPage, 'previous' => $previousPage, 'last' => $lastPage, 'total' => $totalCommits, ); } } tests/000077500000000000000000000000001516076205000122225ustar00rootroot00000000000000tests/InterfaceTest.php000066400000000000000000000237401516076205000155010ustar00rootroot00000000000000mkdir(self::$tmpdir); if (!is_writable(self::$tmpdir)) { $this->markTestSkipped('There are no write permissions in order to create test repositories.'); } $options['path'] = getenv('GIT_CLIENT') ?: '/usr/bin/git'; $options['hidden'] = array(self::$tmpdir . '/hiddenrepo'); $git = new Client($options); // GitTest repository fixture $git->createRepository(self::$tmpdir . 'GitTest'); $repository = $git->getRepository(self::$tmpdir . 'GitTest'); file_put_contents(self::$tmpdir . 'GitTest/README.md', "## GitTest\nGitTest is a *test* repository!"); file_put_contents(self::$tmpdir . 'GitTest/test.php', "setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("Initial commit"); $repository->createBranch('issue12'); $repository->createBranch('issue42'); // foobar repository fixture $git->createRepository(self::$tmpdir . 'foobar'); $repository = $git->getRepository(self::$tmpdir . '/foobar'); file_put_contents(self::$tmpdir . 'foobar/bar.json', "{\n\"name\": \"foobar\"\n}"); file_put_contents(self::$tmpdir . 'foobar/.git/description', 'This is a test repo!'); $fs->mkdir(self::$tmpdir . 'foobar/myfolder'); $fs->mkdir(self::$tmpdir . 'foobar/testfolder'); file_put_contents(self::$tmpdir . 'foobar/myfolder/mytest.php', "setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("First commit"); } public function createApplication() { $app = require 'boot.php'; $app['debug'] = true; $app['git.repos'] = self::$tmpdir; return $app; } public function testInitialPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('title:contains("GitList")')); $this->assertCount(1, $crawler->filter('div.repository-header:contains("GitTest")')); $this->assertEquals('/GitTest/', $crawler->filter('.repository-header a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/master/rss/', $crawler->filter('.repository-header a')->eq(1)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-header:contains("foobar")')); $this->assertCount(1, $crawler->filter('div.repository-body:contains("This is a test repo!")')); $this->assertEquals('/foobar/', $crawler->filter('.repository-header a')->eq(2)->attr('href')); $this->assertEquals('/foobar/master/rss/', $crawler->filter('.repository-header a')->eq(3)->attr('href')); } public function testRepositoryPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.tree tr:contains("README.md")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("test.php")')); $this->assertCount(1, $crawler->filter('.readme-header:contains("README.md")')); $this->assertEquals("## GitTest\nGitTest is a *test* repository!", $crawler->filter('#readme-content')->eq(0)->text()); $this->assertEquals('/GitTest/blob/master/README.md', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/blob/master/test.php', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href')); $this->assertEquals('issue12', $crawler->filter('.dropdown-menu li')->eq(1)->text()); $this->assertEquals('issue42', $crawler->filter('.dropdown-menu li')->eq(2)->text()); $this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(3)->text()); $crawler = $client->request('GET', '/foobar/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.tree tr:contains("myfolder")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("testfolder")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("bar.json")')); $this->assertEquals('/foobar/tree/master/myfolder/', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/foobar/tree/master/testfolder/', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/foobar/blob/master/bar.json', $crawler->filter('.tree tr td')->eq(6)->filter('a')->eq(0)->attr('href')); $this->assertCount(0, $crawler->filter('.readme-header')); $this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(1)->text()); } public function testBlobPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/blob/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.breadcrumb .active:contains("test.php")')); $this->assertEquals('/GitTest/raw/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/blame/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(1)->attr('href')); $this->assertEquals('/GitTest/commits/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(2)->attr('href')); } public function testRawPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/raw/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals("getResponse()->getContent()); } public function testBlamePage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/blame/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.source-header .meta:contains("test.php")')); $this->assertRegexp('/\/GitTest\/commit\/[a-zA-Z0-9%]+\//', $crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href')); $crawler = $client->request('GET', '/foobar/blame/master/bar.json'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.source-header .meta:contains("bar.json")')); $this->assertRegexp('/\/foobar\/commit\/[a-zA-Z0-9%]+\//', $crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href')); } public function testHistoryPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/commits/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/GitTest/commits/master/README.md'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/foobar/commits/master/bar.json'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); } public function testCommitsPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/commits'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/foobar/commits'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); } public function testStatsPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/stats'); $this->assertTrue($client->getResponse()->isOk()); $this->assertRegexp('/.php: 1 files/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/.md: 1 files/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/Total files: 2/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/Luke Skywalker: 1 commits/', $crawler->filter('.table tbody')->eq(0)->text()); } public function testRssPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/master/rss/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertRegexp('/Latest commits in GitTest:master/', $client->getResponse()->getContent()); $this->assertRegexp('/Initial commit/', $client->getResponse()->getContent()); } public static function tearDownAfterClass() { $fs = new Filesystem(); $fs->remove(self::$tmpdir); } } views/000077500000000000000000000000001516076205000122155ustar00rootroot00000000000000views/blame.twig000066400000000000000000000012701516076205000141710ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Blame', path:''}]} %}
{{ file }}
{% for blame in blames %} {% endfor %}
{{ blame.commit }}
{{ blame.line }}

{% endblock %} views/branch_menu.twig000066400000000000000000000011651516076205000153750ustar00rootroot00000000000000
views/breadcrumb.twig000066400000000000000000000007521516076205000152230ustar00rootroot00000000000000 views/commit.twig000066400000000000000000000060651516076205000144100ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: "Commit #{commit.hash}", path:''}]} %}
Browse code

{{ commit.message }}

{{ commit.author.name }} authored in {{ commit.date | date('d/m/Y \\a\\t H:i:s') }}
Showing {{ commit.changedFiles }} changed files
{% for diff in commit.diffs %}
{% for line in diff.getLines %} {% endfor %}
{% if line.getType != 'chunk' %} {% endif %} {{ line.getNumOld }} {% if line.getType != 'chunk' %} {% endif %} {% if line.getType != 'chunk' %} {% endif %} {{ line.getNumNew }} {% if line.getType != 'chunk' %} {% endif %} {{ line.getLine }}
{% endfor %}
{% endblock %} views/commits.twig000066400000000000000000000004271516076205000145670ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Commit history', path:''}]} %} {% include 'commits_list.twig' %}
{% endblock %} views/commits_list.twig000066400000000000000000000023311516076205000156160ustar00rootroot00000000000000{% for date, commit in commits %} {% for item in commit %} {% endfor %}
{{ date | date("F j, Y") }}
View {{ item.shortHash }}

{{ item.message }}

{{ item.author.name }} authored in {{ item.date | date('d/m/Y \\a\\t H:i:s') }}
{% endfor %} {% if page != 'searchcommits' %} {% endif %}views/error.twig000066400000000000000000000004561516076205000142470ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block title %}GitList{% endblock %} {% block body %} {% include 'navigation.twig' %}
Oops! {{ message }}

{% include 'footer.twig' %}
{% endblock %} views/file.twig000066400000000000000000000021771516076205000140370ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %}
{% if fileType == 'image' %}
{{ file }}
{% else %}
{{ blob }}
{% endif %}

{% endblock %} views/footer.twig000066400000000000000000000001501516076205000144030ustar00rootroot00000000000000 views/index.twig000066400000000000000000000013251516076205000142210ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block title %}GitList{% endblock %} {% block body %} {% include 'navigation.twig' %}
{% for repository in repositories %}

{{ repository.description }}

{% endfor %}
{% include 'footer.twig' %}
{% endblock %} views/layout.twig000066400000000000000000000015001516076205000144220ustar00rootroot00000000000000 {% block title %}Welcome!{% endblock %} {% block body %}{% endblock %} views/layout_page.twig000066400000000000000000000021451516076205000154240ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block body %} {% include 'navigation.twig' %}
{% if page == 'commits' %} {% else %} {% endif %} {% if branches is defined %} {% include 'branch_menu.twig' %} {% endif %} {% include 'menu.twig' %}
{% block content %}{% endblock %} {% include 'footer.twig' %}
{% endblock %} views/menu.twig000066400000000000000000000006661516076205000140650ustar00rootroot00000000000000 views/navigation.twig000066400000000000000000000015171516076205000152540ustar00rootroot00000000000000 views/rss.twig000066400000000000000000000012651516076205000137240ustar00rootroot00000000000000 Latest commits in {{ repo }}:{{ branch }} RSS provided by GitList {{ path('homepage') }} {% for commit in commits %} {{ commit.message }} {{ commit.author.name }} authored {{ commit.shortHash }} in {{ commit.date | date('d/m/Y \\a\\t H:i:s') }} {{ path('commit', {repo: repo, commit: commit.shortHash}) }} {{ commit.date | date('r') }} {% endfor %} views/search.twig000066400000000000000000000027521516076205000143640ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %} {% block extra %}
ZIP TAR
{% endblock %} {% endembed %} {% if results %} {% for result in results %} {% endfor %}
name match
{{ result.file }} {{ result.match }}
{% else %}

No results found.

{% endif %}
{% endblock %} views/searchcommits.twig000066400000000000000000000004451516076205000157550ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'searchcommits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Commits search results', path:''}]} %} {% include 'commits_list.twig' %}
{% endblock %} views/stats.twig000066400000000000000000000030341516076205000142470ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'stats' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Statistics', path:''}]} %}
File extensions ({{ stats.extensions|length }}) Authors ({{ authors|length }}) Other
    {% for ext, amount in stats.extensions %}
  • {{ ext }}: {{ amount }} files
  • {% endfor %}
    {% for author in authors %}
  • {{ author.name }}: {{ author.commits }} commits
  • {% endfor %}

Total files: {{ stats.files }}

Total bytes: {{ stats.size }} bytes ({{ ((stats.size / 1024) / 1024) | number_format }} MB)


{% endblock %} views/tree.twig000066400000000000000000000054001516076205000140470ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %} {% block extra %}
ZIP TAR
{% endblock %} {% endembed %} {% if parent is not null %} {% endif %} {% for file in files %} {% endfor %}
name mode size
{% if not parent %} .. {% else %} .. {% endif %}
{{ file.name }} {{ file.mode }} {% if file.size %}{{ (file.size / 1024) | number_format }} kb{% endif %}
{% if readme is defined and readme is not empty %}
{{ readme.filename }}
{{ readme.content }}
{% endif %}
{% endblock %} web/000077500000000000000000000000001516076205000116355ustar00rootroot00000000000000web/Makefile000077500000000000000000000001001516076205000132670ustar00rootroot00000000000000bootstrap: lessc --compress less/bootstrap.less > css/style.cssweb/css/000077500000000000000000000000001516076205000124255ustar00rootroot00000000000000web/css/style.css000066400000000000000000002713531516076205000143120ustar00rootroot00000000000000article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} audio:not([controls]){display:none;} html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;overflow-y:scroll;overflow:-moz-scrollbars-vertical;-ms-overflow-y:scroll;} a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} a:hover,a:active{outline:0;} sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} sup{top:-0.5em;} sub{bottom:-0.25em;} img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} button,input{*overflow:visible;line-height:normal;} button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} textarea{overflow:auto;vertical-align:top;} .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} .clearfix:after{clear:both;} .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;padding-bottom:40px;} a{color:#4183c4;text-decoration:none;} a:hover{color:#2c5d8d;text-decoration:underline;} .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} .span12{width:940px;} .span11{width:860px;} .span10{width:780px;} .span9{width:700px;} .span8{width:620px;} .span7{width:540px;} .span6{width:460px;} .span5{width:380px;} .span4{width:300px;} .span3{width:220px;} .span2{width:140px;} .span1{width:60px;} .offset12{margin-left:980px;} .offset11{margin-left:900px;} .offset10{margin-left:820px;} .offset9{margin-left:740px;} .offset8{margin-left:660px;} .offset7{margin-left:580px;} .offset6{margin-left:500px;} .offset5{margin-left:420px;} .offset4{margin-left:340px;} .offset3{margin-left:260px;} .offset2{margin-left:180px;} .offset1{margin-left:100px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574%;*margin-left:2.0744680846382977%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .span12{width:99.99999998999999%;*width:99.94680850063828%;} .row-fluid .span11{width:91.489361693%;*width:91.4361702036383%;} .row-fluid .span10{width:82.97872339599999%;*width:82.92553190663828%;} .row-fluid .span9{width:74.468085099%;*width:74.4148936096383%;} .row-fluid .span8{width:65.95744680199999%;*width:65.90425531263828%;} .row-fluid .span7{width:57.446808505%;*width:57.3936170156383%;} .row-fluid .span6{width:48.93617020799999%;*width:48.88297871863829%;} .row-fluid .span5{width:40.425531911%;*width:40.3723404216383%;} .row-fluid .span4{width:31.914893614%;*width:31.8617021246383%;} .row-fluid .span3{width:23.404255317%;*width:23.3510638276383%;} .row-fluid .span2{width:14.89361702%;*width:14.8404255306383%;} .row-fluid .span1{width:6.382978723%;*width:6.329787233638298%;} .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} .container:after{clear:both;} .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} .container-fluid:after{clear:both;} p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} .lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} h3{font-size:18px;line-height:27px;}h3 small{font-size:14px;} h4,h5,h6{line-height:18px;} h4{font-size:14px;}h4 small{font-size:12px;} h5{font-size:12px;} h6{font-size:11px;color:#999999;text-transform:uppercase;} .page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} .page-header h1{line-height:1;} ul,ol{padding:0;margin:0 0 9px 25px;} ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} ul{list-style:disc;} ol{list-style:decimal;} li{line-height:18px;} ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} dl{margin-bottom:18px;} dt,dd{line-height:18px;} dt{font-weight:bold;line-height:17px;} dd{margin-left:9px;} .dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .dl-horizontal dd{margin-left:130px;} hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} strong{font-weight:bold;} em{font-style:italic;} .muted{color:#999999;} abbr[title]{cursor:help;border-bottom:1px dotted #ddd;} abbr.initialism{font-size:90%;text-transform:uppercase;} blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} q:before,q:after,blockquote:before,blockquote:after{content:"";} address{display:block;margin-bottom:18px;font-style:normal;line-height:18px;} small{font-size:100%;} cite{font-style:normal;} code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:18px;} pre code{padding:0;color:inherit;background-color:transparent;border:0;} .pre-scrollable{max-height:340px;overflow-y:scroll;} form{margin:0 0 18px;} fieldset{padding:0;margin:0;border:0;} legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;} label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;} input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} label{display:block;margin-bottom:5px;color:#333333;} input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;background-color:#ffffff;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .uneditable-textarea{width:auto;height:auto;} label input,label textarea,label select{display:block;} input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;background-color:transparent;border:0 \9;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} input[type="image"]{border:0;} input[type="file"]{width:auto;padding:initial;line-height:initial;background-color:#ffffff;background-color:initial;border:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} input[type="file"]{line-height:18px \9;} select{width:220px;background-color:#ffffff;} select[multiple],select[size]{height:auto;} input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} textarea{height:auto;} input[type="hidden"]{display:none;} .radio,.checkbox{min-height:18px;padding-left:18px;} .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .input-mini{width:60px;} .input-small{width:90px;} .input-medium{width:150px;} .input-large{width:210px;} .input-xlarge{width:270px;} .input-xxlarge{width:530px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:930px;} input.span11, textarea.span11, .uneditable-input.span11{width:850px;} input.span10, textarea.span10, .uneditable-input.span10{width:770px;} input.span9, textarea.span9, .uneditable-input.span9{width:690px;} input.span8, textarea.span8, .uneditable-input.span8{width:610px;} input.span7, textarea.span7, .uneditable-input.span7{width:530px;} input.span6, textarea.span6, .uneditable-input.span6{width:450px;} input.span5, textarea.span5, .uneditable-input.span5{width:370px;} input.span4, textarea.span4, .uneditable-input.span4{width:290px;} input.span3, textarea.span3, .uneditable-input.span3{width:210px;} input.span2, textarea.span2, .uneditable-input.span2{width:130px;} input.span1, textarea.span1, .uneditable-input.span1{width:50px;} input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;border-color:#ddd;} input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} .control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} .control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} .control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} .form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";} .form-actions:after{clear:both;} .uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);} :-moz-placeholder{color:#999999;} ::-webkit-input-placeholder{color:#999999;} .help-block,.help-inline{color:#555555;} .help-block{display:block;margin-bottom:9px;} .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} .input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2;} .input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} .input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;} .input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee;} .input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .form-search{margin:3px 0 0 0;padding:0;} .search-query{padding:3px;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-size:11px;} .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;} .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} .form-search label,.form-inline label{display:inline-block;} .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} .control-group{margin-bottom:9px;} legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} .form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} .form-horizontal .control-group:after{clear:both;} .form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;} .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;} .form-horizontal .help-block{margin-top:9px;margin-bottom:0;} .form-horizontal .form-actions{padding-left:160px;} table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} .table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} .table th{font-weight:bold;} .table thead th{vertical-align:bottom;} .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} .table tbody+tbody{border-top:2px solid #dddddd;} .table-condensed th,.table-condensed td{padding:4px 5px;} .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;} .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;} .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} .table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;} table .span1{float:none;width:44px;margin-left:0;} table .span2{float:none;width:124px;margin-left:0;} table .span3{float:none;width:204px;margin-left:0;} table .span4{float:none;width:284px;margin-left:0;} table .span5{float:none;width:364px;margin-left:0;} table .span6{float:none;width:444px;margin-left:0;} table .span7{float:none;width:524px;margin-left:0;} table .span8{float:none;width:604px;margin-left:0;} table .span9{float:none;width:684px;margin-left:0;} table .span10{float:none;width:764px;margin-left:0;} table .span11{float:none;width:844px;margin-left:0;} table .span12{float:none;width:924px;margin-left:0;} table .span13{float:none;width:1004px;margin-left:0;} table .span14{float:none;width:1084px;margin-left:0;} table .span15{float:none;width:1164px;margin-left:0;} table .span16{float:none;width:1244px;margin-left:0;} table .span17{float:none;width:1324px;margin-left:0;} table .span18{float:none;width:1404px;margin-left:0;} table .span19{float:none;width:1484px;margin-left:0;} table .span20{float:none;width:1564px;margin-left:0;} table .span21{float:none;width:1644px;margin-left:0;} table .span22{float:none;width:1724px;margin-left:0;} table .span23{float:none;width:1804px;margin-left:0;} table .span24{float:none;width:1884px;margin-left:0;} .tree{width:100%;margin-bottom:18px;border:1px solid #cacaca;}.tree thead th{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555555;text-shadow:1px 1px 1px #ffffff;} .tree tbody td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-bottom:1px solid #EEE;background-color:#F8F8F8;} .tree caption+thead tr:first-child th,.tree caption+thead tr:first-child td,.tree colgroup+thead tr:first-child th,.tree colgroup+thead tr:first-child td,.tree thead:first-child tr:first-child th,.tree thead:first-child tr:first-child td{border-top:0;} .tree tbody tr:last-child td{border-bottom:0;} .source-view{width:100%;margin-bottom:18px;border:1px solid #cacaca;}.source-view .source-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555555;text-shadow:1px 1px 1px #ffffff;height:28px;}.source-view .source-header .meta{float:left;padding:4px 0;font-size:14px;} .source-view pre{margin:0;padding:12px;border:none;} .source-view #sourcecode{margin:0;padding:0;border:none;width:100%;height:600px;} .source-view .source-diff{background-color:#f5f5f5;}.source-view .source-diff pre{margin:0;padding:0 0 0 6px;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.source-view .source-diff pre:hover{background-color:#ffc;} .source-view .source-diff table td{padding:0px;} .source-view .source-diff .new{background-color:#DFD;} .source-view .source-diff .old{background-color:#FDD;} .source-view .source-diff .chunk{background-color:#e8e8e8;color:#999999;} .source-view .source-diff .lineNo{color:#aaa;background-color:#e8e8e8;padding:0 6px;text-align:right;border-right:1px solid #ddd;font-family:monospace;} .source-view .image-blob{padding:10px;max-width:600px;} .blame-view{width:100%;background-color:#f5f5f5;}.blame-view td{vertical-align:top;padding:8px;} .blame-view tr{border-bottom:1px solid #cccccc;} .blame-view tr:last-child{border-bottom:0;} .blame-view .line{font-weight:700;border-right:1px solid #cccccc;} .blame-view .commit{font-weight:700;border-right:1px solid #cccccc;} .blame-view pre{margin:0;padding:0;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .commit-view{width:100%;margin-bottom:18px;border:1px solid #cacaca;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.commit-view .commit-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;text-shadow:1px 1px 1px #ffffff;}.commit-view .commit-header h4{padding:4px 0;} .commit-view .commit-body{padding:8px;} .commit-list{list-style-type:none;}.commit-list li{padding:8px 5px 8px 5px;font-size:14px;font-weight:700;border-bottom:1px solid #d7d7d7;}.commit-list li .meta{font-weight:normal;font-size:14px;color:#999999;} .commit-list li:last-child{border-bottom:0;margin-bottom:25px;} .repository{margin-bottom:18px;border:1px solid #d7d7d7;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.repository .repository-header{border-bottom:1px solid #d7d7d7;text-shadow:1px 1px 1px #ffffff;padding:8px;font-weight:700;font-size:14px;} .repository .repository-body{padding:8px;background-color:#f7f7f7;}.repository .repository-body p{margin:0;} .readme-view{width:100%;margin-bottom:18px;border:1px solid #cacaca;}.readme-view .readme-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555555;text-shadow:1px 1px 1px #ffffff;height:28px;}.readme-view .readme-header .meta{float:left;padding:4px 0;font-size:14px;} .readme-view #readme-content{padding:30px;color:#000000;} .rss{display:inline-block;width:16px;height:16px;*margin-right:.3em;line-height:16px;vertical-align:text-top;background-image:url("../img/feed.png");background-position:0 0;background-repeat:no-repeat;}.rss:last-child{*margin-left:0;} [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;} .icon-white{background-image:url("../img/glyphicons-halflings-white.png");} .icon-spaced{padding:0 3px 0 3px;} .icon-glass{background-position:0 0;} .icon-music{background-position:-24px 0;} .icon-search{background-position:-48px 0;} .icon-envelope{background-position:-72px 0;} .icon-heart{background-position:-96px 0;} .icon-star{background-position:-120px 0;} .icon-star-empty{background-position:-144px 0;} .icon-user{background-position:-168px 0;} .icon-film{background-position:-192px 0;} .icon-th-large{background-position:-216px 0;} .icon-th{background-position:-240px 0;} .icon-th-list{background-position:-264px 0;} .icon-ok{background-position:-288px 0;} .icon-remove{background-position:-312px 0;} .icon-zoom-in{background-position:-336px 0;} .icon-zoom-out{background-position:-360px 0;} .icon-off{background-position:-384px 0;} .icon-signal{background-position:-408px 0;} .icon-cog{background-position:-432px 0;} .icon-trash{background-position:-456px 0;} .icon-home{background-position:0 -24px;} .icon-file{background-position:-24px -24px;} .icon-time{background-position:-48px -24px;} .icon-road{background-position:-72px -24px;} .icon-download-alt{background-position:-96px -24px;} .icon-download{background-position:-120px -24px;} .icon-upload{background-position:-144px -24px;} .icon-inbox{background-position:-168px -24px;} .icon-play-circle{background-position:-192px -24px;} .icon-repeat{background-position:-216px -24px;} .icon-refresh{background-position:-240px -24px;} .icon-list-alt{background-position:-264px -24px;} .icon-lock{background-position:-287px -24px;} .icon-flag{background-position:-312px -24px;} .icon-headphones{background-position:-336px -24px;} .icon-volume-off{background-position:-360px -24px;} .icon-volume-down{background-position:-384px -24px;} .icon-volume-up{background-position:-408px -24px;} .icon-qrcode{background-position:-432px -24px;} .icon-barcode{background-position:-456px -24px;} .icon-tag{background-position:0 -48px;} .icon-tags{background-position:-25px -48px;} .icon-book{background-position:-48px -48px;} .icon-bookmark{background-position:-72px -48px;} .icon-print{background-position:-96px -48px;} .icon-camera{background-position:-120px -48px;} .icon-font{background-position:-144px -48px;} .icon-bold{background-position:-167px -48px;} .icon-italic{background-position:-192px -48px;} .icon-text-height{background-position:-216px -48px;} .icon-text-width{background-position:-240px -48px;} .icon-align-left{background-position:-264px -48px;} .icon-align-center{background-position:-288px -48px;} .icon-align-right{background-position:-312px -48px;} .icon-align-justify{background-position:-336px -48px;} .icon-list{background-position:-360px -48px;} .icon-indent-left{background-position:-384px -48px;} .icon-indent-right{background-position:-408px -48px;} .icon-facetime-video{background-position:-432px -48px;} .icon-picture{background-position:-456px -48px;} .icon-pencil{background-position:0 -72px;} .icon-map-marker{background-position:-24px -72px;} .icon-adjust{background-position:-48px -72px;} .icon-tint{background-position:-72px -72px;} .icon-edit{background-position:-96px -72px;} .icon-share{background-position:-120px -72px;} .icon-check{background-position:-144px -72px;} .icon-move{background-position:-168px -72px;} .icon-step-backward{background-position:-192px -72px;} .icon-fast-backward{background-position:-216px -72px;} .icon-backward{background-position:-240px -72px;} .icon-play{background-position:-264px -72px;} .icon-pause{background-position:-288px -72px;} .icon-stop{background-position:-312px -72px;} .icon-forward{background-position:-336px -72px;} .icon-fast-forward{background-position:-360px -72px;} .icon-step-forward{background-position:-384px -72px;} .icon-eject{background-position:-408px -72px;} .icon-chevron-left{background-position:-432px -72px;} .icon-chevron-right{background-position:-456px -72px;} .icon-plus-sign{background-position:0 -96px;} .icon-minus-sign{background-position:-24px -96px;} .icon-remove-sign{background-position:-48px -96px;} .icon-ok-sign{background-position:-72px -96px;} .icon-question-sign{background-position:-96px -96px;} .icon-info-sign{background-position:-120px -96px;} .icon-screenshot{background-position:-144px -96px;} .icon-remove-circle{background-position:-168px -96px;} .icon-ok-circle{background-position:-192px -96px;} .icon-ban-circle{background-position:-216px -96px;} .icon-arrow-left{background-position:-240px -96px;} .icon-arrow-right{background-position:-264px -96px;} .icon-arrow-up{background-position:-289px -96px;} .icon-arrow-down{background-position:-312px -96px;} .icon-share-alt{background-position:-336px -96px;} .icon-resize-full{background-position:-360px -96px;} .icon-resize-small{background-position:-384px -96px;} .icon-plus{background-position:-408px -96px;} .icon-minus{background-position:-433px -96px;} .icon-asterisk{background-position:-456px -96px;} .icon-exclamation-sign{background-position:0 -120px;} .icon-gift{background-position:-24px -120px;} .icon-leaf{background-position:-48px -120px;} .icon-fire{background-position:-72px -120px;} .icon-eye-open{background-position:-96px -120px;} .icon-eye-close{background-position:-120px -120px;} .icon-warning-sign{background-position:-144px -120px;} .icon-plane{background-position:-168px -120px;} .icon-calendar{background-position:-192px -120px;} .icon-random{background-position:-216px -120px;} .icon-comment{background-position:-240px -120px;} .icon-magnet{background-position:-264px -120px;} .icon-chevron-up{background-position:-288px -120px;} .icon-chevron-down{background-position:-313px -119px;} .icon-retweet{background-position:-336px -120px;} .icon-shopping-cart{background-position:-360px -120px;} .icon-folder-close{background-position:-384px -120px;} .icon-folder-open{background-position:-408px -120px;} .icon-resize-vertical{background-position:-432px -119px;} .icon-resize-horizontal{background-position:-456px -118px;} .icon-hdd{background-position:0 -144px;} .icon-bullhorn{background-position:-24px -144px;} .icon-bell{background-position:-48px -144px;} .icon-certificate{background-position:-72px -144px;} .icon-thumbs-up{background-position:-96px -144px;} .icon-thumbs-down{background-position:-120px -144px;} .icon-hand-right{background-position:-144px -144px;} .icon-hand-left{background-position:-168px -144px;} .icon-hand-up{background-position:-192px -144px;} .icon-hand-down{background-position:-216px -144px;} .icon-circle-arrow-right{background-position:-240px -144px;} .icon-circle-arrow-left{background-position:-264px -144px;} .icon-circle-arrow-up{background-position:-288px -144px;} .icon-circle-arrow-down{background-position:-312px -144px;} .icon-globe{background-position:-336px -144px;} .icon-wrench{background-position:-360px -144px;} .icon-tasks{background-position:-384px -144px;} .icon-filter{background-position:-408px -144px;} .icon-briefcase{background-position:-432px -144px;} .icon-fullscreen{background-position:-456px -144px;} .dropup,.dropdown{position:relative;} .dropdown-toggle{*margin-bottom:-3px;} .dropdown-toggle:active,.open .dropdown-toggle{outline:0;} .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";opacity:0.3;filter:alpha(opacity=30);} .dropdown .caret{margin-top:8px;margin-left:2px;} .dropdown:hover .caret,.open .caret{opacity:1;filter:alpha(opacity=100);} .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:4px 0;margin:1px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} .dropdown-menu .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;} .dropdown-menu .dropdown-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} .dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#4183c4;} .open{*z-index:1000;}.open .dropdown-menu{display:block;} .pull-right .dropdown-menu{right:0;left:auto;} .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";} .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .fade{opacity:0;filter:alpha(opacity=0);-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;filter:alpha(opacity=100);} .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} .close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;*line-height:20px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9;} .btn:active,.btn.active{background-color:#cccccc \9;} .btn:first-child{*margin-left:0;} .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} .btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} .btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} .btn-large [class^="icon-"]{margin-top:1px;} .btn-small{padding:5px 9px;font-size:11px;line-height:16px;} .btn-small [class^="icon-"]{margin-top:-1px;} .btn-mini{padding:2px 6px;font-size:11px;line-height:14px;} .btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} .btn{border-color:#ccc;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn-primary{background-color:#417ac4;background-image:-moz-linear-gradient(top, #4183c4, #416dc4);background-image:-ms-linear-gradient(top, #4183c4, #416dc4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#4183c4), to(#416dc4));background-image:-webkit-linear-gradient(top, #4183c4, #416dc4);background-image:-o-linear-gradient(top, #4183c4, #416dc4);background-image:linear-gradient(top, #4183c4, #416dc4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4183c4', endColorstr='#416dc4', GradientType=0);border-color:#416dc4 #416dc4 #2c4c8d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#416dc4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#416dc4;*background-color:#3862b4;} .btn-primary:active,.btn-primary.active{background-color:#3257a0 \9;} .btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;*background-color:#df8505;} .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} .btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a;} .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} .btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249;} .btn-success:active,.btn-success.active{background-color:#408140 \9;} .btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0;} .btn-info:active,.btn-info.active{background-color:#24748c \9;} .btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;*background-color:#151515;} .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} .btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} .btn-group:after{clear:both;} .btn-group:first-child{*margin-left:0;} .btn-group+.btn-group{margin-left:5px;} .btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} .btn-group>.btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} .btn-group>.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:4px;*padding-bottom:4px;} .btn-group>.btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;} .btn-group>.btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;} .btn-group>.btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;} .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} .btn-group.open .btn-primary.dropdown-toggle{background-color:#416dc4;} .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} .btn .caret{margin-top:7px;margin-left:0;} .btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} .btn-mini .caret{margin-top:5px;} .btn-small .caret{margin-top:6px;} .btn-large .caret{margin-top:6px;border-left-width:5px;border-right-width:5px;border-top-width:5px;} .dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;} .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} .alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} .alert-heading{color:inherit;} .alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} .alert-block{padding-top:14px;padding-bottom:14px;} .alert-block>p,.alert-block>ul{margin-bottom:0;} .alert-block p+p{margin-top:5px;} .nav{margin-left:0;margin-bottom:18px;list-style:none;} .nav>li>a{display:block;} .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} .nav>.pull-right{float:right;} .nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} .nav li+.nav-header{margin-top:9px;} .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} .nav-list>li>a{padding:3px 15px;} .nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#4183c4;} .nav-list [class^="icon-"]{margin-right:2px;} .nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} .nav-tabs:after,.nav-pills:after{clear:both;} .nav-tabs>li,.nav-pills>li{float:left;} .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} .nav-tabs{border-bottom:1px solid #ddd;} .nav-tabs>li{margin-bottom:-1px;} .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} .nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} .nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#4183c4;} .nav-stacked>li{float:none;} .nav-stacked>li>a{margin-right:0;} .nav-tabs.nav-stacked{border-bottom:0;} .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} .nav-pills.nav-stacked>li>a{margin-bottom:3px;} .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;} .nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#4183c4;border-bottom-color:#4183c4;margin-top:6px;} .nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#2c5d8d;border-bottom-color:#2c5d8d;} .nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333;} .nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} .nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} .tabs-stacked .open>a:hover{border-color:#999999;} .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} .tabbable:after{clear:both;} .tab-content{overflow:auto;} .tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} .tab-content>.active,.pill-content>.active{display:block;} .tabs-below>.nav-tabs{border-top:1px solid #ddd;} .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} .tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} .tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} .tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} .tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} .tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} .tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} .tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} .navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;} .navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;border-bottom:1px solid #cacaca;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.4), 0 0 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 0 rgba(255,255,255,0.4), 0 0 10px rgba(0,0,0,0.1);box-shadow:0 1px 0 rgba(255,255,255,0.4), 0 0 10px rgba(0,0,0,0.1);} .navbar .container{width:auto;} .nav-collapse.collapse{height:auto;} .navbar{color:#333333;}.navbar .brand:hover{text-decoration:none;} .navbar .brand{float:left;display:block;padding:10px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#7b7b7b;text-shadow:1px 1px 1px #ffffff;font-weight:700;letter-spacing:1px;} .navbar .navbar-text{margin-bottom:0;line-height:40px;} .navbar .navbar-link{color:#222222;}.navbar .navbar-link:hover{color:#4183c4;} .navbar .btn,.navbar .btn-group{margin-top:5px;} .navbar .btn-group .btn{margin:0;} .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} .navbar-form:after{clear:both;} .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} .navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;} .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} .navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} .navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#ffffff;border:1px solid #b3b3b3;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#cccccc;} .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} .navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} .navbar-fixed-top{top:0;} .navbar-fixed-bottom{bottom:0;} .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} .navbar .nav.pull-right{float:right;} .navbar .nav>li{display:block;float:left;} .navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#222222;text-decoration:none;font-weight:700;} .navbar .btn{display:inline-block;padding:4px 10px 4px;margin:5px 5px 6px;line-height:18px;} .navbar .btn-group{margin:0;padding:5px 5px 6px;} .navbar .nav>li>a:hover{color:#4183c4;text-decoration:none;background:transparent;} .navbar .nav .active>a,.navbar .nav .active>a:hover{color:#4183c4;text-decoration:none;} .navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#eaeaea;border-right:1px solid #fafafa;} .navbar .nav.pull-right{margin-left:10px;margin-right:0;} .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#f4f4f4;background-image:-moz-linear-gradient(top, #fafafa, #eaeaea);background-image:-ms-linear-gradient(top, #fafafa, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fafafa), to(#eaeaea));background-image:-webkit-linear-gradient(top, #fafafa, #eaeaea);background-image:-o-linear-gradient(top, #fafafa, #eaeaea);background-image:linear-gradient(top, #fafafa, #eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#eaeaea', GradientType=0);border-color:#eaeaea #eaeaea #c4c4c4;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#eaeaea;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{background-color:#eaeaea;*background-color:#dddddd;} .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d1d1d1 \9;} .navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} .btn-navbar .icon-bar+.icon-bar{margin-top:3px;} .navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} .navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} .navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} .navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} .navbar .nav li.dropdown .dropdown-toggle .caret,.navbar .nav li.dropdown.open .caret{border-top-color:#555555;border-bottom-color:#999999;} .navbar .nav li.dropdown.active .caret{opacity:1;filter:alpha(opacity=100);} .navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:transparent;} .navbar .nav li.dropdown.active>.dropdown-toggle:hover{color:#ffffff;} .navbar .pull-right .dropdown-menu,.navbar .dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right .dropdown-menu:before,.navbar .dropdown-menu.pull-right:before{left:auto;right:12px;} .navbar .pull-right .dropdown-menu:after,.navbar .dropdown-menu.pull-right:after{left:auto;right:13px;} .breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;font-weight:700;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} .breadcrumb .divider{padding:0 5px;color:#999999;} .breadcrumb .active a{color:#333333;} .download-buttons{padding:0 8px 0 0;display:inline-block;} .rss-icon{clear:both;display:inline-table;} .pagination{height:36px;margin:18px 0;} .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} .pagination li{display:inline;} .pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} .pagination a:hover,.pagination .active a{background-color:#f5f5f5;} .pagination .active a{color:#999999;cursor:default;} .pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} .pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .pagination-centered{text-align:center;} .pagination-right{text-align:right;} .pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} .pager:after{clear:both;} .pager li{display:inline;} .pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} .pager a:hover{text-decoration:none;background-color:#f5f5f5;} .pager .next a{float:right;} .pager .previous a{float:left;} .pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;} .modal-open .dropdown-menu{z-index:2050;} .modal-open .dropdown.open{*z-index:2050;} .modal-open .popover{z-index:2060;} .modal-open .tooltip{z-index:2070;} .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} .modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} .modal.fade.in{top:50%;} .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} .modal-body{overflow-y:auto;max-height:400px;padding:15px;} .modal-form{margin-bottom:0;} .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} .modal-footer:after{clear:both;} .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} .modal-footer .btn-group .btn+.btn{margin-left:-1px;} .tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} .tooltip.top{margin-top:-2px;} .tooltip.right{margin-left:2px;} .tooltip.bottom{margin-top:2px;} .tooltip.left{margin-left:-2px;} .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .tooltip-arrow{position:absolute;width:0;height:0;} .popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} .popover.right{margin-left:5px;} .popover.bottom{margin-top:5px;} .popover.left{margin-left:-5px;} .popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .popover .arrow{position:absolute;width:0;height:0;} .popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} .popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} .popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} .thumbnails:after{clear:both;} .row-fluid .thumbnails{margin-left:0;} .thumbnails>li{float:left;margin-bottom:18px;margin-left:20px;} .thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} a.thumbnail:hover{border-color:#4183c4;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} .thumbnail .caption{padding:9px;} .label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} .label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} .label-important,.badge-important{background-color:#b94a48;} .label-important[href],.badge-important[href]{background-color:#953b39;} .label-warning,.badge-warning{background-color:#f89406;} .label-warning[href],.badge-warning[href]{background-color:#c67605;} .label-success,.badge-success{background-color:#468847;} .label-success[href],.badge-success[href]{background-color:#356635;} .label-info,.badge-info{background-color:#3a87ad;} .label-info[href],.badge-info[href]{background-color:#2d6987;} .label-inverse,.badge-inverse{background-color:#333333;} .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} .progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} .progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} .progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} .progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} .progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);} .progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .accordion{margin-bottom:18px;} .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .accordion-heading{border-bottom:0;} .accordion-heading .accordion-toggle{display:block;padding:8px 15px;} .accordion-toggle{cursor:pointer;} .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} .carousel{position:relative;margin-bottom:18px;line-height:1;} .carousel-inner{overflow:hidden;width:100%;position:relative;} .carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} .carousel .item>img{display:block;line-height:1;} .carousel .active,.carousel .next,.carousel .prev{display:block;} .carousel .active{left:0;} .carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} .carousel .next{left:100%;} .carousel .prev{left:-100%;} .carousel .next.left,.carousel .prev.right{left:0;} .carousel .active.left{left:-100%;} .carousel .active.right{left:100%;} .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} .carousel-caption h4,.carousel-caption p{color:#ffffff;} .hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} .hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;} .pull-right{float:right;} .pull-left{float:left;} .hide{display:none;} .show{display:block;} .invisible{visibility:hidden;} .space-right{padding:0 8px 0 0;} .space-left{padding:0 0 0 8px;} .CodeMirror{line-height:16px;font-family:Consolas,"Liberation Mono",Courier,monospace;font-size:12px;position:relative;overflow:hidden;} .CodeMirror-scroll{overflow-x:auto;overflow-y:hidden;height:auto;position:relative;outline:none;} .CodeMirror-scrollbar{float:right;overflow-x:hidden;overflow-y:scroll;margin-left:-1px;} .CodeMirror-scrollbar-inner{width:1px;} .CodeMirror-scrollbar.cm-sb-overlap{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%;padding-right:3px;} .CodeMirror-gutter-text{color:#aaa;text-align:right;padding:.4em .2em .4em .4em;white-space:pre !important;} .CodeMirror-lines{padding:.4em;white-space:pre;cursor:text;margin-left:5px;} .CodeMirror-lines *{pointer-events:none;} .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;} .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, 0.4);} .cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id){filter:progid:dximagetransform.microsoft.gradient(enabled=false);} .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, 0.4);} .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:#cc7;} .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;} div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22;} web/img/000077500000000000000000000000001516076205000124115ustar00rootroot00000000000000web/img/feed.png000066400000000000000000000013371516076205000140260ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ¤RMHTQ>÷^'Ó Igü™RcMA-.ªMD+-ŠE’ Q-‚ Û¸hSeAP´m•`-7©é’?MšæØó/±Ô§ã{ïÞ¾;Ž ôà{çÞs¾óÝsÏ=L)Eÿó±ÅÏ3X0 ô¯`bÝ„ý¯ï]§ªŠh~–äÌ8ɯ_HÍ̽#)!Þ¡ÈŸ8`Ù­Ñdæñ‘«ü¹Nœ-å{²Iðóº·üoÂfû€R˜åû“â ‘üaüð†äØä]ÄjQÜ$°±‰81¦Š%&Öðý%;¹;‡ä`'9}¡FR²zcotõ°ÙÀ[  „–˜PÌCQ[Á|¹¤ÆCäô>FüÊæ&;S$a”:Lʘ ÂÄ—1¡û"ߥ¦“"9®Dìùú&Fœž6bŽE®ƒä:Z^ÂÓÜÍH¼­ ×8ý¡&5;AÌJ´5¡±äõÕrÌ8nwwßYyÕ`ÈÉQ…e$üÙµúôï²ói4Œ÷"ž™êÕûß6 8‚î‰@ö9–’±ZrØ8*ê«äÞž’BvhhŽÌ¥üSQ˜ ÇxLè‰ðïºÄ¶%‘=ðyš–—òàž'!zEVz@Y Ž s ÐÃâ· `ýˆùª3òí£2‘ãIvcd‹§™l‡˜Ð7§#k=¸á*.ÎÅ{·sû"öeÑñµìê炾¥æŒÝ²E.˜¤ÌE½.\$W@sˆVÛ±Ö”V5oF¸CÊy• îÍ3(b9¯G„²ôO—{Ë öf¦/€®˜À”Z4û¬öŽÝX/ë•ßaÃV{ר9Mú%À´’ ̵wIEND®B`‚web/img/glyphicons-halflings-white.png000077500000000000000000000211111516076205000203600ustar00rootroot00000000000000‰PNG  IHDRÕŸ˜Ó³{ÙPLTEÿÿÿùùùÿÿÿÿÿÿýýýmmmÿÿÿÿÿÿÿÿÿÿÿÿðððþþþöööüüüÿÿÿÿÿÿÚÚÚÂÂÂôôôÿÿÿÿÿÿôôô÷÷÷ÿÿÿ³³³ýýýâââ°°°ÿÿÿÿÿÿûûûçççþþþÿÿÿíííÏÏÏýýýöööíííûûûçççúúúááá’’’þþþþþþÁÁÁ˜˜˜tttáááÐÐÐóóó»»»¡¡¡€€€ýýýÔÔÔbbbÿÿÿÕÕÕøøøÜÜÜúúúûûûéééûûûýýýýýýÑÑÑòòòüüüøøøëëëüüü¶¶¶ÆÆÆåååîîîõõõýýýeeegggððð¶¶¶ààà÷÷÷úúúéééåååúúúøøøËËËÿÿÿ„„„ñññxxx÷÷÷ÝÝÝùùùÈÈÈÒÒÒìììúúúÞÞÞâââæææóóó›››¨¨¨¥¥¥ÜÜÜîîîÿÿÿñññÉÉÉðððÿÿÿÿÿÿÞÞÞÆÆÆ¼¼¼ëëëÖÖÖÐÐÐâââùùùôôôâââìììõõõ´´´ÿÿÿýýýûûûüüüúúúæææäääüüü÷÷÷°°°™™™ýýýìììüüüÁÁÁéééÿÿÿÚÚÚððððððõõõñññþþþøøøþþþŽŽŽâââûûûùùùÜÜÜÿÿÿòòòúúúŸŸŸííí÷÷÷öööèèèóóóúúúõõõõõõ¦¦¦ËËËúúúøøøÓÓÓëëëúúúëë몪ªóóóííí¢¢¢ÏÏÏÚÚÚÖÖÖ¢¢¢ëëëâââùùùUUUÍÍÍÿÿÿÖÖÖãããáááêêêüüüÿÿÿöööûûûóóóôôôÌÌÌÿÿÿÿÿÿùùùõõõÿÿÿòòòýýýÙÙÙüüüûûûüüüééé¿¿¿ûûûêêêéééþþþÿÿÿørOæòtRNSÔÏñ#ïŸ_ /©ðÆâ¿oS·ß?†ÅCá kD¯ÂÀOS_ ¥š²ŒÓ6Ðà>4!~a §@1Ñ_'oÄn¢Ò‹‘€M†¡“3±BQj™¶p&%!lµÃ"Xqr;€— A[‚<`‰am}4…3/0Iˆ¨PCM!6(*gK&YQ¦GDP,å`’{VP¤-êxÁ)hÝ7‡e1]ôˆßW¿³$—‡1ƒbÄzSÜ•cOÙÍ]ÀŠ–U;Zié»'yÜ"€âÐÐ‘ÝØ†‰K 64ÖYœ*.vè@²¸îŽc.};‡ïŸtN%¨DIª˜ÊÐ !Z¶Ð5LñH£2Ú6 ŒƒÉ¯ŽÖ"Š Ô-b±E,,)ÊÀ BŒ·¦>m¹ªÃãúnøö6pmŸRöO wm@°ÝÌVÝ#?É'C…È‘Z#©Žqž‡ìÀbÒÓ|$½:Ü)‰Â/E¾%÷ânR¹q—CàhnµÉ%õiÓÌ“­º¶¶ß}lƒm ?iÿdâdÃ"€,Ø­Ç`¬Hñ"r.z¡¼‹ŽÁ~ýìü(bðQÜU&ê½—)–5õêX#•§ òé™EMªæÜR<Í*p[€[%.©OÉÌ£˜¥k7“lIo°ý¨ý“¶ßJ°F  ¥lV!̡ăuH‚`Ƽ™€—›ç‚&¢,Çz´ÉRk$¤ò¨|$ölŠ»¼Xbü¢âéÇjߪÈdU±û?Σ$Hµî¸©W±¾$Uû'…ÆÅHÜE3*Õ­º€µµU\}ê­ý†(Ò ¤zhVk}gÇu«Rk$¤ò%¨|‰T¨|Úêck¦ç³"ãžä±Dç”ý«ƒ_W+‹®”Ê.QòÒÅ)Õ@«ý“ƽ€H¢À›Íbµs¸ÔlžŽT´©·Dÿô­RÄ2Xm£#a Ýêº3lYÃÎzÌj¹ŽÔã’š#!Þ 4þJ´Ä8Ñ(Œòcµv™‰¾t]­a·˜T™Çàø Ò÷D Î…à¼áQ?^-‹Õ_^$:\ÿìÞV  $«•N|ì=(vˆZ'q6¹Zð׆‡×üB5VìÌî!y†´¼3äßKœÿ㱿bàv4Œñxðëê£âR]al—í!ÔþIÛo‡P‰@Åt¥äVy”ºîàLïÿÙªmlµÚ¿I¨Ub|[*°¶lke'*¾WdîÀÝdà³ðïD·Ó}\W›ƒ_Wß´ù¶¤rÐNÚ?™øÛvÞ«ÁÛ²X%§Ž0u‡öoui*„üJV·€Æ¦‡b%†}ôãˆi5I¥YlNŸE-wÐÏ‚ûf_W3mþIåà…Äý“…—-ŒmƒÊ¬²Q)“S µÖk´«TC7êím¤<"ÄôÜŒ‡b‹T|ìÆ'¦Õ$µÒ˜Ÿ£óóÖR&>¥êO pœõºš¾ù…ê6ݬÒöçú½t±¨î¥S­ŽN\©×¯LŒîmÕø\ÈÎÑÊÄr@¦3žuT b7úÓt.5.q©ôÈ3²r0ü=™8T¿ªi­J©\ëÈ6uF ”²R¸32^÷íñ'ŪŠóÀí±xˆâI« ïÒF„8O{%8­žkJšÓMSÈ´dâBEdæÑè ïW‚CYÃ÷O:/OŒN/—I‹ê_=½€xFE”Ñ! Í=¥æi:oÁ~’¡· yþ?¶š'·š'·š[Í“[Í“[Í“[Í“[Í­–è».¹U>±$÷P–ƦŠc%†] Û\c©´:é| ý,e¯SœZ,‘oš¿XríäÎËXº!ëRæ”ÇÆò@áZøv‚ ‡0Ôç>?Á*ç® Ô<ðþÕ|ø«¼N6þ0ú¹;{¯ažd³ê2Ôév+Däó^tààúÑ[q!òÛžV}Èøf«œÛ¨ÏŽÎ×Yÿêeॗ€Ë)Vyl|" f÷UDzqˆ@ëˆÇ¼˜4Y-˜³YýÍ-!¶6a“žŠB:o%ñJ¤ÛI±´—UQ|£UÆK¨O `¢®=\ ý´­ò:ë0¾°Àx …±Paó‰Ìuˆ@œ»!ç»K†âPÏdÕxhw1>×$jγ“vöZdàè™xñ«ÕSšUAÅ&[URßd•ý7ðøÂz·ký«/˜œðr¢U^¬Žä £ó—w:I.àVÇ®ëôÿc>qí.!·zSÛr&«³Õ2…)Wgù ¾…R -ÎiãQ 8¿çØûPa\О×U%•iÝ¡¦þUï_=àÃpÊø ›Lu ê(îžN¹?†Ÿ 0?Æ:]½Î¬ä†ÔÏt¬B%“U|™úù²¡NsorNÿ¹f¶ú ø,»P !­v" Y¬6¼hLï_­@@…bé·s¯c¶¬£qg˜v4|Â|0lÏŸÐëÔ$SŒõ9ŽîòbʱšÑj#ŽŸ£~žƒÁÒÏ?o²÷}‘‘ƒð}7sAPm:IV¹=n•÷¯ !ôþÕ{±›{ÍÝh¼ÎEࢪ£8¤sèu€ÍoL®ëÈTð$ñ„õ;VÝú¹­sõöcqìD¦3ðø¸ñ üÛ༂3.D«Bˆ«éý«³B4Ì&ìV'ØÜ TÅ `õà½Dï6ÿ™žšÏ·óqýyùjû8V‰Õæ*ëÖíX%ý³›@s«\ÞjrNµ$à|ö=5þΆ 'ìmU«iý«Kýi€%C™ÉIð:ssaÆ…`*`óµ=úl½÷)>ÈuÕ˜MeuSš›·¨Iò_ÎO÷ˆLü£_©}o&©íÀjzÿêÝpèºþ{¨¤ÖáÜlu:OñÁ®«ÆÌ)«s¤%Q@ãÍ$Þ<]f› € xO%…÷PCbhr2£ÕôþÕ¼ŸèýPK·Êëpžf5½Në3^o«ù©ú¼]êe²JÊêÁ¤iÐB˜œ464†€^tï‡uÙ²þUÖŒ:G4'¿ò22YêpÎëˆÌu¦G'/PyÙ4?¡þè.ÕæSB„P_>‘ÑëšI 1t3Γ÷BäÉ­æÉ­æÉ­æÉ­æVóäVóäVóäVóäVs«æÃ]î³!×67(ªÇg ¯¤¥‹Šyƒ°@†” 4>QÚò ßÕV«F­}^XׇìÚ¼ˆ’Õjµ¦e÷26 Lž³Ð%žòY´Gâh û³šl‰C­}­)Óâ< ˆ!ÚE ôðÇE½PçZWZ™½ŒV+þ@†ÏR 5{@ou—Ɇ4²‚²&…„˜´H…Ѭ6÷eµy V‹ˆÝ€˜VÅ¥ÖÁ¬¾ácqZ„Þ’©rìÓJÆçyBêæyžÓˆFzÑõFN¢$¢HbÈÈÕ³*+jÕqòÑÎÀ Ú«˜kÝ¿UàX„¯lºe·ìÄö¾Ä1“ÕÊÚdà0d^õ-‘B%‰ƒ}ê œø¸{Yõ¡™%rÇ*Òj5Ak5¦u«³"Ì,·:~éÒ¸áY¾Ü~ h™÷ûÄSA~¿­6ì ¼fuÁlÕ‡fµŠ{ȵQtATHÐZˆkÀªŠÆ­/_°¸ÕSŸî¼náû¹ ±u']bù]|m`«B…ñÄÁÏÀ¡J,O$íÁdu]·Zs® ÀFLß:©Äùúú›aõø‹À‹Ç™ÕÂÌT4Ïoà~by?wpÇj滥ÖAœ…Ø(€xù]„†¦ú…ªfÕí¶~anÖ§/ž©¸¿^ÈdÕÚ²öcØÚú˜Õ‡,!ÄÐ1©øi&–xi_VK@ip«Íƒ9¯ÐÞVi%a; Õ¯L?‰0J“*¹’šÅª5ܶ¸UÑ·Š“'Á¬ºx^î²6âV[¥^ à{öeU™ÈÒ|—:0ø=0‡»ÈdÛ«o‡¨ç*J“q%•[­ÆõYÃN¸˜.sQ„L‹udš[2×ð9þIýó:WÁn—ÔÈÿÐÙŽÊm™Xl¥Úƒ¾6×!lNl‡ÙVÙÕ§KU¼¤¤jVã\J%©UߊßB°ŽLcKfáb×ö>a“=Òb›~¹R]aG%[ú÷×js@«/9ðMطݘU×>yɲXÇ@}³ ” ëëF¢´tÜg^‚ÛvO\°žÓ¸wv‚p•ϯz3›K5i¤!$P>”ÄÅ€¹'Ò”VÆ›¬”¢Lž2r´ú@¤UMÃÉKÃúZ¯õ‰¹å6Ö×ÀtwŒë§ŸÂ¦bä„mß1âh|ô|É]}~¹0øÀMjA¢À´Ò(JâŠÝÁ­JP68ÌC&yrÈÌ׉e}­jŽ_cËJ½?êI0¬¯kêÛ>š«W™‹áø Æû‹™¯é|¡B¾Þá."TEXd Ô8”Ä!cwµ*E(ÎJ)ÊåÉ!Î[W"­j_ÔÃáТeX_×ÐXB;¤÷¯o°†O0~?¬:P½Cã (.²í¶±[·Ž‘‘ò!Wq£%ßÔ*leÃÀY)E™<^ˆKåZ¹T•60Ö.ðõ#«µøA\ý¤Á5;RmÆtkdÂ/8§)5~‚¿ ¬^0Ú #åCkg–¦¶eÍÌy)²—±Í¶¿‘ÔºÒ°6Ä¥ª<€(?Æ×&ÉõõuîA„áVŸ’õm0^h.—tÌxR*ô×aô©'ö:,¥H§|èÅ–ªÏ l5z„;8+e¦#b'#|û}2Æw(|Kc–J½ Èl6 뀶¾®wù‹^‚ÕŒo×—iúœ3HÓ êR –ŽÌ”9Š,Y“gP«Ö°:N œ[5SÃöû‰R‡!¢§ä[)•ç]€úœi}`úúºm¬’¸N±4Ð¥¹²ãvÑ`|;f¬(®´Fïlt©„¢LÔ8”Ä÷Z#½Aï–¤O%ÕÀY)N¹U®5YêÑeœ¼d–JÎE3dZذ’þÇ<Èx·ÇñØÉñä¶e •@ùPÚ§ÏþÎFúTR œ•2S¡Â·ßüΦ/uˆZ°~ðšCæ3ÇÔXÊz¼ÍÓU¨žâxõ\2s«ñä¶e •DùD.çÉåfBO&enÝ'iÈåR%™?Fy¸VsS~$uˆ®mœw()Á´r”ºo³0*Dí˜Õi!3½:On[Bµ!sʇBäp>Ý£HTÙ1òè ;ö8M×jnʤ‘Ó¤ï¼äqpÞ 1hò^ˆ<¹Õ<¹Õ<¹ÕÜjžÜjžÜjžÜjžÜjnÕÜßû–qÕ(qpõOkª’Ô}¸ßøI?TY8H«®mhyK¸Ìu5ÍÏÂÎIœt÷eÕnQBÞ—`µRÄÂ`¯·EÀPË ­Ú¦ö˜½¹xû™«ž½>¹>€â‘¡yt¾{?|œ×'j)”ÉÆ€µ}YUÛÏäUùÛÜ{ç@Vå‡/€J1ìF+€¬¿7䀉[OW«O[æù ø¹‘‰y³ÇUY«ª•ˆõ!?BôÈD%D™Wj¼>-Ai6x£z)»ÕÎU R½ùª±’7 dõÙŠ@µg‡ˆëï•\†soØ)œaÏ4ßzfŒ[«W+•±>¹¸« œÿPô>ä |•ÛqLãÑG8vâ¸âêÈ£„˜l´j©µ2ZíÆtÜß+åŒV¥ÔA¬6g<„/ŽæQ ‚H­çSrΣ“ÑçÖd}ØùYqàÔg]€sY]ç;]FëCª@5¼YÓÕ–5ÎC©3å8oÙ)kš1'ûüd6«>T *Ëʆ’§Uz(¥m)ûâ®CD `‡ÖHe/¾.ñ:ç—zN¥È9pgo &NC¦×ƒŒÞ‡¼>¶WÓøÕ°_’ñHj ñ)¤Xe6F„ 7p’m¾-è`'Öc†»Ü.Õ«‹ÂAZ=³þ^Ée8÷ÂF×;<ËûÄJ1{óãŠ+8'€Éª'„Ö‡\Aµ*¿Òø[² ‹ñR$UãY)V¹ óAyɃŒw)ŽEc#<ÕT‡ƒ”»\vW•{R­®«ÉëÉýºtÛn(–ÏzÏ!S×7o ×ï€×Ie®Žî™wõ3]ÔçbÜ—üäÇ8¹5|Æi·Ï æêRÛÚJkʱZ‘RO+ê8£U&µ:]•Z‰ieR‰’¬¢‰(üóJËMŠÞ—7—³«ÒZ@Œ²5Ýa^äº\G˜z™¯sª¾éÏU‚Ò*¥rMÏe³zT¬^Ê:ɬ‚õͦX=>Ü$ bi>³U&X¬Qoybb¹GÄøkøÍ8¯ – ÅÒ˜óýÿn).Õ¤òœÙðoã ¥À^Mmád³ZƒÊóië$s«ªo–oÞê*{»4ììÑeLb¤LÙ³""mx: `:mÉkž[ØgeTˆÑ‡Þ¬)Á„'0*T˜›Bá€{!úîIÞ ‘'·š'·š'·š'·š[Í“[Í“[Í“[Í“[]˜ZˆƒÜj QŠ.e '/¸®y÷vQ¤71ø(Z&†óÒX‘õ?(_œšZ”œÇº”){tÄÚ€m˜ZíÿÀWÑÏ)­«-C“ŠÓò´¶ jqání,Ì‹Ÿ"áIv‹¦½ULØ!h¢™Ù꛿îñ©¯Ýsçk’óAcrN‚ôþ佚ф€…VE4ö0úy˜XÜÒ~å4zʸVã³°%·ñ,é¹ßû)føÃÀqtÃp˜u¦~ã  Þø©ŽÑ*ý“©^æÖ0:åýÏéܲö3ÿ3…ÃÏJÎâOô(¦·ö£›ZB?K™^ Àv]’un ŸlçúÿôWþÀ‚¶i0´p6­ˆ[ì°©àC_5Xý#ú[¿öwX3ábñÎ廫ÄR½{ùÎâ¢NKðAîÏÿŒée S«èÓeª|Ýã¹wñ¢ÇxâºÊÞsôño>ÖP\å„”Ô•6Ò;nVÛm¯fëI$àø‰ÇûVÍ“J-ÛJ%ÖŒ¼Ž0¯óUwûYÐŽÉSõóó×n‘uÿÒmÿè—®Æù«xzµÒË—VŸÆ«ÚIµvnôWÿÚ_ÿqLZØÇòé"_—X®z‡Ã÷Æ 8Ç]Ap—‰ƒˆÍ?†¶CÍ‹Ž‘ž5È4ˆ·3ñŽzw(Ü{7e²*Ȳ`Û°¬!AÔQ“:ñKUnõ•¿Âÿzë]ú1y†V„ø›Ga°úCÿêm0îPY ÙšUx6TT&·hVï9V§ þîßÓ¬žzÑ  1[÷X®z‡ZœËÕî„Ð9ªe¢r›qóJ¸³¸NDß/ù¬¹g·þX¦ë*9o—ðíN6«DÃÃ` Ë{à÷ªIï%ËM´z9—ãTûQŽŸà–ˆþþ7fö\"jþÃ_3ÙþÖç~xBá'€ŸùÜ·ˆˆY›]*KÐŒãî“«%"úÔç5«"ðÈqxq~ü’Æ•=·‘¨j¼´ºSá>j¤Vç·&~]2 xzÀF¸ÕíŸ1X•§_yÞùDÀÎ<#N’ÕîïRB÷Ô}KôÏÿÅ/ói‰Šy†ù¿õË !V^¢ñË¿e²JŸ‰‡}/FkïñAßú7Ÿû· âëS©È×+.–(ec—ˆJ:˜zðƒªóW“ZšŠ°ëª–wïÒÙQ™þáðÅž~aÛÒê„ØÍ„öpç6,e5í¯,¬+¢–”Á,ýûÿð­óñ÷ÿt±võ%O^OøüO}ãן -Oüú7>e²ÚkC¦6£waô_þëC ¢‹|½â›9‘‘×*•šÎ‡ØWÆñ¸Aª)×U¶Jgê8<ýZ€´šx^?„ÿ¾2²u¶­Yýí³õè*^?ûÛÚ‡KC­Z¤[‚ÿ©ÿù0.’–àCµ¯@m¾çÓçß$-ßÄ/~ž|Y¥å[eþwƒeQýŸÙ×¶&cëÊOž4s|‰œc’§JåûŸwsïûXÍ8/ñš¼Î6Ï/ Ú¼;ç'F¯LN^8]ÛeadëZ 1'®Ü°ž÷^†Úü™û¼‡L³‘sBdü%Ó+M¢·`ÝãSKö8פ²÷«ìº*ƒª)gl#Ž3"Ä’gÑŠ˜S Ç㋎©qtcxxƒš|H>–¬Æø=ðŒ:³ÅçýÎmÊjÕå¬ßÿìÕUßòÁóv£qìys©Ü’žLglþC6+[FÍSWg…ö“9õ˜ƒwV3¼1µA ë N”ßD¾<Íû«ËÂ$5eÿ(s„ú¡ ÿ[Ð Û¨bú—³‡žaF.”¨]±K¡îÇIEND®B`‚web/img/glyphicons-halflings.png000077500000000000000000000330021516076205000172440ustar00rootroot00000000000000‰PNG  IHDRÕŸ‹ÂtEXtSoftwareAdobe ImageReadyqÉe<÷iTXtXML:com.adobe.xmp glyphicons_small_dark 5kÒ1¡IDATxÚí}ol\E¶§W²´^ÉzŽD$|_w'þCwìþG;ã4¶ÁäÏ<ã1ËÆÉœu˜Ä³Œ6C‚È"À ÆÒæEʼ0 "=ñ€÷,á· ïûÀ’f3oÒ 0 `àýôì¸õ¾ì—Úsnuõ½Ý¾·êT§;1K«ÄmûwëÖ­{~U§ÎuýªªÊ˜1cKά:kÎbö1çü0“ûQá‘!8dM` \¯5e]‹OY½KªA¦*…‡–9c·ã«Î8Þ ?'MÿÑ÷7kþ1ôcü¤]?¦b€ŠÑ½à¶c}x$œ’/ôõÌ$YáÑ3s¡OqY›¢+Ø*bQ8CÞ AÖÆâ,ÿ™•V”¬ÙuXx Ð÷Xðù ÝMYRÇÚ˜5¤ñ@4ð ïEì–Œ°†÷ÔÙë àjt(üJÆ®àÑM¥åü>ÀÍ(=BËJÀCšàþ’¶71Q7º% àWY}¶ù¥dlíP"o÷¤Óþ¬º˜¬HTV-/NPά¬¢Vo öŽcqhOg6¬pw½®Ãªk¼ÚˆÔÇºÒ _“ð€ç)MÒú+À¾I :øH¾î¦z̬/Éž{Æ9øOdnÁVã|–»‘ƒ_©xÊŠŸHÃÅ0k¸èÿ¬t|ˆ²°”Nºþ£‹‡nêÐ3#×3ƒu+/Ua9³%Xàq¾N²özùºg†Š§;yÒî9ïyÈ9øOÔ%~–ã¥áu©ÊÉ—*ú=±ªªÄçIÑp‘cáy}®öY(þ£ëoÖ(•u±$«^¬jŸ¾ î®»ïe\õ‰iXíñœ¬Ùã;X-¥r‡ö×ã¬ѲŠ&¾>º>¥eز’쬜¨aŸsº»?ºû?1aÛ¤^‘›¼û=7þÈ65^Ÿª8†R•6ªÒ¨*úäâ¯4|Q¯N$*>µskUqS”E Ó-î?–D²ªüGàù¡Æ¯ù ÏÕM¸#Û  ŸÖ™¥ÊŸ€U±ïòôÖÓ[û3HVUwŸd#¿)üç~@@V¼ ¨¶ƒ-s'A…Ç]—åΛdn² ¢ú3ð„7UžðuÅúS›‹C잸ïz¾{vì(8l-ëÛ;Þ™•á¹¹£”[;ªV~® é’)t>7QeS¨Â)—jºÅýǹO¥ÿhâc Yîó¢CbµÙÄ7:ã©ì X½ ïáï'Y «9ŸÂÏ ïY1y©=G ÿ6`­=G©¥VÑÿ»B[\¯×y¬QÖ=«ºùuoóÇÉ㺷ý›‚Õc?U|ôgdD‚&ëžtÐÓ¬Cv߈z«ÅЬ¡&öÿAŽ·ÏIåg”)ʨºÊuÈGU÷8Gó*=Wµbù6œyhDåùM$?º.Ü&ÃrÿÁÁvQûÀóCïšíXÔ™vd“ÙrQõÔ]ÄßolåwŽŸïúc÷¦ *-µ˜œ˜‚–7ö3pÄyNV+¼ÔxU^òà4 YiYqDµÒ,48í…ó©Åcäù”ªþÏÜïà~T}¿ˆÿ›Ö™{·Óðî~2ª¦•d£ªn¸ÒsÕ¦S ;˜]ɨDuF_1g•„ÂlâüG×ßzþ”`…cœK瓪²Z>’ß·Óhö{>åŽIoUR—Ε–N'0iž±2üq†®Ë†NÔ°cè‹ùA$+-œ¢å¯y6f´³ø?%«‹xï¾Y­ïõ®ˆúÀû½ÞÊÌUiàJÏU?ìÒm}gôsVYÆU×tñ£Ï&Ùê³îŸ¬†qyôYñTñªù uÃ,°óU«Ê. Uáê§×æc,´w'÷ŠŒ¤aÀóþÇ‰Š¥"MùW$«¬)²ÒˆÊ³¿#iÖ5v³À:ø„}çD¹óÒà6þãÆw}®ªßúëO ¬8sý©òù¶¿Õ÷ÌDðJ,#ž‰`F¸^gë°w¼?Ó‘íšÝtþx¢C~úTåWyfçá-´ê̶B‰Î?WÔªó-×_5T•l¬öÔfúc%—Z}h µî«Ã£ª-ÞûoMüÛ´t<-|sÞ«B›„ÊýDËå?<ŒÃ0ÚµË_Â9/uÿ¯spÆ”­M‘&—xÓ¤=_ª¸hî9ñã`e†¨ù8¦¾kŠ»iâ±ü_^—˜é ó¥gaYÝ«-(x®³ ‹j³Ù£è¬®þ1–Þ;Ñ;_Wÿ˜Ò$t]=Ýúè⣿.^•"_Œ^j}PV¤ ñsaF-ñ+X”Ñž/meU×굪q™½ø;â˜ð>EýÏ4d,ŠsÚ÷»ÄdÐåªÓÉœô¶Xã|燠bÕNÁÊg(…¬îÇGÁãªÿþ Š²Ô‰ýµÎjèS,}ËØ–1{µç§å¥ªn}tñ¸ ݽ.t¾®\}p5¦ü¾‹ñªv*¬½Êµ„^”º»4‰БžoR7¢FÆ+VÔ?ËúOoÅzœÞ:’Žtza‘xF‹p6ž&öîÆ[•R)Òdnd´…KûÜß•@ÕÂÅÜjò®˜TáQg$*⬫ËÉâ茲›³\Ѓ¯ÝDAJR©ê®ˆO*ëãÂOX| n @;Ö3gþ*NùøN}ð»–ת1Ï…·êÔxǹÜÁš|i¹Ðc˨TMä×ñF»3X£ ÖùGX#Ü;U†ÙÖÁF;vàž£ö_Ɉ[mäðó‘áÁéÖ¯äw‹Kä’Ì!l‰T]¬º "Ÿ›ªêeߨ³zx‹¨Úá-rÕ;öñÒíá½t’ݱ¯|Tuׇãåõx«7„ þ½*<Ö¾P€JÚžT×ß½>9š„T«IÝx{U©rõ©p'÷ZU‰,Ûœ[” ÷iNU>=¼_•ˆ‚5¤¬~p:|M>7ä!9ñ¬Ñ•’ÎÞGU“Öw(sOßöZèw/< 늖„µÒ>Tõ’GQ‘ÕÁQRŽÎª¨žJg5t—þ@êœDg蚢ù2–S#EØã®¯‘¼>;Ž|iÏ›¿´êøÿ™d?ú¥û'?ú%ˆ`}¨®Oƒªú$¿xš9åSMoTMxøO‚•ªqöØöâŸ=¶=NPÉ@Ù™½ãM0»…Q¹†‚¯ªzô¡È5¦Dü·¶1”åõ u¦¶¯Ù“ YgéKUìe7µ|¤ÔI9¸uV“yZËtV­˜<`°V„Ir‰ãB!.yS‹úX¶0'¶¬>ãQ—]§.\¤,Ãã:#›Ý?Ù,Û¹ÆÝ>ðÈ_SÕ“C#Ûßð4µXCU„Ê5ªê&¡¼¨*SêM²‰ÆâŸM4ÒêSUuÏcøõžÇ¨Ô»o #«CÕûøÝÜ7àÛþ}îŒ.ïödÛt®ª×кxGgU¯ø+Ù5t„¸D}p»¾‚¼>NýÅÊñ¶æ+Ö+ÑöZ¶øª9åwÏÂæ"ͪòû.xéÖö¿¯“@‘ëÜꪥPÕªëÏØzëý\FïØvi’«ÚíÚv†¡šV+€#*ެþpa­×[V‡ªkŽm:gÅ0”ÌÜ—ÝyàäPUdúÊMU]UÌŸòžëÕzaTúZ>wXÁø¦F+”!¹¨«Iƒ\h­ª>NýÅÊñùm„Æí»Wµ‘S>H­-S—ïÝžïW¾ÙKÓÚÿfŒª£ÄÙrH-WËèËŒ9ì7Šá1’æ0äëY=ü_CÁõ®ïÛ!÷þB|ä뱟µ¼¾ZKyY#Ú¶¤¸8!S~ªêé¬ZC"üíùsò!ð­6<E© wAµî« oo¬ Â;ïôƒT}Ý)¿š¢C«¯[Ë•š_x€Ž¯ô¨ª3sI{QuDñ–‚OìÄ<¼È«®"ð§6Ëuï‹ñS<‘h_xô´—5b|!ñ£ªžÎjÛ›¢Ì»þˆßóý>dFP\— Bí__÷Uïíº²U¶>X#|÷ªƒ¯ü\•n¨¾¼˜ªøSÅyµ¸£Æul^W×÷êÓ…ªíÝÚo×ѹÕÐ%Ny SòòµÉàº>u¯×%CäBÝæep•˜è¦Ê˜1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f¬À\”ÖÇ[i‚m ªÐueõ4hsç¤óè+k)T»iµ³&È¥æÎȨîÔ»dʲ¥´¨±%g¸Rap:©¥ìàYhÝÛª³.ÆPz’*V©»rÍY‘gtH= _S©Qpãâm‡öØß3"KX³ú±£I¶éœ|é–5¶é¯³vGSÕ·J—Ò€,gÉÐíœ cKïµøÌ ÅõO¢ôd¨?CW.Ä«ÉeöjIF«Ô§*J¸DÜvé5± ‡’°ÜkÍuél‰MXA±ütIí¦>¤ÎW“L©AÐ %7£`)ˆ»ô‰õ¨À[(hê6lqëÓ»{ݳXMé _\6ea'uy]1*Ét©§*ßk]S’S5"*ÀÅxY½š­¼Tm{Ò– —r1L« tK)‡‰úÝÀéž™£lÄ êŒbÖñ*Uð’üòr*pô¾‚1¯º¸Ì4ÖÁ/#F}7~µl ^¡¦R¡ÕZ‡ªÞÞìϾgEñ†"9ª"ùôT€‹ñr²V–ªH4ôtŽœ—õ]ÎøÛ3ÃuG~£’ÃÄp­½ðÀ¶¿UunªZ±Æ“  |–JUlU•ˆ[qËé,´&JškîX£ Jh+'5Ò*F•BU”ô•ÕÄÞ”æZ.ÏcKóØWáóNº °7^FÖÊRÕÖý¦ Xø†PퟜÜ;žÌË/ËìŽ}(uõKm#Ì…ùXÝȰÉU!­ÄãÔ‚B¸ÊRUWÃB7@õ NomÌçþÅZ„”úäI>¡Ó>\{[ö|‘cï"QqÀ¼UgãYH¬~x²Vžªñ‚þ3Nxô=3:V²•ì@‡PV„¿×6½cõÆ×#ºùEŠ»ãþ*˜(jú˜¶Rü¿&Ù½ÿãÖSUWÃB_õB? ­\Œþ©¿´£$¨S{ÞªV:$‰{óº·Uâ¢öA$jÔ@o¸˜Ã{‘oÝÛ’Êúà×½í}V婪ßKw]ÞØŠ_7¶v]&Ù½qèŽP`-šMÔ¤‰¬†áÉ( ¼@"Òñ$ÛpôÖSµ¤Wešg訕 €‘pÓ,ä€i÷êJ… _z{âÛü‘†âuðb0Ðô`4w†kWŸbòp–t/¼•^÷¶÷Y¥QµgæôVʈWU£'>½õôÖð®(¡;ý=ÈqöñÈì1¼—JŠ!áûˆB¤Øg¸÷]å¨jÚÁ×(…кù\Ý3tÔÊÀ˜QwÀ´{-›õÚùã·b W[!â»ãyÖßM>Q½ðþD-ª¶N~ØàBl§¶Õ¾‰..5‘ö ³]Ï 'ÛtöÐù{RZ)`¶\O²»O¡võVŽªM¹»Ö€+‘^*pq˜.¨›îuI~pþøãsS¸ˆ_W#ÈG!j1^FToªNËnNlh!6¸ ÐbÎì’$1Ì(‹’ä01{ ÿzcàï칹䯖¬=<­´ˆ‘ &–ø9Ïþµ›C;I ÚHÉñn“¥AJ 8—þ†3ÀÔú¨©ê¨8í£”´^ÑU|T¢ºñÖ¨Œ¨~!€?Þ½ó '«ª)ŠÿB[ S"‡iÄ|]ã¼P³çùâÀ¼Z 6N‚??Pêµ[~NÃUe›7C‹7댔"éá>BLçÕZùÔ¥•T-¥>¥¨—ªvæ)¤S,ǃÆl¨œ!UáQ(P­¬GmAùõålºœq*¿U±Ré¶ .]”àrhJ›ûcÞxžôp˜H)gÀ¹Ôðú>·øZ}JQ5.%¿D•€Õ`L«=›Õ?1f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3fìÖ¬– ,‰zL™ga̘„¨ ŧKq£Öè¾LQdÁlôë ¬9CÃãrnF*¹³Z-™¦)+3V’“¯m꺜®ánØ*Cø×¤Ô8DÉî&\}—MÀÿ€ÏP$Lš>i”¯(Hk:æ^cg³J²üÛ…?ƒ«JµÊŸÃN Öèש‰&*+»µe±­ô±ê³ôðp¿½KÆ#óÞBó›Åx¾$ŽvëjÏ4MŒÇiuzç eËîðB°|CÁésk£ØDõX§ÂÊæn¸Ø–SìOæ¿¶)f[âb”,Ãå`)g¹‹vç9E1N«G²ÊR•»,^xª¸ ënOJô‰*!«Q«ªÖŸåÛa@zÅÞCvÍvd=QV6NãX`¹FŸ»q¢Êˆ!ðk'Oo…09Þ™Ý;ájµÿÌýkZR’ð}ý)/¹ yÀ,$©TºÜD}VãI=|1•ÂJ!™ÊSµðžýc o<]‡‚-$ª:û"ÚDß55Vºg‹îW—¨UUûvpEµÖœªÚñ{ý±=JäEÜ›ë» ¯7íp°qF¡jàñh®þò¤I~ç–«Á¯§6³zõrZPµÇw`,Á‰*S3⽡{;'uoÊÛžNUK9ëÜZ=|1•§?¾ïÖSÕ}þ17žNU 6/¯ã>:Ôígz/ï¬t¼ð~ùë¢âEÓN3CÒ¥Æ;ú,Ì7Ï?¢ÑgeáuûŸ¯s”“$ªvÞ;ÎëU>ú‚{©ÁOjY¹&Q“¢FBåUœ©{)„T)Nå`)g ÝGúU’®}}@Æ-¤òŠÊS}3IN¼ðTªÒ°º»ú8íf:/kÂÅ÷xœ¿ž¡íÝ„xäÝ J·¾gÆ–cî¾K&U¶þl”­úmß–ïä‚Af*aRUϪQ—C 5>ŸEB$КÕås²â^^¹¹jZöØão5Eõ¸K;K/WáuVEÆ­ÒTå¾IN¼ðÔX…ŽÕSDÔ'«Qafø©x=£#?ƪlÃq¯{ö|J…ÅjFp‡Õ9§ï’áOnè̆ó‚ÅY‘?ö ÆŸÄ ¢Dß¶ÂÞ,jß“·_˜ %rA6Aõx1–v–¯±éL –ÂËá®´¸Ï O¡[Š¢ CV—5÷kp†·íoU¯g<.a÷ì±íêóPtïx¦#Û=»é$q:äç°šS›ñÏ ¸«ƒÃÔJÑËìçÓo¡¼{`?[~ëðn²R3~ù [©zì…¥œ%Pök~%ÞV/n—Mk¼œ×ùJÃÓ]¸«UG‹û”óIM?liÆ[]çeMÑýî¾Ý΃6”"è a—œFî0fÕ)À·STzac¦PNZ;¤v¶Êu+ï.¿µx§¹©?ÇYÕªÇ^XŠV2Gñç¬ÂÓÔ‹o޹ëLñRåú¤õ4°7BV—5E4@M•1cÆnF·S]9´1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ•Ùtuz¿oxû²ìäÒ¬Å}(5Šé´¦ÅnB­ÒºW²bÖÄR¥iN§7Îh:½ß7¼8‹ËˆÑÛ3™íÈêÔ§Rø›eK ay‰Zꂹ‚;ÏèïûðÂzW²byÐÉœ¸•] ßß"'Øpµh±VŒJ§·4<_Ô†ÿW¦üd^Ô¬Üåsqæ6vÅœZ·ßÑ=f©;û3”ú”Šß;NÓU¶yFÛe4¨aMD•ºG7JÕ( žj훀ģ_ F`À'ÀKŸ¹¿õ§•ïoa ±Æù¼ êôòË = ¹N¯ƒw;» ß3óÉF\¿ùÉF\`K/_A©ñ°ŠDÍNì¤×Ÿv¿h'ÛIöÈË v*×0Îéo¸ ¿Ûp‹#ùäõ:ÉöÂB ¼k¹N©? 7ÎGµ‹N k(”M£…亮nõZ{P¿r£‡§‚x'vNSða@@< ³ß:ª®mŠ/àþX>Ö?¾°¶Éþêô:—Uëô:x÷!Çwfqí®ßÄ5{8²ÒÊï™ùø>N$`–[{¬«åkí)å P•.±Uf»_bõ6½y¹åº¬¡¹î1ô†(Ê™†ÿc‡·¨ê#t.øÖ T¼pDl!¹®²5± \Pß±¨Ô°«ç§Ör2ë¸:(cÎAZ=/ãNí[%ˆG_â¢~;(«°+GUVƒ’{‰œ´®]¾P5¶ F–iüuz¼8Ôø„+,j<™ ”ò[ý$øX?R[…‡q……®uo²ê¢ŒRqj]biIâŒÚsh“ÎR¸î1«œÆ=k`Õ?|††ÿFއë챸µBãI">GTxõ2<¾!W礒írc¨Ô\J¸ºm.•ÓÕqã‘DQ×x•äôÍÓ4â¹ëÔòºzŽjµ(e^KMCt£ë~(uÄñ]³ÅM&×é- ï(ÊpÕ~r-ƒ ¯š;¤Ÿ´زƓ*a· ¢¼ã P£ej5 ¡{Ìï“ßwGVVÄ[{ZØJÍ IðQkåøÆ«Q-Ù./¬Š\nÓÕv(fÀ…®.ßêª7¼¨>=3ǶӲ¸¬™BT‘%Î >!5uDÐô´¤¼¯`ÿ¢çO¢Éÿå:½ÞÝ¿ÈñYG¹õÜZ%UåìLbž¨J<ª±°RgØÁ»›ÅÏú>°gÂ}–=²¢ê“LÔƒë[1QqdÅÏ i}?ÆÀ«éð£n¢ÊñǶ;Џ¥RUM qrrÐ-Û™”±ï`Æbxc¡K ­T[Ž,n)YâÊS•õØé´P÷,$¹·¡Nïb×õ×éuðîCŽOØbþ8wÃìV‚P¾-ÿß+ˆJ«; UãEÀ¯Ö%fÕƒÓ˜LBÜÚŸ¶/ì~IÖÐ\÷˜ÕBÃÜþ¯]}VUÀÃÞvAéPã› ’r<«Å’ÝA¿\x¬xjC¡†UYÍSO;žóÔÓrÉ 6Ô™î‚ÑÑŽiT{!èeqKɶ Q¯PKßÐ ðúóŽ,ްðéêô§Yd:½ÞÝëªðQxÍs·sQbù¸[JB«>zõwÇr]bŒN7åR&˜`’>–œî±ÈãV!ªú >t'º ŒÁ<Öêa¨*¼­ŸÚ;Ž^?­¤¦F)³O¶\H¾ƒºBTˆÌG383/_·”,qåÓJ»oO}õç)®Îlê‹Ý·ç~å(®ÓtzKËŒV¥Ê¯ž;;†ÁIöÉFµâ¢£{lÍ5²©>ºx;ÑEÄs‚ß¡ ]l¨Qšó²fð³f%2è¾sêKz2I7K|2Àa¡¤®=jמÚìR.:½TÞï^œÅÕé)H¡{Ü¥UŸJá@X×ihoiÎ{d[÷¬|–êuçåÉâÞH–¸òT:¢9m嚢»ÖÓéýþáÅŒƒŒ]Šõ¯Öw-tŸV ¡Št„m)YÜb²êU÷n3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3fÌX –Íí1­`ÌX!-4teAé%v¡<ç?|ㇶÔ&i_¾q†zë Ïð”É] e²R_Ä× ©|& c*kÖ€4fÔñÈ,J «U—øÜ_Äh“ø\1A¤„îîèù•¿éõÅ÷ºeL·ý-‰L\÷¬^çê~ÔP¹hrÃÉ*tqa0¯ƒfTêâ:ßMUùÅÛpÔ>µyd³u¥UÙÏYCÖA>†Ž€ákþ).,ù°+ɦ@Úb÷ÚjE)øÔW°â¾ÙÏ …ÆFÒ+Aþs$¢e¢6\äµQ9oI}4Èx<÷“U.ÕB?¢–BÕÂß«ë#ˆš$‘åHxì.x%,•Ìa!®RThwgd5zðÉÅ÷úDB·ýeŠŽþ².L7@¥*ïž AsduttWëâVUaà‹RU|–I xG¶߇$T®üÃëüñ-Ÿ¬Äë™#_œùIF÷NÀŒö_XufÕo÷ÙÂQ°IDͺI²Þ ?|×eŽ¿ÿå$Û|ê ¥îÙi{œŸŽtÏFÔÛNĸÜwÞs²qqñ?ÕíîäDß½m}o—/`Ó£ªCT±i ¬ñj÷·HÁ}ù2¾Þo^ÕŸÁñ|ªãí’ϧpä„+ýðP§ã;昭´?^$”^ü)«ÞtnÓ9VýâOí­êdDÅÀTŒñ›ÎÙóʘÿäYߪ® #jÓÇvÙþàÊRÕ!*Œë]|6©ÞîÊ!«œ¨~.«îMPx§ýïëG5þåØÚ÷9G6Q©Êçä…¯¹˜IWG·ªjãRT|–^|Yß…&—´gö|JuKØwÿž-w”íýÐçS=3­,ðœ‚7<Þ ßÿ ˆ‡È{oü…-³†¥xL(Eáúïx?Þ ’O¶ßY`¾# ßí¹š·Øß‘ Ì—kTÅHÈgŽEp#¢Fi¸ØqÅ3ð¿ßO2®½_NóîÆŸtëOåˆrR?Þ ./²ªˆºØÁ1œ‡õIEæ”ËÑ;³WNªÂ˜úŽ÷Ð5嘫b+º¿ÏOntutuçªøÖ6RôNéÃãѾ|ã:ßéêâêQµáb×åÓ[Aò–˜«T @ŸÜ€ÄÑÌe-¯óú8Ûhx?tÖ›Q½ŸøCâýïÚS˜‚ðÄCºâ>Hêo=´±ð’5}Œ ·•ùn ¿®´#„¦}ËoÇÞU(¶ãx ‘íåUÕò›<¦ ‚$Ÿk¨G/÷¸ÁÇU×t¥^ñ""ä÷ê9¨ë䮉óÚFv·ð+OîF8k¢±œTm:ê‡ám™*¬¥v0²&ÓÒÅÕ£j×ep’šœ[‘DYÍÇ÷¹ëqÖ3CÓ¹…mÚ!ŽÃÿËH×X¶ºŸm-“õÉQæ÷(£Š—6]ö^#'vvͪ\Q®ºØ¤®[§CT>Iž1 Oʧ+•¶¢—"!uwÏ´ÏÙéõѼ™JÕ5×½ñ»žW‡µ7HTÑ“ÒueóÍvÊ·JzN’ïUW}çL´ º%uÿ¢p&ì:Ô¼ •¨m´ïàƒ6f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘±ÿ WY¦ŒÉœ$P,;AUžÓºJ]v†ë‚€ŒŽóÚúÄsßÕ§ ™¯ÚÅ¢{%kååð¨ówÆn£ƒeõd--¬üY™¡•¾øjö7‘ábáɦµˆ¾É®@„ –-/É7p]·ábÃų¯@ÑÁ« ];š`1“k†ƒÁÙµæôÖ€Ôà?*šªÃäè<'ˆ:ÏKßúUß? ¿ºïÉû~«Æ;Ö𮔆eŽAIéÚ:É¥-¯ˆÚk}¢±ÙÂòÄ !^ȯ-ðú5ÑÙ¡o\ÉÂ_í¾]å0Á/¹n xIUîÚ&XšÁef¸Íʬdk›Ôµ ¼Ð‘ýeW’$‘m½‚j®ëO±¾çžžl%e ‰påÎ~êé&RgÐÄžzúΆQ —NUÐÕùÖ^ O¨ÍÈoœCé°š:Ï¥â{f„4mùËÁœPì£è¯#_Sa„¢DÐÐ[¸ÌÑŸÜ ænK<².dúЉ=¤î ’¬@œ}Næ|üµ£Ê Qs~û¬˜ª±ÏŽ›^±Ðúeâÿtýkœ±j•¦]ܽÎSÑ'²šž™¨ ‹v•cke¼ŒñeñM’ýà<ÿÜü"E§:סåä¾¹ä̱í囫âsß-Êß]^• ´ }(¢µ#Jü,œkÜ« È¸w!=3B5¾ð²òK¯ùÔ^ó©Ýj…3FҬﳽãr¹S7QÕ3ÚRæª<¶'J9"¡”]|È_ìˆÐ—‡Á%ÇêØ/Þÿ# TÇé­cGqn"£ê[­cGQ Ñ™†÷gÆŽ¾Õ*iêVÔ!jTú2%ТÈtuhcä•(;²MÙе¼|Çõ' RƸçHge-ƒ«S»ÚÙ1å ˜c½í,µ+¸šjª¢ ©†ýç25{¾²©zu͵¯cx'-¹ÞiË6‚γƒosw–-Ãëµ´¹ªã4”–ΰgØž^'“1 KËð½¶ø\d@ãf#iÿÞ0 †øÙÀ¡=‡ö@Ò%ß5Èz£Ý·ƒûuˆ÷tØ!ì¾]âŠØ±·M|þ×ð![@QDL§ÂÙ;ö7U ßѾ€3ÔÕŠM<Äë¦þÌj[=GH¬ú%¹ûuí-,¼$ë‚SY]ç›…²¨fù­_Á‹—ÌŸËðzD]ü^•6WåÏ€òâNww|²v`ªikMÚ¾cûiqQ–Þ–¾WÂùX°85¢Vͯš§èriÑáI †'ívVG.x R«ÞöZ aN"Fá| 'áã…ÒÚz½/é=bÝó:ÏѨu•—&~Ó¹îÙÎoC¿Ûõ¼ᱎÞnñ{Uê\U®½\z€ôüÃBûY—«ë\I£TÔŸE=ÚªŠ™=ÚÝR9êE£7ùÏÔ†'®b7F.ëd.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('