From f3fe9cbfacaf465f266d091ab7152b1fccf8c82b Mon Sep 17 00:00:00 2001
From: Alexandre Morignot <erdnaxeli@gmail.com>
Date: Tue, 1 Jan 2013 19:49:27 +0100
Subject: [PATCH] Documentation RDoc

---
 Logging.pm                     | 606 ---------------------------------
 PlayBot.html                   | 252 ++++++++++++++
 PlayBot.pl                     | 366 --------------------
 README.md                      |  72 ----
 SitePlugin.html                | 278 +++++++++++++++
 TestPlugin.html                | 202 +++++++++++
 TestPlugin1.html               | 170 +++++++++
 TestPlugin2.html               | 170 +++++++++
 bdd.sql                        |  34 --
 images/add.png                 | Bin 0 -> 733 bytes
 images/brick.png               | Bin 0 -> 452 bytes
 images/brick_link.png          | Bin 0 -> 764 bytes
 images/bug.png                 | Bin 0 -> 774 bytes
 images/bullet_black.png        | Bin 0 -> 211 bytes
 images/bullet_toggle_minus.png | Bin 0 -> 207 bytes
 images/bullet_toggle_plus.png  | Bin 0 -> 209 bytes
 images/date.png                | Bin 0 -> 626 bytes
 images/delete.png              | Bin 0 -> 715 bytes
 images/find.png                | Bin 0 -> 659 bytes
 images/loadingAnimation.gif    | Bin 0 -> 5886 bytes
 images/macFFBgHack.png         | Bin 0 -> 207 bytes
 images/package.png             | Bin 0 -> 853 bytes
 images/page_green.png          | Bin 0 -> 621 bytes
 images/page_white_text.png     | Bin 0 -> 342 bytes
 images/page_white_width.png    | Bin 0 -> 309 bytes
 images/plugin.png              | Bin 0 -> 591 bytes
 images/ruby.png                | Bin 0 -> 592 bytes
 images/tag_blue.png            | Bin 0 -> 1880 bytes
 images/tag_green.png           | Bin 0 -> 613 bytes
 images/transparent.png         | Bin 0 -> 97 bytes
 images/wrench.png              | Bin 0 -> 610 bytes
 images/wrench_orange.png       | Bin 0 -> 584 bytes
 images/zoom.png                | Bin 0 -> 692 bytes
 index.html                     |  77 +++++
 js/darkfish.js                 | 153 +++++++++
 js/jquery.js                   |  18 +
 js/navigation.js               | 142 ++++++++
 js/search.js                   |  94 +++++
 js/search_index.js             |   1 +
 js/searcher.js                 | 228 +++++++++++++
 lib/playbot.rb                 |  70 ----
 lib/site_plugin.rb             |  15 -
 mixcloud.pm                    |  71 ----
 run.rb                         |  50 ---
 soundcloud.pm                  |  35 --
 spec/site_plugin_spec.rb       |  28 --
 table_of_contents.html         |  78 +++++
 youtube.pm                     |  76 -----
 zippy.pm                       |  70 ----
 49 files changed, 1863 insertions(+), 1493 deletions(-)
 delete mode 100644 Logging.pm
 create mode 100644 PlayBot.html
 delete mode 100755 PlayBot.pl
 delete mode 100644 README.md
 create mode 100644 SitePlugin.html
 create mode 100644 TestPlugin.html
 create mode 100644 TestPlugin1.html
 create mode 100644 TestPlugin2.html
 delete mode 100644 bdd.sql
 create mode 100644 images/add.png
 create mode 100644 images/brick.png
 create mode 100644 images/brick_link.png
 create mode 100644 images/bug.png
 create mode 100644 images/bullet_black.png
 create mode 100644 images/bullet_toggle_minus.png
 create mode 100644 images/bullet_toggle_plus.png
 create mode 100644 images/date.png
 create mode 100644 images/delete.png
 create mode 100644 images/find.png
 create mode 100644 images/loadingAnimation.gif
 create mode 100644 images/macFFBgHack.png
 create mode 100644 images/package.png
 create mode 100644 images/page_green.png
 create mode 100644 images/page_white_text.png
 create mode 100644 images/page_white_width.png
 create mode 100644 images/plugin.png
 create mode 100644 images/ruby.png
 create mode 100644 images/tag_blue.png
 create mode 100644 images/tag_green.png
 create mode 100644 images/transparent.png
 create mode 100644 images/wrench.png
 create mode 100644 images/wrench_orange.png
 create mode 100644 images/zoom.png
 create mode 100644 index.html
 create mode 100644 js/darkfish.js
 create mode 100644 js/jquery.js
 create mode 100644 js/navigation.js
 create mode 100644 js/search.js
 create mode 100644 js/search_index.js
 create mode 100644 js/searcher.js
 delete mode 100644 lib/playbot.rb
 delete mode 100644 lib/site_plugin.rb
 delete mode 100644 mixcloud.pm
 delete mode 100755 run.rb
 delete mode 100644 soundcloud.pm
 delete mode 100644 spec/site_plugin_spec.rb
 create mode 100644 table_of_contents.html
 delete mode 100644 youtube.pm
 delete mode 100644 zippy.pm

diff --git a/Logging.pm b/Logging.pm
deleted file mode 100644
index 6b7085b..0000000
--- a/Logging.pm
+++ /dev/null
@@ -1,606 +0,0 @@
-package Logging;
-
-# ==============[ Classe pour gérer les logs correctement ]============== #
-#  Date : 29/10/2010                                                      #
-#  Auteur : TC                                                            #
-# ======================================================================= #
-
-use strict;
-use warnings;
-
-use Fcntl ':mode';
-
-
-# ###
-#  new
-# Instancie la classe - un constructeur en somme
-# ###
-sub new
-{
-	my $class = shift;
-	my $self = {
-		_file    =>   shift,
-		_colored =>   0,
-		_pending =>   0,
-		_utf8    =>   0,
-		_right_align => shift,
-	};
-	
-	bless $self, $class;
-	
-	# On active la couleur que si on est sur un terminal
-	# C'est moche après pour les fichiers ou un less
-	if($self->file eq "STDOUT")
-	{
-		$self->{"_colored"} = 1 if((stat(STDOUT))[2] & S_IFCHR);
-	}
-	elsif($self->file eq "STDERR")
-	{
-		$self->{"_colored"} = 1 if((stat(STDERR))[2] & S_IFCHR);
-	}
-	else
-	{
-		$self->{"_colored"} = 1 if((stat($self->file))[2] & S_IFCHR);
-	}
-	
-	
-	unless(defined $self->{"_right_align"})
-	{
-		$self->{"_right_align"} = 0;
-	}
-	
-	return $self;
-} # Fin new
-
-
-# ###
-#  file
-# Renvoie/maj $self->{'_file'}
-# ###
-sub file
-{
-	my $self = shift;
-	$self->{"_file"} = $_[0] if(defined($_[0]));
-	return $self->{"_file"};
-} # Fin file
-
-
-# ###
-#  colored
-# Renvoie/maj $self->{'_colored'}
-# ###
-sub colored
-{
-	my $self = shift;
-	$self->{"_colored"} = $_[0] if(defined($_[0]));
-	return $self->{"_colored"};
-} # Fin colored
-
-
-# ###
-#  pending
-# Renvoie/maj $self->{'_pending'}
-# ###
-sub pending
-{
-	my $self = shift;
-	$self->{"_pending"} = $_[0] if(defined($_[0]));
-	return $self->{"_pending"};
-} # Fin pending
-
-
-# ###
-#  utf8
-# Renvoie/maj $self->{"_utf8"}
-# ###
-sub utf8
-{
-	my $self = shift;
-	$self->{"_utf8"} = $_[0] if(defined($_[0]));
-	return $self->{"_utf8"};
-} # Fin utf8
-
-
-# ###
-#  right_align
-# Renvoie/maj $self->{"_right_align"}
-# ###
-sub right_align
-{
-	my $self = shift;
-	$self->{"_right_align"} = $_[0] if(defined($_[0]));
-	return $self->{"_right_align"};
-} # Fin right_align
-
-
-# ###
-#  debug
-# Fonction gérant les logs du niveau debug (1)
-# ###
-sub debug
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[36mDEBUG\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "DEBUG:$parent:$text";
-	}
-	
-	return $self->print_in_file($text, $self->DEBUG);
-} # Fin debug
-
-
-# ###
-#  pending_debug
-# Fonction gérant les logs du niveau debug (1)
-# ###
-sub pending_debug
-{
-	my ($self, $text) = @_;
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[36mDEBUG\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "DEBUG:$parent:$text";
-	}
-	
-	return $self->pending_in_file($text, $self->DEBUG);
-} # Fin pending_debug
-
-
-# ###
-#  info
-# Fonction gérant les logs du niveau info (2)
-# ###
-sub info
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[33;1mINFO\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "INFO:$parent:$text";
-	}
-	
-	return $self->print_in_file($text, $self->INFO);
-} # Fin info
-
-
-# ###
-#  pending_info
-# Fonction gérant les logs du niveau info (2)
-# ###
-sub pending_info
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[33;1mINFO\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "INFO:$parent:$text";
-	}
-	
-	return $self->pending_in_file($text, $self->INFO);
-} # Fin pending_info
-
-
-# ###
-#  warning
-# Fonction gérant les logs du niveau warning (3)
-# ###
-sub warning
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[33mWARNING\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "WARNING:$parent:$text";
-	}
-	
-	return $self->print_in_file($text, $self->WARNING);
-} # Fin warning
-
-
-# ###
-#  pending_warning
-# Fonction gérant les logs du niveau warning (3)
-# ###
-sub pending_warning
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[33mWARNING\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "WARNING:$parent:$text";
-	}
-	
-	return $self->pending_in_file($text, $self->WARNING);
-} # Fin pending_warning
-
-
-# ###
-#  error
-# Fonction gérant les logs du niveau error (4)
-# ###
-sub error
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[31mERROR\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "ERROR:$parent:$text";
-	}
-	
-	return $self->print_in_file($text, $self->ERROR);
-} # Fin error
-
-
-# ###
-#  pending_error
-# Fonction gérant les logs du niveau error (4)
-# ###
-sub pending_error
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[31mERROR\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "ERROR:$parent:$text";
-	}
-	
-	return $self->pending_in_file($text, $self->ERROR);
-} # Fin pending_error
-
-
-# ###
-#  critical
-# Fonction gérant les logs du niveau critical (5)
-# ###
-sub critical
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[31;1mCRITICAL\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "CRITICAL:$parent:$text";
-	}
-	
-	return $self->print_in_file($text, $self->CRITICAL);
-} # Fin critical
-
-
-# ###
-#  pending_critical
-# Fonction gérant les logs du niveau critical (5)
-# ###
-sub pending_critical
-{
-	my ($self, $text) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	
-	my $parent = ( caller(1) )[3];
-	$parent = "" if(!defined($parent));
-	
-	if($self->colored)
-	{
-		$text = "\e[31;1mCRITICAL\e[0m:$parent:$text";
-	}
-	else
-	{
-		$text = "CRITICAL:$parent:$text";
-	}
-	
-	return $self->pending_in_file($text, $self->CRITICAL);
-} # Fin pending_critical
-
-
-# ###
-#  print_in_file
-# Écrit dans le fichier
-# ###
-sub print_in_file
-{
-	my ($self, $text, $level) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	$text = "[\e[32m" . (scalar localtime time) . "\e[0m] $text";
-	
-	$self->end_pending(0, $level) if($self->pending);
-	
-	if($self->file eq "STDOUT")
-	{
-		print STDOUT $text."\n";
-	}
-	elsif($self->file eq "STDERR")
-	{
-		print STDERR $text."\n";
-	}
-	else
-	{
-		open LOG, ">>", $self->file or return 0;
-		print LOG $text."\n";
-		close LOG;
-		
-		print $text."\n" if(defined($level) && $Config::debug >= $level);
-	}
-	
-	return 1;
-} # Fin print_in_file
-
-
-# ###
-#  pending_in_file
-# Écrit dans le fichier en attendant de savoir si ça a réussi ou pas
-# ###
-sub pending_in_file
-{
-	my ($self, $text, $level) = @_;
-	return unless(defined $text);
-	
-	chomp $text;
-	$text = "[" . (scalar localtime time) . "] $text";
-	
-	if($self->file eq "STDOUT")
-	{
-		if($self->right_align)
-		{
-			printf STDOUT "%-90s", $text;
-		}
-		else
-		{
-			print STDOUT $text;
-		}
-	}
-	elsif($self->file eq "STDERR")
-	{
-		if($self->right_align)
-		{
-			printf STDERR "%-90s", $text;
-		}
-		else
-		{
-			print STDERR $text;
-		}
-	}
-	else
-	{
-		if($self->right_align)
-		{
-			open LOG, ">>", $self->file or return 0;
-			printf LOG "%-90s", $text;
-			close LOG;
-			
-			printf "%-90s", $text if(defined($level) && $Config::debug >= $level);
-		}
-		else
-		{
-			open LOG, ">>", $self->file or return 0;
-			print LOG $text;
-			close LOG;
-			
-			print $text if(defined($level) && $Config::debug >= $level);
-		}
-	}
-	
-	$self->pending(1);
-	
-	return 1;
-} # Fin pending_in_file
-
-
-# ###
-#  end_pending
-# Écrit dans le fichier le résultat de l'attente
-# ###
-sub end_pending
-{
-	my ($self, $done_or_error, $level) = @_;
-	
-	my $done = "";
-	
-	if($done_or_error)
-	{
-		if($self->colored)
-		{
-			$done = sprintf "%c[32m Done ", 0x1B;
-		}
-		else
-		{
-			$done = sprintf " Done \n";
-		}
-		
-		$done .= "☑" if($self->utf8);
-	}
-	else
-	{
-		if($self->colored)
-		{
-			$done = sprintf "%c[31m Error ", 0x1B;
-		}
-		else
-		{
-			$done = sprintf " Error \n";
-		}
-		
-		$done .= "☒" if($self->utf8);
-	}
-	
-	$done .= "\e[0m\n" if($self->colored);
-	
-	
-	# À partir d'ici, $done peut vouloir dire que c'est bon, ou pas
-	if($self->file eq "STDOUT")
-	{
-		printf STDOUT $done;
-	}
-	elsif($self->file eq "STDERR")
-	{
-		printf STDERR $done;
-	}
-	else
-	{
-		open LOG, ">>", $self->file or return 0;
-		printf LOG $done;
-		close LOG;
-		
-		printf $done if(defined($level) && $Config::debug >= $level);
-	}
-	
-	
-	$self->pending(0);
-	
-	return 1;
-} # Fin end_pending
-
-
-#
-# Fonctions pour récupérer les différents niveaux de debug
-#
-sub DEBUG   { return 3; }
-sub INFO    { return 2; }
-sub WARNING { return 1; }
-sub ERROR   { return 0; }
-sub CRITICAL { return -1; }
-# Pour ceux qui préfèrent utiliser des variables...
-our $DEBUG    = 3;
-our $INFO     = 2;
-our $WARNING  = 1;
-our $ERROR    = 0;
-our $CRITICAL = -1;
-our %LVL_NAME = (
-	"DEBUG"    => 3,
-	"INFO"     => 2,
-	"WARNING"  => 1,
-	"ERROR"    => 0,
-	"CRITICAL" => -1
-);
-
-# Et dans l'autre sens
-sub LVL
-{
-	my ($self, $num) = @_;
-	
-	my %LVL = (
-		3    => "DEBUG",
-		2    => "INFO",
-		1    => "WARNING",
-		0    => "ERROR",
-		"-1" => "CRITICAL"
-	);
-	
-	return $LVL{$num};
-}
-our %LVL = (
-	3    => "DEBUG",
-	2    => "INFO",
-	1    => "WARNING",
-	0    => "ERROR",
-	"-1" => "CRITICAL"
-);
-
-
-# ###
-#  dbg
-# Imprime des infos de debug à l'écran (STDOUT)
-# ###
-sub dbg
-{
-	my $self = shift;
-	
-	require Data::Dumper;
-	print Data::Dumper->Dump([$self], [qw(Logging)]);
-} # Fin dbg
-
-
-1;
-
-__END__
-
diff --git a/PlayBot.html b/PlayBot.html
new file mode 100644
index 0000000..dbae35e
--- /dev/null
+++ b/PlayBot.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>class PlayBot - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body id="top" class="class">
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="file-metadata">
+    <nav id="file-list-section" class="section">
+  <h3 class="section-header">Defined In</h3>
+  <ul>
+    <li>lib/playbot.rb
+  </ul>
+</nav>
+
+    
+  </div>
+
+  <div id="class-metadata">
+    
+    <nav id="parent-class-section" class="section">
+  <h3 class="section-header">Parent</h3>
+  
+  <p class="link">IRCBot
+  
+</nav>
+
+    
+    <!-- Method Quickref -->
+<nav id="method-list-section" class="section">
+  <h3 class="section-header">Methods</h3>
+
+  <ul class="link-list">
+    
+    <li><a href="#method-c-new">::new</a>
+    
+    <li><a href="#method-i-add_custom_handlers">#add_custom_handlers</a>
+    
+  </ul>
+</nav>
+
+  </div>
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<div id="documentation">
+  <h1 class="class">class PlayBot</h1>
+
+  <div id="description" class="description">
+    
+  </div><!-- description -->
+
+  
+  
+  
+  <section id="5Buntitled-5D" class="documentation-section">
+    
+
+    
+
+    
+    <!-- Constants -->
+    <section id="constants-list" class="section">
+      <h3 class="section-header">Constants</h3>
+      <dl>
+      
+        <dt id="BOTNAME">BOTNAME
+        
+        <dd class="description">
+        
+      
+      </dl>
+    </section>
+    
+
+    
+
+    <!-- Methods -->
+    
+     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Class Methods</h3>
+
+    
+      <div id="method-c-new" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">new</span><span
+            class="method-args">(options = {})</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          <p>Start a new instance</p>
+
+<p>Options:</p>
+<ul><li>
+<p><code>:address</code>: irc server</p>
+</li><li>
+<p><code>:port</code>: port number, default to 6667</p>
+</li><li>
+<p><code>:nicknames</code>: array of nicknames to cycle through</p>
+</li><li>
+<p><code>:nick_passwd</code>: password for the first nick of :nicknames</p>
+
+<pre>if we are not connected with this nick, we will use ghost and take this nick</pre>
+</li><li>
+<p><code>:channels</code>: the channels we are going to connect to</p>
+</li><li>
+<p><code>:admin</code>: the nick of the user who can command the bot</p>
+</li></ul>
+          
+
+          
+          <div class="method-source-code" id="new-source">
+            <pre><span class="ruby-comment"># File lib/playbot.rb, line 26</span>
+<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">options</span> = {})
+        <span class="ruby-ivar">@admin</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-value">:admin</span>)
+        <span class="ruby-identifier">raise</span> <span class="ruby-string">&quot;You must provide an admin !&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@admin</span>
+
+        <span class="ruby-keyword">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-value">:nick_passwd</span>]
+                <span class="ruby-ivar">@nick</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:nicknames</span>].<span class="ruby-identifier">first</span>
+                <span class="ruby-ivar">@nick_paswd</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">delete</span>[<span class="ruby-value">:nick_passwd</span>]
+        <span class="ruby-keyword">end</span>
+
+        <span class="ruby-identifier">options</span>[<span class="ruby-value">:username</span>] = <span class="ruby-constant">BOTNAME</span>
+        <span class="ruby-identifier">options</span>[<span class="ruby-value">:realname</span>] = <span class="ruby-constant">BOTNAME</span>
+
+<span class="ruby-keyword">super</span>(<span class="ruby-identifier">options</span>)
+        <span class="ruby-keyword">self</span>.<span class="ruby-identifier">connect_socket</span>
+        <span class="ruby-keyword">self</span>.<span class="ruby-identifier">start_listening</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- new-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- new-method -->
+
+    
+    </section><!-- public-class-method-details -->
+  
+     <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Instance Methods</h3>
+
+    
+      <div id="method-i-add_custom_handlers" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">add_custom_handlers</span><span
+            class="method-args">()</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          <p>This metod is called by IRCBot#connect_socket</p>
+          
+
+          
+          <div class="method-source-code" id="add_custom_handlers-source">
+            <pre><span class="ruby-comment"># File lib/playbot.rb, line 44</span>
+<span class="ruby-keyword">def</span> <span class="ruby-identifier">add_custom_handlers</span>()
+        <span class="ruby-ivar">@irc</span>.<span class="ruby-identifier">hearing_welcome</span>   <span class="ruby-keyword">self</span>.<span class="ruby-identifier">method</span>(<span class="ruby-value">:_in_welcome</span>)
+        <span class="ruby-ivar">@irc</span>.<span class="ruby-identifier">on_msg</span>       <span class="ruby-keyword">self</span>.<span class="ruby-identifier">method</span>(<span class="ruby-value">:_in_msg</span>)
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- add_custom_handlers-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- add_custom_handlers-method -->
+
+    
+    </section><!-- public-instance-method-details -->
+  
+  </section><!-- 5Buntitled-5D -->
+
+</div><!-- documentation -->
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/PlayBot.pl b/PlayBot.pl
deleted file mode 100755
index 9f6e042..0000000
--- a/PlayBot.pl
+++ /dev/null
@@ -1,366 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use warnings;
-use POE;
-use POE::Component::IRC;
-use POSIX 'strftime';
-use DBI;
-use Tie::File;
-use JSON;
-
-use Logging;
-use youtube;
-use soundcloud;
-use mixcloud;
-use zippy;
-
-
-# nom du fichier
-my $bot = $0;
-
-my $log = Logging->new('STDOUT', 1);
-
-# config
-my $serveur = 'IRC.iiens.net';
-my $nick = 'PlayBot';
-my $port = 6667;
-my $ircname = 'nightiies';
-my $username = 'nightiies';
-my @channels = qw(#nightiies #bigphatsubwoofer);
-my $admin = 'moise';
-my $baseurl = 'http://nightiies.iiens.net/links/';
-my @nicksToVerify;
-my @codesToVerify;
-my $lastID;
-
-my $debug = 0;
-
-# mode debug
-if ($#ARGV + 1) {
-	@channels = qw(#hormone);
-	$nick = 'kikoo';
-	$debug = 1;
-}
-
-
-local $/;
-open CONF, '<', 'playbot.conf';
-my $json = <CONF>;
-my $conf = decode_json($json);
-
-
-## CONNEXION 
-my ($irc) = POE::Component::IRC->spawn();
-my $dbh = DBI->connect('DBI:mysql:'.$conf->{'bdd'}.';host='.$conf->{'host'}, $conf->{'user'}, $conf->{'passwd'}, {
-	        PrintError => 0,
-	        AutoCommit => 1,
-		mysql_auto_reconnect => 1
-	  })
-	or die("Couldn't connect to database: ".DBI->errstr);
-
-
-# Evenements que le bot va gérer
-POE::Session->create(
-	inline_states => {
-		_start     => \&bot_start,
-		irc_001    => \&on_connect,
-		irc_public => \&on_speak,
-		irc_msg    => \&on_query,
-		irc_notice => \&on_notice,
-		_flux	   => \&flux,
-		_later     => \&later
-	},
-);
-
-
-my %commandes_admin = ("cycle" => \&cycle);
-
-
-
-### FONCTIONS
-sub flux
-{
-	my $kernel = $_[ KERNEL ];
-	my $date = strftime ("%Y-%m-%d", localtime(time - 3600*24));
-	
-	my $sth = $dbh->prepare_cached('SELECT COUNT(*) FROM playbot WHERE date = ?');
-	$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-	$sth->execute($date)
-		or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-	my ($nbr) = $sth->fetchrow_array;
-
-	if ($nbr) {
-		$irc->yield(privmsg => $_ => $nbr.' liens aujourd\'hui : '.$baseurl.$date) foreach (@channels);
-	}
-
-	$kernel->delay_set('_flux', 3600*24);
-}
-
-
-sub addTag
-{
-    my ($id, $tag) = @_;
-
-    my $sth = $dbh->prepare_cached('INSERT INTO playbot_tags (id, tag) VALUES (?, ?)');
-	$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-
-	$sth->execute($id, $tag)
-		or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-}
-	
-
-sub later
-{
-	my ($nick, $id) = @_[ARG0,ARG1];
-
-	my $sth = $dbh->prepare_cached('SELECT url, sender, title FROM playbot WHERE id = ?');
-	$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-
-	$sth->execute($id)
-		or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-
-	if ($sth->rows) {
-		my @donnees = $sth->fetchrow_array;
-
-		$irc->yield(privmsg => $nick => '['.$id.'] '.$donnees[2].' | '.$donnees[1]);
-		$irc->yield(privmsg => $nick => $donnees[0]);
-	}
-}
-
-
-sub cycle
-{
-	my ($arg) = @_;
-
-	$log->info("restarting");
-	$irc->yield(quit => 'goodbye');
-	sleep 1;
-	exec $bot;
-}
-
-
-## GESTION EVENTS
-
-# Au démarrage
-sub bot_start {
-	$irc->yield(register => "all");
-	$irc->yield(
-		connect => {
-			Nick     => $nick,
-			Username => $username, 
-			Ircname  => $ircname,
-			Server   => $serveur,
-			Port     => $port,
-		}
-	);
-}
-
-
-# A la connection
-sub on_connect
-{
-	my $kernel = $_[ KERNEL ];
-	$irc->yield(join => $_) foreach (@channels);
-	$log->info('connected');
-	
-	my $hour = strftime ('%H', localtime);
-	my $min = strftime ('%M', localtime);
-
-	$kernel->delay_set('_flux', (23-$hour)*3600 + (60-$min)*60);
-}
-
-
-# Discussion privée
-sub on_query
-{
-	my ($user,$msg) = @_[ARG0, ARG2];
-	my ($nick) = split (/!/,$user);
-	print $msg."\n";
-
-	if ($msg =~ m/^!/ && $nick eq $admin) {
-		my $commande = ( $msg =~ m/^!([^ ]*)/ )[0]; 
-		my @params = grep {!/^\s*$/} split(/\s+/, substr($msg, length("!$commande")));
-
-		foreach (keys(%commandes_admin)) {
-			if ($commande eq $_) {
-				$commandes_admin{$_}->(@params);
-				last;
-			}
-		}
-	}
-	elsif ($msg =~ /^PB/) {
-		# on vérifie si le nick est register
-		push (@nicksToVerify, $nick);
-		push (@codesToVerify, $msg);
-		$irc->yield(privmsg => $nick => 'Vérification en cours…');
-		$irc->yield(privmsg => nickserv =>  'info '.$nick);
-	}
-}
-
-
-sub on_notice
-{
-	my ($user, $msg) = @_[ARG0, ARG2];
-	my ($nick) = split(/!/,$user);
-
-	return unless ($nick =~ /^NickServ$/i);
-
-	my $nickToVerify = shift @nicksToVerify;
-	my $code = shift @codesToVerify;
-
-	return unless (defined($nickToVerify));
-	
-	if ($msg !~ /$nickToVerify/) {
-		push (@nicksToVerify, $nickToVerify);
-		push (@codesToVerify, $code);
-	}
-	elsif ($msg =~ /isn't registered/) {
-		$irc->yield(privmsg => $nickToVerify => "Il faut que ton pseudo soit enregistré auprès de NickServ");
-	}
-	else {
-		my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE code = ?');
-		$log->error("Counldn't prepare querie; aborting") unless (defined $sth);
-		$sth->execute($code);
-
-		if ($sth->rows) {
-			my $sth = $dbh->prepare_cached('UPDATE playbot_codes SET nick = ? WHERE code = ?');
-			$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-
-			$sth->execute($nickToVerify, $code)
-				or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-			
-			$irc->yield(privmsg => $nickToVerify => 'Association effectuée');
-			$irc->yield(privmsg => $nickToVerify => 'pour enregistrer un lien dans tes favoris : !fav <id>');
-		}
-		else {
-			$irc->yield(privmsg => $nickToVerify => "Ce code n'existe pas");
-		}
-	}
-}
-
-
-# Quand un user parle
-sub on_speak
-{
-	my ($kernel, $user, $chan, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
-	my ($nick,$mask) = split(/!/,$user);
-	my $site;
-	my %content;
-
-	if ($msg =~ m#(^|[^!])https?://(www.youtube.com/watch\?[a-zA-Z0-9_=&-]*v=|youtu.be/)([a-zA-Z0-9_-]+)#) {
-		my $url = 'https://www.youtube.com/watch?v='.$3;
-		eval { %content = youtube($url) };
-		$site = 'youtube';
-	}
-	elsif ($msg =~ m#(^|[^!])https?://soundcloud.com/([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)#) {
-		my $url = 'https://www.soundcloud.com/'.$2;
-		eval { %content = soundcloud($url) };
-		$site = 'soundcloud';
-	}
-	elsif ($msg =~ m#(^|[^!])https?://www.mixcloud.com/([a-zA-Z0-9-_]+/[a-zA-Z0-9-_]+)#) {
-		my $url = 'https://www.mixcloud.com/'.$2;
-		eval { %content = mixcloud($url) };
-		$site = 'mixcloud';
-	}
-	elsif ($msg =~ m#((^|[^!])http://www[0-9]+.zippyshare.com/v/[0-9]+/file.html)#) {
-		my $url = $1;
-		eval { %content = zippy($url) };
-		$site = 'zippyshare';
-	}
-	elsif ($msg =~ /^!fav( ([0-9]+))?/) {
-		my $id = ($2) ? $2 : $lastID;
-
-		my $sth = $dbh->prepare_cached('SELECT user FROM playbot_codes WHERE nick = ?');
-		$sth->execute($nick)
-			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-
-		unless ($sth->rows) {
-			$irc->yield(privmsg => $nick => "Ce nick n'est associé à aucun login arise. Va sur http://nightiies.iiens.net/links/fav pour obtenir ton code personel.");
-			return;
-		}
-
-		my $sth2 = $dbh->prepare_cached('INSERT INTO playbot_fav (id, user) VALUES (?, ?)');
-		$sth2->execute($id, $sth->fetch->[0])
-			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-
-		return;
-	}
-	elsif ($msg =~ /^!later( ([0-9]*)( in ([0-9]*)(h|m|s)?)?)?/) {
-		my ($id, $time, $unit) = ($2, $4, $5);
-
-		$id = $lastID if (!$id);
-		$time = 6 if (!$time);
-		$time *= ($unit eq 's') ? 1 : ($unit eq 'm') ? 60 : 3600;
-		print "$time eq\n";
-		$kernel->delay_set('_later', $time, $nick, $id);
-
-		return;
-	}
-    elsif ($msg =~ /^!tag( +([0-9]+))?/) {
-        my $id = ($2) ? $2 : $lastID;
-        while ($msg =~ /#([a-zA-Z0-9_-]+)/g) {
-            addTag($id, $1);
-        }
-
-        return;
-    }
-	else {
-		return;
-	}
-
-	if ($@) {
-		$log->warning ($@);
-		return;
-	}
-
-	if ($debug) {
-		$log->debug($content{'url'});
-	}
-	else {
-		# insertion de la vidéo dans la bdd
-
-		my $sth = $dbh->prepare_cached('INSERT INTO playbot (date, type, url, sender_irc, sender, title, chan) VALUES (NOW(),?,?,?,?,?,?)');
-		$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-
-		$sth->execute($site, $content{'url'}, $nick, $content{'author'}, $content{'title'}, '#nightiies')
-			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-	}
-
-	# sélection de l'id de la vidéo insérée
-	my $id = $dbh->{mysql_insert_id};
-	if (!$id) {
-		my $sth = $dbh->prepare_cached('SELECT id FROM playbot WHERE url = ?');
-		$log->error("Couldn't prepare querie; aborting") unless (defined $sth);
-
-		$sth->execute($content{'url'})
-			or $log->error("Couldn't finish transaction: " . $dbh->errstr);
-
-		$id = $sth->fetch->[0];
-	}
-	$lastID = $id;
-
-
-	# insertion des éventuels tags
-	while ($msg =~ /#([a-zA-Z0-9_-]+)/g) {
-		if ($debug) {
-			$log->debug($1);
-			next;
-		}
-
-        addTag ($lastID, $1);
-    }
-
-
-	# message sur irc
-	if (defined $content{'author'}) {
-		$irc->yield(privmsg => $chan => '['.$id.'] '.$content{'title'}.' | '.$content{'author'}) ;
-	}
-	else {
-		$irc->yield(privmsg => $chan => '['.$id.'] '.$content{'title'}) ;
-	}
-}
-
-
-# Boucle des events
-$poe_kernel->run();
-exit 0;
diff --git a/README.md b/README.md
deleted file mode 100644
index 77b81fa..0000000
--- a/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# PlayBot
-
-## ATTENTION
-
-Cette branche a pour but la réécriture du PlayBot en ruby. Avec cette réécriture, un système de plugin et des tests unitaires seront de la partie.
-
-Les dépendances nécéssaires sont :
- * net-yail
- * rspec
-
-
-
-## Description
-
-PlayBot est un bot IRC permettant de manipuler des liens audio :
-+ enregistrement des liens dans une base de données ;
-+ récupération et publication sur le chan des informations (titre, posteur) ;
-+ normalisation du lien ;
-+ sauvegarde de liens en favoris ;
-+ rappel du lien en query.
-
-
-## Installation
-
-
-### Dépendances
-
-PlayBot est codé en Perl. Il dépend des modules suivant :
-+ DBI ;
-+ DBD::mysql ;
-+ JSON ;
-+ LWP::UserAgent ;
-+ HTML::Parser ;
-+ HTML::Entities ;
-+ POE ;
-+ POE::Component::IRC ;
-+ Tie::File.
-
-
-### Configuration
-
-Pour l'instant, seule la configuration de la base de donnée est externalisée. Vous devez créer un fichier *playbot.json* dans le même dossier que le fichier *PlayBot.pl* contenant les attributs suivant (les noms devraient être assez explicites) :
-+ bdd ;
-+ host ;
-+ user ;
-+ passwd.
-
-Le reste de la configuration s'effectue encore directement dans le fichier *PlayBot.pl*. Les variables suivantes sont modifiables :
-+ $serveur ;
-+ $port ;
-+ $nick ;
-+ $ircname ;
-+ $username ;
-+ @channels ;
-+ $admin ;
-+ $baseurl.
-
-Les noms des variables sont plutôt explicites. *$admin* contient le nick du l'utilisateur qui aura le droit d'administrer le bot (attention, aucune vérification autre que le nick n'est pour l'instant faîte, il est recommandé de l'enregistrer). *$baseurl* contient l'url racine du site permettant de consulter le contenu de la base de données.
-
-Les schémas des tables nécéssaire pour la base de données sont dans le fichier *bdd.sql*.
-
-
-## Utilisation
-
-Dès qu'un lien est posté, le bot récupère le nom du contenu et de la personne l'ayant posté, et l'insère dans la base de données (grâce à l'unicité du lien et à sa normalisation, un même contenu ne peut être enregistré deux fois). Il poste ensuite sur le channel les informations récupérées avec l'id du contenu.
-
-Lors du poste du lien, on peut ajouter des tags en les préfixant par le symbole « # ».
-
-Les différentes commandes utilisables sont les suivantes sur le channel où se trouve le PlayBot :
-+ !fav [id] : enregistre en favoris le contenu possédant l'identifiant *id*. Si l'identifiant n'est pas préciser, le dernier contenu posté (et non inséré) est utilisé.
-+ !later [id [in [Xs|Xm|Xs]]] : demande au PlayBot de rappeler en query un contenu. La durée par défaut est de 6h. Si l'identifant n'est pas précisé, le dernier contenu posté est utilisé.
-+ !tag [id] #tag1 #tag2 … : permet de taguer un contenu.
diff --git a/SitePlugin.html b/SitePlugin.html
new file mode 100644
index 0000000..997ceb4
--- /dev/null
+++ b/SitePlugin.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>class SitePlugin - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body id="top" class="class">
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="file-metadata">
+    <nav id="file-list-section" class="section">
+  <h3 class="section-header">Defined In</h3>
+  <ul>
+    <li>lib/site_plugin.rb
+  </ul>
+</nav>
+
+    
+  </div>
+
+  <div id="class-metadata">
+    
+    <nav id="parent-class-section" class="section">
+  <h3 class="section-header">Parent</h3>
+  
+  <p class="link">Object
+  
+</nav>
+
+    
+    <!-- Method Quickref -->
+<nav id="method-list-section" class="section">
+  <h3 class="section-header">Methods</h3>
+
+  <ul class="link-list">
+    
+    <li><a href="#method-c-for_site">::for_site</a>
+    
+    <li><a href="#method-c-inherited">::inherited</a>
+    
+    <li><a href="#method-c-repository">::repository</a>
+    
+    <li><a href="#method-i-can_handle-3F">#can_handle?</a>
+    
+  </ul>
+</nav>
+
+  </div>
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<div id="documentation">
+  <h1 class="class">class SitePlugin</h1>
+
+  <div id="description" class="description">
+    
+<p>Implement a plugin system.</p>
+
+<p>Each plugin have to inherite from this class and implement a
+can_handle?(site) method.</p>
+
+  </div><!-- description -->
+
+  
+  
+  
+  <section id="5Buntitled-5D" class="documentation-section">
+    
+
+    
+
+    
+
+    
+
+    <!-- Methods -->
+    
+     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Class Methods</h3>
+
+    
+      <div id="method-c-for_site" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">for_site</span><span
+            class="method-args">(site)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          <p>Return the plugin that can handle a given site.</p>
+          
+
+          
+          <div class="method-source-code" id="for_site-source">
+            <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 16</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">for_site</span>(<span class="ruby-identifier">site</span>)
+    <span class="ruby-identifier">@@repository</span>.<span class="ruby-identifier">find</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">handler</span><span class="ruby-operator">|</span> <span class="ruby-identifier">handler</span>.<span class="ruby-identifier">can_handle?</span> <span class="ruby-identifier">site</span> }
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- for_site-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- for_site-method -->
+
+    
+      <div id="method-c-inherited" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">inherited</span><span
+            class="method-args">(target)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="inherited-source">
+            <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 11</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">inherited</span>(<span class="ruby-identifier">target</span>)
+    <span class="ruby-identifier">@@repository</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">target</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- inherited-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- inherited-method -->
+
+    
+      <div id="method-c-repository" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">repository</span><span
+            class="method-args">()</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="repository-source">
+            <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 7</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">repository</span>
+    <span class="ruby-identifier">@@repository</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- repository-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- repository-method -->
+
+    
+    </section><!-- public-class-method-details -->
+  
+     <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Instance Methods</h3>
+
+    
+      <div id="method-i-can_handle-3F" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">can_handle?</span><span
+            class="method-args">(site)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          <p>A place holder method. This method <strong>must</strong> be implemented in
+the subclasses.</p>
+          
+
+          
+          <div class="method-source-code" id="can_handle-3F-source">
+            <pre><span class="ruby-comment"># File lib/site_plugin.rb, line 21</span>
+<span class="ruby-keyword">def</span> <span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>)
+    <span class="ruby-identifier">raise</span> <span class="ruby-string">&quot;Method not implemented !&quot;</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- can_handle-3F-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- can_handle-3F-method -->
+
+    
+    </section><!-- public-instance-method-details -->
+  
+  </section><!-- 5Buntitled-5D -->
+
+</div><!-- documentation -->
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/TestPlugin.html b/TestPlugin.html
new file mode 100644
index 0000000..8273ae9
--- /dev/null
+++ b/TestPlugin.html
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>class TestPlugin - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body id="top" class="class">
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="file-metadata">
+    <nav id="file-list-section" class="section">
+  <h3 class="section-header">Defined In</h3>
+  <ul>
+    <li>plugins/test_plugin.rb
+  </ul>
+</nav>
+
+    
+  </div>
+
+  <div id="class-metadata">
+    
+    <nav id="parent-class-section" class="section">
+  <h3 class="section-header">Parent</h3>
+  
+  <p class="link"><a href="SitePlugin.html">SitePlugin</a>
+  
+</nav>
+
+    
+    <!-- Method Quickref -->
+<nav id="method-list-section" class="section">
+  <h3 class="section-header">Methods</h3>
+
+  <ul class="link-list">
+    
+    <li><a href="#method-c-can_handle-3F">::can_handle?</a>
+    
+    <li><a href="#method-c-new">::new</a>
+    
+  </ul>
+</nav>
+
+  </div>
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<div id="documentation">
+  <h1 class="class">class TestPlugin</h1>
+
+  <div id="description" class="description">
+    
+  </div><!-- description -->
+
+  
+  
+  
+  <section id="5Buntitled-5D" class="documentation-section">
+    
+
+    
+
+    
+
+    
+
+    <!-- Methods -->
+    
+     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Class Methods</h3>
+
+    
+      <div id="method-c-can_handle-3F" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">can_handle?</span><span
+            class="method-args">(site)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="can_handle-3F-source">
+            <pre><span class="ruby-comment"># File plugins/test_plugin.rb, line 5</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>) 
+   <span class="ruby-identifier">site</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">%r(www.)?youtube.(fr|com)|youtu.be/</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- can_handle-3F-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- can_handle-3F-method -->
+
+    
+      <div id="method-c-new" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">new</span><span
+            class="method-args">()</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="new-source">
+            <pre><span class="ruby-comment"># File plugins/test_plugin.rb, line 9</span>
+<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>
+    <span class="ruby-ivar">@testVar</span> = <span class="ruby-keyword">true</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- new-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- new-method -->
+
+    
+    </section><!-- public-class-method-details -->
+  
+  </section><!-- 5Buntitled-5D -->
+
+</div><!-- documentation -->
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/TestPlugin1.html b/TestPlugin1.html
new file mode 100644
index 0000000..d77a82c
--- /dev/null
+++ b/TestPlugin1.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>class TestPlugin1 - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body id="top" class="class">
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="file-metadata">
+    <nav id="file-list-section" class="section">
+  <h3 class="section-header">Defined In</h3>
+  <ul>
+    <li>spec/site_plugin_spec.rb
+  </ul>
+</nav>
+
+    
+  </div>
+
+  <div id="class-metadata">
+    
+    <nav id="parent-class-section" class="section">
+  <h3 class="section-header">Parent</h3>
+  
+  <p class="link"><a href="SitePlugin.html">SitePlugin</a>
+  
+</nav>
+
+    
+    <!-- Method Quickref -->
+<nav id="method-list-section" class="section">
+  <h3 class="section-header">Methods</h3>
+
+  <ul class="link-list">
+    
+    <li><a href="#method-c-can_handle-3F">::can_handle?</a>
+    
+  </ul>
+</nav>
+
+  </div>
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<div id="documentation">
+  <h1 class="class">class TestPlugin1</h1>
+
+  <div id="description" class="description">
+    
+  </div><!-- description -->
+
+  
+  
+  
+  <section id="5Buntitled-5D" class="documentation-section">
+    
+
+    
+
+    
+
+    
+
+    <!-- Methods -->
+    
+     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Class Methods</h3>
+
+    
+      <div id="method-c-can_handle-3F" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">can_handle?</span><span
+            class="method-args">(site)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="can_handle-3F-source">
+            <pre><span class="ruby-comment"># File spec/site_plugin_spec.rb, line 8</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>)
+    <span class="ruby-keyword">false</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- can_handle-3F-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- can_handle-3F-method -->
+
+    
+    </section><!-- public-class-method-details -->
+  
+  </section><!-- 5Buntitled-5D -->
+
+</div><!-- documentation -->
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/TestPlugin2.html b/TestPlugin2.html
new file mode 100644
index 0000000..a3a1588
--- /dev/null
+++ b/TestPlugin2.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>class TestPlugin2 - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body id="top" class="class">
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="file-metadata">
+    <nav id="file-list-section" class="section">
+  <h3 class="section-header">Defined In</h3>
+  <ul>
+    <li>spec/site_plugin_spec.rb
+  </ul>
+</nav>
+
+    
+  </div>
+
+  <div id="class-metadata">
+    
+    <nav id="parent-class-section" class="section">
+  <h3 class="section-header">Parent</h3>
+  
+  <p class="link"><a href="SitePlugin.html">SitePlugin</a>
+  
+</nav>
+
+    
+    <!-- Method Quickref -->
+<nav id="method-list-section" class="section">
+  <h3 class="section-header">Methods</h3>
+
+  <ul class="link-list">
+    
+    <li><a href="#method-c-can_handle-3F">::can_handle?</a>
+    
+  </ul>
+</nav>
+
+  </div>
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<div id="documentation">
+  <h1 class="class">class TestPlugin2</h1>
+
+  <div id="description" class="description">
+    
+  </div><!-- description -->
+
+  
+  
+  
+  <section id="5Buntitled-5D" class="documentation-section">
+    
+
+    
+
+    
+
+    
+
+    <!-- Methods -->
+    
+     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
+      <h3 class="section-header">Public Class Methods</h3>
+
+    
+      <div id="method-c-can_handle-3F" class="method-detail ">
+        
+        <div class="method-heading">
+          <span class="method-name">can_handle?</span><span
+            class="method-args">(site)</span>
+          <span class="method-click-advice">click to toggle source</span>
+        </div>
+        
+
+        <div class="method-description">
+          
+          
+          
+
+          
+          <div class="method-source-code" id="can_handle-3F-source">
+            <pre><span class="ruby-comment"># File spec/site_plugin_spec.rb, line 20</span>
+<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">can_handle?</span>(<span class="ruby-identifier">site</span>)
+    <span class="ruby-identifier">site</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">%rtest/</span>
+<span class="ruby-keyword">end</span></pre>
+          </div><!-- can_handle-3F-source -->
+          
+        </div>
+
+        
+
+        
+      </div><!-- can_handle-3F-method -->
+
+    
+    </section><!-- public-class-method-details -->
+  
+  </section><!-- 5Buntitled-5D -->
+
+</div><!-- documentation -->
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/bdd.sql b/bdd.sql
deleted file mode 100644
index 06bd7d7..0000000
--- a/bdd.sql
+++ /dev/null
@@ -1,34 +0,0 @@
-SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-
-
---
--- Structure de la table `playbot_codes`
---
-
-CREATE TABLE IF NOT EXISTS `playbot_codes` (
-  `user` varchar(255) NOT NULL,
-  `code` varchar(25) NOT NULL,
-  `nick` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`user`),
-  UNIQUE KEY `code` (`code`),
-  UNIQUE KEY `nick` (`nick`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-
-
---
--- Structure de la table `playbot`
---
-
-CREATE TABLE IF NOT EXISTS `playbot` (
-  `date` date NOT NULL,
-  `type` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
-  `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
-  `sender_irc` varchar(99) COLLATE utf8_unicode_ci NOT NULL,
-  `sender` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
-  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
-  `file` varchar(150) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `chan` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
-  PRIMARY KEY (`id`),
-  UNIQUE KEY `url` (`url`)
-) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='table du bot irc' AUTO_INCREMENT=652 ;
diff --git a/images/add.png b/images/add.png
new file mode 100644
index 0000000000000000000000000000000000000000..6332fefea4be19eeadf211b0b202b272e8564898
GIT binary patch
literal 733
zcmV<30wVp1P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Z%IT!R5;6}
zlj}>9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa
zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov
zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz
zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2Zu<x6&^l=W_1sO_5@*~{AJR(k@osu$W
zIOyKBVDIZThPU;2xYmJgUn>lL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@
z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2p<DqQ{Z%tMS5;_RkwZ2s
ziU|ZZE*fUaAe}14z#AR(OU=04okqn3igEs-_q_}KZ*?@>gg+heWDyked|3R$$kL@A
z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6<
zT=e_Y=<?pf1$FXK3F5I5#ceAAN5BHvd?h5_(jPS+7l@o3)VYh{*frx)Pb%2=Sw~G2
znu{1!PYZ*jM}To^G}f>vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv
z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxE<qS_Liq!k=vg3Per<qx!vKx95m{X+
zQ8;uQPPk0h^qI`uo^&$1^CFd@NeQR5pADaHJwu&SvB+fQDdu0d@n7>DK}O3T04USJ
P00000NkvXXu0mjf^IS-S

literal 0
HcmV?d00001

diff --git a/images/brick.png b/images/brick.png
new file mode 100644
index 0000000000000000000000000000000000000000..7851cf34c946e5667221e3478668503eb1cd733f
GIT binary patch
literal 452
zcmV;#0XzPQP)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzR!KxbR2Ufr
z!9Pe;0RRW!@7<lIl3o%R*`Lh}3L0v44WhBhrLn=H)^JZ~X)lPPp*Ym3y&;EiD#3^_
z;}R2s(2l&aJKy{DeMJDQEOc(}O)|dId@(Z*AR=OUqSZ^1Bx&_tPDVr&v9i#a-8-w+
zG-X<R@>Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>h<N+(r5>NMU>
z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~
zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O<Ao~*SBxI
z`SL+wOarB!5l6MHf7`vAYen#UBKI<P{@6LCZG|0M`+1T_cfL~u@bp6FGkdxCW!wI8
u9^8Hp6am2FtGS=SJe+$CKoI}{0Kk9KAGswB^FYP`0000<MNUMnLSTXd=EXk%

literal 0
HcmV?d00001

diff --git a/images/brick_link.png b/images/brick_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ebf013a23a56653655a736a7e149deb7365ea03
GIT binary patch
literal 764
zcmV<Y0t5YtP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!j!8s8R5;6R
zQq4=^Q55~b!2Ag<W<3P62<AVC7)g*?REu`A(sFPWZK_2?9|KY?Dk3XVN)jw9B3evR
z^aU<T#iERcK19Qmte-!p$x=J>&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh-
z%-mbG|0Na{7Ruai_Y+DEb1s+b!<z(u6)%KZK>*9k%Q!whMxjtZKA*?o;i1g&jy0@(
zaU=-@d-h+o%gal6JRXEXA&L3<d6_G5l$8XFi;E5c9334=MZ)LvVRdyCPN!3XF>`d2
z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3
z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r
zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM
zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{
zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb
zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc*
zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0
z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF}<kCS&HrU5YiVeML}SUjDAKvhuURV7M?E
ujlV1w%Y(pUV`Jl2fiEJ~nByI5So;SIr}_C=u4<M50000<MNUMnLSTaX=VJK)

literal 0
HcmV?d00001

diff --git a/images/bug.png b/images/bug.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d5fb90ec6ee08f53947e0266a87b03f75893446
GIT binary patch
literal 774
zcmV+h1Nr=kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!m`OxIR5;6>
zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC
z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc*
zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{
zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3
zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5
z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^
z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3
zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff<mavWU@F1lMyb8vQzyPGq6ja~k(n
zyJ4LwMAcX>18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F
z3&*?-4U-lm*#t<gCyuZ=gqeG7A3)z#^rg8Z=vrz+@wg7Ig$`KUI#iD2pl8ko>ber5
z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136
zq#a^3xNBke)In+!?<ES&ylN&<%d1G-<d!CYb1t5U3SgCL7rB$H{GWnLOhq#n{3_0?
zSPK_-*fz4_U*K%;$`ipopFsQ<fEC9WzmsT)-->qk3%4wB69{pF`Tzg`07*qoM6N<$
Eg55P&8UO$Q

literal 0
HcmV?d00001

diff --git a/images/bullet_black.png b/images/bullet_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b
GIT binary patch
literal 211
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4
zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEh<e1m{W1TG{hRu`
z^=xmrTBL;jnKLdu{NFfXdsB4R+Qx@k0%istytgJC;bWA(_^)`{*9T!h3mH6J{an^L
HB{Ts5vOrN_

literal 0
HcmV?d00001

diff --git a/images/bullet_toggle_minus.png b/images/bullet_toggle_minus.png
new file mode 100644
index 0000000000000000000000000000000000000000..b47ce55f685dac56ee9d63f2c3d426bfc4c9e31a
GIT binary patch
literal 207
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9
z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2
zYsR{H!kvIN--9isvHznRs<i)4|8qXx+(6ND8xzBc$?{dfrt4dQmN9s``njxgN@xNA
D;VV%`

literal 0
HcmV?d00001

diff --git a/images/bullet_toggle_plus.png b/images/bullet_toggle_plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ab4a89664eee1aa81a51ca127f64cb3ac6fa918
GIT binary patch
literal 209
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9
z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T
z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$(
F699+YQR)By

literal 0
HcmV?d00001

diff --git a/images/date.png b/images/date.png
new file mode 100644
index 0000000000000000000000000000000000000000..783c83357fdf90a1c7c024358e1d768b5c09c135
GIT binary patch
literal 626
zcmV-&0*(ENP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!1W80eR5;6(
zQf+G*K@fiKywr>5OC%H;f`~O(q$Q#t2<^v$A>fbmv%e#dKTwK=Ku{5lS|}<-`a#7b
zzTCOnnT>at)D}AMFuOZ5&%EqFN(lyumd$2ASF6=;nM~%2?gqc@U=#|4PqkX@EBo-9
z7pD#bO_RUa>*faM`8<YqcMz2dUgJsF7QDU1o6Af5yuZih`dZo2Qfj(J!cJB&2rCxD
zcDqG59>;MYfVi$JnB-zcBFc6gjl$d!bF98Q!!!(Z1_R~P?e!pt#6CHJ9S&n_n&@=9
z%GP;!@Co4c*at+6vNz7o(6en^Q1%qHrc;1)9IRaz-$@S$Z-qdC^ds3X0NvQH;KS)D
z-dh&rW&@X;1cS(45z)J&BV<Txgy3R<M<VsBsMqV#b=|+haU8i^E)`h#jbk|0zyVpW
z*J!ufNT<{2_xq~%`FxIYx$J$pFZv+@4jzq0h|uJ7xg1id6hfg8D6<cb=ox|cn5SLv
z7KPDjwNy0@50t8-R{WShT6kIFY&L_S$#d{zGErxS=XY=h`()e>t+tv&GMVJ%!EiW)
zLBGZW)#Z+gl-Lih&?>X3SS-S#ujQ;9JRXmIB7X)8`d6ETj)D#Q2+$s|<_b7-B9Xvq
zwNfqlEp%y3$uY`h{Y$(Gn5@}sqEsq95lpAkFO5dyBmP6^H-51G4J|rN2Ujt<`2YX_
M07*qoM6N<$f<j&%R{#J2

literal 0
HcmV?d00001

diff --git a/images/delete.png b/images/delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..08f249365afd29594b51210c6e21ba253897505d
GIT binary patch
literal 715
zcmV;+0yO=JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!T}ebiR5;6}
zllx0kVHn5#Tecsf1c`2hgi%nK^D=kV+T5njvrLa$EMjSnone|mjm2E}L#U;8)yiKo
zO>C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR
z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y
zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;<E2
z80_Y*w_}NMA$su)e0B@`wrYegSP*HT5w@N{_}&f79VIb*XrKGBY>yxzh{5!Htr?51
zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7
zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp
zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y
z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l
z!7?%Uwib*ROP67Hw`ika)gX-(<Pal@1N`)16#~~<@x7jghg9OTS^;mJ8T{oIOsMnG
zla<QHU?S-#Kb7w%o*dlEj!JgnOSKW+hV$`!syc>8Ia`-u_IEhxG7U<13kSsMW+$<e
xd62)I>lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc

literal 0
HcmV?d00001

diff --git a/images/find.png b/images/find.png
new file mode 100644
index 0000000000000000000000000000000000000000..1547479646722bda4647df52cf3e8bc9b77428c6
GIT binary patch
literal 659
zcmV;E0&M+>P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!B}qg<R5;6H
z`2YVu10|S&>IO9T&v~?D!=C@G6X*U1@h2}>2WE%HrrsjTfQsh6N9%SR25A5rkWp0g
zzi;-6|3HJE;58sAyX1e@^d<jmJE#6{n>7EwiKQLb00%dp|5+t<{|l;G!D3eSuFDma
zRCxr2MVY_`ELgLXqo}ssqp5E;*r|opZT~&|!~VN?1^mw`Yxp0VmiIp*r|Ey~#AW|W
zTBd;IxVd?%*x1<_!3Ip2yP9Rn!u1aqt=siKx4a3At0%7dKV|u@|9wlg|7x7R;eT!K
z{QuFp&Huxb3&AdAW?^~2z`(!^HUQ{cR*=op7H|BYU0VMi<mZ&!^8eAvIsetP^uRWP
zTmlo1OD_QGV)zHdtY8Du3MyIsLSuef*gF093XJ$~Y+?IfTi^J<tb+1W5ixNCNg27V
zViHpSf&Tt4DlYk-myiEHBO~KGpaD$qK=cWUIt&W9U5C&7U$y1H|Lz&fKmoP_B&VvW
zv!b$P!vD294uR!BF~Y|$co-!X+<b!n<X1F<4FJ06e|$#ae?4RKs~|a`%~wG&05Tvo
zzv6#-VfB9wPOd*F1~|I={)ZU=Q>3A-|5H&#ol!zs_8lnTU<QD~f|Zr+KZ*g?j&9(1
z1|=Yn0#IP;8kzkE`k!A(RpScC08lK!<bYv-Y5*vK7?@as0}tru|3I7nOUo+!2L_@P
t(7(4ixw!uW;~f-zpcnvS+GQqEF#w)2XpIh9Jaqs7002ovPDHLkV1l;eHv<3w

literal 0
HcmV?d00001

diff --git a/images/loadingAnimation.gif b/images/loadingAnimation.gif
new file mode 100644
index 0000000000000000000000000000000000000000..82290f48334c81272ff5991962951758137a08ba
GIT binary patch
literal 5886
zcmajjXHXMNw+HYfB!MJ=D4~f36H2I3m2PMP3Q|QxK|qw=qzI7`I)vU!XwnHCsVYcE
z=`Hl$dsProxjgTe`_9~X=I-a+ncbP+{LeY7ta@Ku!ejtI184&P&d$zGPEL-Fj`sHU
zHa9m{S63Go7iVW@CnqOIM@NT-hWh&Yy1KgB+uNI)n;RM$>g(&PtE($2Dhdk=&(F^R
z|KGZGj(DV`tD_*NsU$2QNCCXqf9n(sfdh~LzJJdCa}5CGoUI+JZJBOCDz({abl~fE
zw*5kfzVoR6cNi2r#C!ZEH0O<?=na-Gi{TCI{a6Jn2ArW<+UV98bAnZ^;a+`lkM_j)
zfe61h)F=FMYqJVF9VO*kKTUU^ARmOsL)F0GkkGJ*NW$}nvB89}aO%h?t>;NW@rIh|
zlqsqSSs9s#;sV;-@|>77A1W_O_DV`91Pq4Kz`Z(PaO&pn=GOMkuU$ROkc5GuVd!Y*
zcn`UMY<Og<W2T$@p!3@zm^`quJ-N}bwKzFHy*;;wSZ$)>kYq7V07o@rsi~>-ziMLT
zG+?a49zQWzia{TFcs{FKj#dh}e#z5@`O3omC>ELXboP2cR7WT?J@&ao#fn-I;sJ*F
zD;=5p9?%y~V{F{q4^{|Zlt~d?*Ve!iWj&E%8@h^*gN$V29v5mAsN{O(ULD=kFMd^>
zzLGLp)CZ#Qm6Q%3+`@kXtfre9GnE->Ai(oKKDoxtH@hRaB&C1e=IHR>I8;havNP_A
z5Rq#nPVBdI5VpJ;S&et6>VVp>c?LwQ)tZWlq#H^i>)VP@16GREXU98`irCrvkEecY
zkv~S7^T>M0*)Mb{LvE6`M77!t_ZXXI^`uU6W|L`YE-^~uca*s^)=F=9o*rxs>$qx+
zN_$rAd`ahYK<ux!QM!M>2^cpF)HkQ1(Vq|Urh;b~<55D)DL$EUNo=p_A6VQ1A+M~)
zfa$>U0O5Rbu4r3$+|O$+gUQaOR@{dPsf3U1Dln%z0(Y0xq^w4=AKW8UMLXPC9RL7*
zZ3?i~&mg|kvE%&Q2{D=<{q^E0^^<esUTaCLynFqpE!V)v6~>uNwISF-V^g!SN_6Pp
zHm8=*qyzo0O&|aW=mQ}BV^c}pv_6$imk>cA#v4GgKI?F@S#sYw42|o9Jp1uLDt+Ls
z2-H#~>q=LQWTF;nU7xJYKH2KCI4{O5B$T{{EgN}dE+rE|#F+n@O!gj|u;Xxe?Su03
z2tWqC_4M@)#<@OoQ{pg&@m`>d=YYXNQlKHoj2tjT2nB<`FCZcENCi2SLd5c#<U&$$
zes)7<ZCOJ}D<q_%qxP#%MmO&j1TTopWl2R16&g+QLQIW-#=It{mxfmsIA)wz7b|wR
zP&;!+$kC06z3uhGwdLcPBCh=eb`Ox*KnT~Pg}e3~Ah5$a6;KgJ|AR$xpF2>Iz{+w=
zQMis*31e?RPgP7h#4AOzY&hE#R4n&Ii?x5Yq0)?J7KNcBj@<EaVi{D7;GIOB6>XdX
zlWZ;>n^k?`V`54w4oMu!H=JW%u_9}!!vS4^ZMC2#K+@g2!t)G5*y)(xiYlL_px35D
zIhY0lK348EIpV!%r-=F;O(7xbv>oQP6>|(>Opp4COU-9M>Q6ub0PdDCFo(En#x&eN
zGni{g@pt^Yi&Zk-WUSBg%!GQT&imw!)F&}=v0^+<x5$D|Y}u;@=M{@}e^xD7BBD;q
z`0H+^xwo$}$<Tjle`vw+Tn7763=S7Pcd4yE{1SMulji50A@-tk8qoAYBDNv%g<O)l
zbEf?B$Ulip4-t#iNuDS=HmuDES&?Wt&0MSHvc^nzgBNJ})5MYUYUR*7G$U7*+T}`>
zPAeQFDhtKVnUuxMHpDJZ^)IYcqn3l$E3tGu>6%O0JW{Qd&uUAT_CJz)Db-2{$Z4Cq
zibD~-93PZJRMP~xt4_LEY#WADM=C$k2DOim8}|&T7PflIw)ySUdh%=c{&;)e+r`Hd
z>F)2L5sYyl@Pwfv-Z+Q9(~d^Q%E@BrXlV!+zKk$1SUf5lN)jz7MS>v}FnGm>Qbf5(
zWmQ8>Y4OMAhWe&Lk?b!b?Oi<reF8bvwH*Wb-_mJlTm?WN9{USnBJ+zbh}F3T1a50>
z7q@cwX@48D4*Plhd-GIrduvP}Ef)tlzfP@U!q&vPH#vyU*UZF+Z1UXs%zV%z6LOs+
zcaVxUJ2&!|`1z(BM}Lk=9HZd_-+C?1s|j<U@oN*p%WC17xc6HDfpXvCWW}xvT18@f
zAxwxXhF2Ljbn^s2{!Z{}9!QDmAl6pWu2|R2=x(5AiYsQ4g-!+9<Q{WN{NwE%cvF$6
z(P;hEcE){WI!oiLxYJ3wU=(1!1$6VCO}==z;WsWyZynvCeEk?6kv;$*6RY2tqpl;(
zgsomrE#-eNuyfk9J$_qmFK5DCY<topGX3$G>(*3pM}K)5P_O^ZvgjpgCOOIH^P=rz
zrnafS&0I?@i8t47Fuv>lf<z7s6K@<oN!#SQ8@Tt^?sq`X#+b?UfaAMUl(=5<i(fr1
zFN_Yy7t@8kDUajFUqDAXo>^b<WqfZBS<KUQK$<esJJ3kxEvVD@IxScqrMW?0p!CLL
zgIJU4|0SI`w4+4Rsoe>*BgG?Gr8}Rx=$^MeEIq58C~R;2W5b2+Z6DSOmY&y?jM>PP
z<M}3<!=@Y*kezH0(Aj*rp%z#%Z09(|7c@Mm8g%t}|DKY)D$*P2^BCvohUO;ty+DDX
zktn!-bSxrX5DE21rU<4HGkLQFbI@Q&dI365wFFg^onFROK`O5H7mh?wQwoBJ$O|Yf
zNSNbS-qvpCUatP07Q}#c=jgccWZ#(G?C|{Hw`u$$8niqyw7KoEE4+pTnK*t2LG`S=
zTF!p{J)l^!R|4Q)!yhTsLDQ)`DS+I%ol(Y(1pGB^apsDFwjgGi^fR%hNlx(ftsl9H
z65CUG6x0S0@9MFupAv=C1E;DY@_K`~TYu}iSLQtukudD2xOjTG{r48+xE_ranI0(1
zXdp<=)GO5Ob`Ss9G}Bu4s@L#wP|cQT)$3byAkEB|g1BoGrJ2@GcwaOi&Wx&x2Gfn1
zz3FLPvl&oJ?F197n<NOU!ORz#{<YW{vX=Z%?1%+7;iNs_tU@U^=`OO>mCH(!b;p5a
z08~hSk!QD03@!sbLen@ur<E_xxFN6+5qIroT9wTL?55d{<Tq{@1r>U{Gbn>9K(ikm
zl#3h~9C5N=ig9Rs_qtTd=#qk`!ZGs7NvnMZ+uzd@j(?Rvpko)yuH)l~lSKOGS)aBD
z7_OmZBdg=SE=0ln<WZNt8fZIo8VVolRK#>y&|8m4WGI#J|9B<cTiCi#Y@MlWb!V7A
ztkpT9_Unz_v9Y&KIHZTIUx2T-hL*D>J}fBGEjm<G2+j>h_+3QFV-yUQn(l{$5#`e$
znfciyaIqFV2bzbhDu?7{<$RLQFC=|ws^?CtX)4I8sO>-(eMb1ar-sUdK)fzgqvMk>
zZ^Rh)#8kxW$|S;j1HHPvzPz`!bA(!5h*+9K{Bl4}FHo45&3%yp?rDAP3~x@+ME*8G
z&}mIK2Y`4+qxB<9rNt@5hlZ)HG`HKZFPtZ(CdCW@wfOGs!rX<kdt?O3)w<|6^L>e8
z-mBDPnj{HhE4Ayk=DMsy6c5sbcY=`3>S0gZ@AO)^Sd)t$p13pA3PJ#dmLDTD1s}Wz
z02ItQF~<A-)Ao*rvpY$NT!t>53Ov+wZ2P`n_U4VAJGo_<)CMpqJ3n-|`KmS8<a-VP
zfb}6-9lHLtxlA-4pw!z`EWxpF_GW8^%G#coZchrGR~?^D-r4b_JQ8KY#@ifJ84r>^
z<6NCKAuP(yrPRXiqft#MxAk}%PIb2CItemH*OUB$_E1dAyieI6EigfeNusQvXT~9L
zwllbU*O+j+W5Qti)3H?p?*D`9lDN^-b^Q#pv$U8g4>1<DX92|~7EkcZPwN)$-WZL3
za_5#WGQ%>bxARs=rK5^IfwL5Y4H4Pl{I}`^(PH1gYU{*wqe@3$h1OCneK4J4!&MRe
zOI%s;fxPp5H9Bx6x{Qq<VT;a>EsK*Hpw`q|yBo$$v_ZDvLxN=kn=g9|eG|t{-cBCa
zWSp2ev%7lwBK@tsaE^R7fx&OwUGQ#^arcni@_`qa0+Ih<3e19Mf+3k%g+)@Z0>QL0
z!HU9+@@y$mUhU^<UKk>$zNMt8xbj1@av;@3!U%#u{N{thykrE-duU`-05?CiI5){L
zy%f8$xwgE)K0S*=93sE3FU*{+{yF$b=Jm0O!B_#^eoI(9dVeEu^GYSFGhk6VM2eP;
zSzH6(dYAFYJ=IMG-RZ%6^E|!yINDStfqn3^nx(_a*MMt-QOJ6FngYP6Flzi8{}M1u
z?#m8_6qlhH0|2mB*E(B$x{iH!qh!(v^CX*om>t8m-!J2T%OyrE@fg!+W!rCupnGfE
zR%c(5_C1*?Q|=SfK?@c3?d{0gfIk6Qne%2NAR%5!D1e2lrEA=#=314|^y}mlbdU!h
zPIxs%P{lm;bYgjBs1qyXxkN6UD66G>mRl#Xr4z~PvG$je@$TcPPQN{YiFfsV4Ahz{
z;nj44T{SOdcs1301%HU_N_w4#jyn9@;-ar3_x<_h`fhkmBj(Iby8UQuwZ@CP3EK}j
zbXm^OyhBqkWQ~AeVy^iVB)4Wh<htyd@(`|fWUQJdfiVaGs(ocqzV%-d+<$k;WX&tD
zv>)+=b5--vjbtrvx4823+e>fN%<h7hn*;MqAO3V=Q*THW3AUECZ%jCB8__OBbU4W=
z3B3-Yu;rGl9kMQEDRE_H*`=TEb6r+{_x7R;+0gg}ya{r4)U*xrAOySI_lmmr1ZE;~
z0mhFL?w6J!mv!gDOG;*85iyl?2bRyD<A<m!sTBEGkjoD%PED^9_{7&-T?6@c=Rds*
z2z1+GaG0MwW{<o80~@~pvpmT)Z8os7Il7ITSeU`hZE#L6&F-GA{r-trS5UT}3ju2k
zEoU({L9UxDTx*m745li|AZb>unKd+&T&~@;LSp8#I-|*I=U2LzE0($<|LW%XsA_XQ
z3>6@ct56W8`Y2>d{!pjH=F?<22mf_ejVWx&mfsLml615hA!(-FDBnc-jDQv_NKXNy
z(=8#eu15MT`JMYUW~~vr%z{`z9S|~|_VAY6Ov4M7#Wa(*<q~zX79fCTCI%FDYcPv%
zBkpxqSFEi;9^ade#g4RR9s;B!p^fP5w+0bmmsfo(IC=$oC5cA16WW$*H4UtH^=7|#
zzI;wM)wbx}>O#3EWzRYv@&_zy|0i*@_46?BhYPPEpVGD|(a((4@b>fF)l-3jQvCcv
z{o)yqMWo1gDT<tpxw7K9n_g#s(-`}_V`!3MJ)j_!D_4B%_04Jh@SpF*7-qhI9|HR~
zCQ1?!?CEF@G0Z<qV&0sMVk{>G1vWp=_AJoP5UPxA^qrdn6*;Qh%^sB8>DcX5d2bXh
zu<5X$-n2+RVUy$k%$jmfMxgu4ZWTs$Oy{Q?try<h-NDr}$mWr=Rj^z5yH~Q*FkcKT
z+3P}y7ZL_1re(a(07LjQQ%E_aV*UbBCL$Zc$6t;q$jz!KP0IUHTUK4tR^M2Wj^LuE
z%6Nr<@?SV{7#P8fj=NA#an1D3Eudy#LBr&+4VSIyouK(`#BRj*gX7Ir<kHcfzwt%N
zkNiP!Kicgj#-{f7YUHboabThJR!N3-RcZhESqUK1b(b*am@H*)Hm>u(5>W>)zs2)w
zHL}wWPpTzwL2MM8=lkwHp3#jyMe3%J0Av0)*ixKl2lMvu@{j$n91n^pNe|jd``l0N
z0RU<<It)3DPhm_srp&Qn2ClXYrDSHN*$@D5v+qycK(ygyw;%V5Sq1l0Yv280(M!}f
zpY~V;SMkfg&QU5(K+pAf2w;Knq8fpJert*XhFrvTm}#z>BSv#yWY}G&Kb9IUxK2(l
z!4Sz=T3g)J1mqFu!`seMX@O}Bp}gyZ@I7GK*7vWYuax&DJ=8$)<N%c0_@&zceiZy!
zCsVh#-SK{xc=_fWWR!mG2{A?x*)q*ey|w6=@joYOr@a7Kc!2Oj=w=*|owV>{{tXS>
z7+}lu)M-J126vy;?q&^}iM1!NCf1I@E@@H~O-PIlsM7kknVdsATr@pmBo(C~$G6gS
z02;)2O@0&~`#fHDeC1eCZZs;s2N)@A;Z!v}6IRW@+w4GRSlrsuorBjfJ?y*o(0gj>
zt+<hF<g`m2uFAOoM8(U(+1eH57GN7lNs0Fm0z(b>;DN~K1pX*UvM(B(Di$9F6+&eT
z#bhNzlMA>q^N?j+@1IqnYvK};_)_77Ts{!elaGqJg{uwb(1mX6u=pkfLJYkfX+`v!
zOm>eolNV<DQKK`%tH{B{sg1XYt+pmK^sB=@3TS#N1ca7fU)1Bz{9*#NUVoVw^-UfR
z;=Yzyu8D1xLY^C5(|62n3!_3m+79NI`@&3xnyb`te?u%xm{-dceWjk)mEvGg`5fEx
zs?YJZJt-CTJ-`2Quc9z!zbxs4Bci>>Nz$A&<O0N!itfAch8AnB$UScRJ~Lcqu+)oo
zGt~|Yx)B;J+U}aHEX05a-iE7}6$gWU_kH`6xZg|<0AEUx62HF~tZ6JiRVZTdDqBcM
z!z&rKmfD>W8YqkN#cU|#i6j>Ox+Eu4*8Myq{Eq?u*kn+nT<lKCb_n3J$zBJ)qovNG
zc4TY`<MeU)Q`;<Me@v**)yB2myxzvdy7mTqH7hNJjG6PE<Cc8rv)SEQx_<^{*#G$>
z<cKi)uRlW3Z-R8Xl5rz(p#gSlQAxfMi&6g13D;=z3ks#-xtiPo54sFuXV#f`p+-fo
z_c3Q5_#eT*0i8Lb%(<;5c8zN%&S-ltcASTcKRVDy$JH$WkB#sS@{Ns(4-Y|wauJbf
z!I6aMEDkCdG8+w{v_-=zijWtX@<HcAbuC8)ybcWcPyuWD%wEvWQQeXc`_kQ9S2@^;
zE*R(@E$`~?ZJ1ym;)KZ!Qih?bSHJc{IY1ypVE`5N9{a&jKItd=*LRf}Kd#%ER1y?N
z48LRd=j2srlmKSy8jA`(4BTq|Nsj3IzV->Q@k8?r`Isov^UI2=T{#K~skC)fRP-aj
zcrJyQmQ!u>p5&{_zp7xOM(Q%smb6M%g6o4s^>A8#L41?8Ox^e7CM$W~*3!e8F7P`S
zK9!26tqJVBt`?fLxM^Gf`xAacdcbz&)u<6pKM?qA_ms76BOQWg0Le^W#?SMIT$jE7
zyw1!lG*$#k#iqZyl9~L_CjIwBb}$%9+e2Vw!1@$nfpvj1y2o4hJabo7^;(V}>++Tz
z{|NtdydBeFpKnv*Vg9BTu3P)+)3J?9`*6t|c{b*k>-L!PvY`#5^i1^XCnxh<!V5(>
zky})0T&rp6<lxuP3(LBj-UJ`+CQVB;OWswVlUo*SiY9Q5x){6wmOSOytv)`jp#?L>
zJFwUVv-;Dzt2_z1)}rtpHBQH#<-`N0%%UP1TF^VNx2@~Zh_4nbMMxj7zeHTrB&q)a
Dl)1NK

literal 0
HcmV?d00001

diff --git a/images/macFFBgHack.png b/images/macFFBgHack.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6473b324ee1dae1faaacc0826639833f551116c
GIT binary patch
literal 207
zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIEX7WqAsj$Z!;#Vf<Z~8yL>4nJ
za0`Jj<E6WGe}IBAC9V-A!TD(=<%vb942~)JNvR5MnMJAP`9;~q3eLgCGp@NY1J#Lw
z)HxTWCYEI8=P86_=B6^3>l>Qs8<<Be|IZCnpyBD_7~;|S_N*f#g8>JF;+Fd5q0wCR
k?u=~bH}2*0f`J3<krx?0%Kw?)3e>~k>FVdQ&MBb@0BAfpf&c&j

literal 0
HcmV?d00001

diff --git a/images/package.png b/images/package.png
new file mode 100644
index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2
GIT binary patch
literal 853
zcmV-b1FHOqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!=Sf6CR5;6h
zlS^n^bsUAiduQ&<oixKtrjnE?i9(+-KGJSn)Z#|65V0w>5TQ^(M5v$(QKVE?W+9X!
z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N)
zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy`
zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@<cu>$58=a#2OTA3png`w3v->gWif7t%e$
z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwes<Ks@rBR)qR%6DGzB_%zx;t^=2Sm<3wSUZV
z3(w;>YV1_!F=3OaRVHl(>=`%&{x*s30c<x*y}ZCyX%=sL<;SENIdkyU%U0B=(JW6Q
zVV$&B#jBU8uWfL2>}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}}
zPrfHZ1`qsIFe&gipuL8-IZbo<Chjw*P$R9RihuxC3MY2}C!NKw%plDQP690NZ?Khc
z^BRr%BjQXRQfV}bQ4x}AgvTBXXaLDwxV=Y+QyE<U0kZiUJ5ht!?Z%|Dh!;YvNEoBW
zV5>2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5
zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOE<ovy}b(QA|$%NgrE^1Xe1avB=$lQsR43_
zP9r8mX=Vx)nNGYn+W%9qv$9rOyfzrN8-;A&VeCvVNCRSzM&&jVx^(xyj^z|szdgs+
zy~&l>uYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I<a!RpPXihQdgmyUn7
zw9)ZQe_TE?q(;uG$XokfdB<v3mbpLwCvkiIXB8cP`9f*#f8Y3TrY;VRsK}>?q*Ua~
fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY

literal 0
HcmV?d00001

diff --git a/images/page_green.png b/images/page_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..de8e003f9fb8752c09e7f3655d5d8664b5c62fc3
GIT binary patch
literal 621
zcmV-z0+RiSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz|4BqaR2Ufr
z!9R@Oa~ucY=l%J9e!uJW>QqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u
zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N
zy%T^+;>8cXx%|o77anP?&W1?<NFc8MyK(Wm8~*t1_`jci`1#z|`+LXGp-uJBx=&|+
z{L|E`C^A?w%yZn_ES`Pf7EeCdeLJq6&UpCxGjDx<+gBgGbljk-&Lo-EQ?qLHVroo9
z6-{9{zq_{g#CiALzqQ?WcRq#&p`f7^txBuXs<bL?D!>1A(>-T49z9pyeCl@7YI+Si
zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE->
zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D
z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1
zgF_jyIhsL-`FM<ZjG(R@90C9U0O-Aqc^NZw*c>f~JL~C=cV75(CrJ|q;MVO961G=O
zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX
Hu0mjfPs|!l

literal 0
HcmV?d00001

diff --git a/images/page_white_text.png b/images/page_white_text.png
new file mode 100644
index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11
GIT binary patch
literal 342
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL
zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM=
z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy<xp
z<-V!w{rtjKUv+o*|6m()ceab>;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C
znXL|3GZ+d2`3re2hs?MK<V&+KGL$sTUzRzG=^m3+$2Td42G30@X|lcy44dbP=-$#!
h7h_<U68r8SGxL_I=i_|Jgn@o$@O1TaS?83{1OPX3f*b$<

literal 0
HcmV?d00001

diff --git a/images/page_white_width.png b/images/page_white_width.png
new file mode 100644
index 0000000000000000000000000000000000000000..1eb880947ddf3e745c29e8d9dc90f09c7e6e323c
GIT binary patch
literal 309
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg
z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^(
z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O
zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~
zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM
zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@?
F2>@zac~<}c

literal 0
HcmV?d00001

diff --git a/images/plugin.png b/images/plugin.png
new file mode 100644
index 0000000000000000000000000000000000000000..6187b15aec001b7080b51a5f944f07591f26cc15
GIT binary patch
literal 591
zcmV-V0<iswP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz;Ymb6R5;6}
zl08V3aTLaXuVw{)TtAV-EQp(VZ&;&yOGCA^HyY7UV+BnWv^BakMQc+OB&0Z27AkkL
zxPppG-9jbH?t7kd8eTEus*7hi@aLT8f1cktNknjvIJDd2gQ>eEcNHZMNv|IbJ-M`(
zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj
z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp
zKj&H9T*boh2<no0+=ElOJZ83sfQeG2L`y@C?#3Rz{i>i)W+(n27l!C)>fq|L%VB1i
ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;m<fe2Wm#Lz
za$)sCo<WYS+HDKB-VTSEXg%7B+({$Nn7A;{*z`8{F+2a6g_Xssq{Gq<0W(qT9zX<h
z>tzb<gWDVNaLQ|6kUI-2i;UhJKT-oRHNy~7Uq5lS^Bm=sIhHERNTM^>$;qA*nT@@+
zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_
dcRl5U#9zn6ZO}GF<yZg!002ovPDHLkV1oCe4!{5a

literal 0
HcmV?d00001

diff --git a/images/ruby.png b/images/ruby.png
new file mode 100644
index 0000000000000000000000000000000000000000..f763a16880751445e3c4a8802a28d3cf8b5787c9
GIT binary patch
literal 592
zcmV-W0<ZmvP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz;z>k7R5;7c
zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs<plf_Ncf
zR5#^~QWPqv1!JZS9OCvor@4Ig;`4kuTUS9u;f)7Am*4L>-{0?hOn_-8n0AMO@u1Ts
zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P
z^AL@~(h~Z+w<L#$QHF*{4-TR}eMWp>fcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX#
zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA
zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I
zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*<aQ_oGc&NTfFYkQ>g&lgG_cXv$BGoIWyfO5
zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4<BKS
zj8KR~Q0@hgc{SxgS<62aY4hBLz3EeDqq#sQniR{tT57+=`Cm;G)ioBG_r1)!lG=Cl
e>Ms8aJK-la<J!Mps^iK40000<MNUMnLSTYHVh<bu

literal 0
HcmV?d00001

diff --git a/images/tag_blue.png b/images/tag_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f02b5f8f8bf7c89b60ff70437fb7df6bd95e327
GIT binary patch
literal 1880
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
I_CnHs0qX}mlmGw#

literal 0
HcmV?d00001

diff --git a/images/tag_green.png b/images/tag_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..83ec984bd73364134da0f98d27a800c5d3264180
GIT binary patch
literal 613
zcmV-r0-F7aP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz_en%SR5;6p
zlSz*fVGxG<Ps~-rzaZ)Od*)(BWAv&{G)7Hy+-~mi#?mc4>^5T)AZ%#@G{_P{NCN^P
z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x
zhJodBxe>iyk3%w<%wC8<lSyEjCZF8tbZiLam<uG6$(;~^EK@U0qeL#3(<hS&=JPqv
z6EK}lL({aa5P_zy8kzW<SvIHBDMmlLh#NAmwcBkZ5(&g&u?>holUJ4(iv>tL{`DQt
zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h<L;oPk!5X0u5y
z5C{Zph>*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2
z9P*}mw}7X<BfL|OZODmogjmVN>$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6
z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo<nvX$@ZZ3j=rR8M{e4mFuvfSk(P&f*hr<?K
zBDZVmOne8^bITUH-EN2dh}(`M7z~Pjzu%%uTzz5^v;3NPCxAjx6eoLWiw>+_uWuFa
z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29

literal 0
HcmV?d00001

diff --git a/images/transparent.png b/images/transparent.png
new file mode 100644
index 0000000000000000000000000000000000000000..d665e179efd797451084235f105425247fea0a14
GIT binary patch
literal 97
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5X>;M1%mmiTn0pv241o;Is
pI6S+N2ITN~x;Tb#$R;N!@B(=T42&&nK2`x)44$rjF6*2UngG277DE64

literal 0
HcmV?d00001

diff --git a/images/wrench.png b/images/wrench.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f
GIT binary patch
literal 610
zcmV-o0-gPdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^hrcPR5;6(
zlgn=sQ5ePfU;JB)8e@zrS1w(P(S@XGn&CAJ9Uu+`XB?mlZLpTs7)o14)NzKF$>^jb
z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&*
z$)uBj2i<NLrfDJ`kK<ed1a5RX9rXKs<nwt%qtWvT@H}tX)pcD5$8m~%77mBOvMhqZ
zpfyo|SpL^)wNNUR5Q#+Ig+d`UlgXgjY=Wlg@dB|}>@u-@SgX}gtyWPe6d*|w6h%R?
zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)<!|U}PxZQ5&37A>l<r4Wm_>CUe
z<<Bq-1G!ud48t7SmPu91<MA{oigKO^k+$K@9t!#&NFPnGYaPsp1_FV=U%%gf;WW3$
z8((^t6A1i@fN6PvC$E1ZTm22{=?-o&#{08!8cm+19gbh`LHb}~>FogV^*tm>8*AlX
za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$
zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~<Ge)vVRgIZCBcqR{V
wSNM)gGt<GxA>O3xbrKY=&TiwPYkJroM{;WUQTuMY8vp<R07*qoM6N<$g5pFD$^ZZW

literal 0
HcmV?d00001

diff --git a/images/wrench_orange.png b/images/wrench_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..565a9330e0a156dff5bed2c9fad8c95a44344ba4
GIT binary patch
literal 584
zcmV-O0=NB%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz+DSw~R5;6(
zle=qEQ5?tfe>g}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi
zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq
zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp
z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV<F*
zOr=u6>2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJK<siIuU1iq_*)@J_
z-lE-Zlgs7sdcAw5WvOb|?e?zKYE=$~xM{+7;oBB`eF2)n_{kC;kLRb$<(fat?fxXQ
ztg^Evuz(*Q!2A2qcnTZK{BocBd{j>V;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~
zvb`d3Mydwjt&Df<pvNJ371qya$K8~L)Mfax0Y$O=<~HQ+2^<sn3f!63ro9sjk&955
zv+hdO>^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG
Wk@)HE*94aU0000<MNUMnLSTXwQVY`n

literal 0
HcmV?d00001

diff --git a/images/zoom.png b/images/zoom.png
new file mode 100644
index 0000000000000000000000000000000000000000..908612e394525fc2e52a7e9b94689c25ce167381
GIT binary patch
literal 692
zcmV;l0!#ggP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!MoC0LR5;6x
z(o0CxK^(yG@64(#mWoThLp|674WUDA(q?t;P?ivh8yG1>m+BBgry{~j2fHLegbHP(
zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6
zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN
z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24<J>H!V{
zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab
zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m
z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp
z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu
z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV
zHoFY`D~2x|2<MlV_LK*M_;d3~#G=f;nc&I5tIrih8*Bdy01TcBh4V@ad&+k0#3A|l
z={;ZHP0x8ts$yLLz{9q^VYQ@tHdhs}Ff$+VJXPD&J^o|e06<^M?m#TAFJ@<nYfaq~
aaezN5sVn;(iAePT0000<MNUMnLSTaSf<5^F

literal 0
HcmV?d00001

diff --git a/index.html b/index.html
new file mode 100644
index 0000000..8d9d870
--- /dev/null
+++ b/index.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body>
+<nav id="metadata">
+  <nav id="home-section" class="section">
+  <h3 class="section-header">
+    <a href="./index.html">Home</a>
+    <a href="./table_of_contents.html#classes">Classes</a>
+    <a href="./table_of_contents.html#methods">Methods</a>
+  </h3>
+</nav>
+
+
+  <nav id="search-section" class="section project-section" class="initially-hidden">
+  <form action="#" method="get" accept-charset="utf-8">
+    <h3 class="section-header">
+      <input type="text" name="search" placeholder="Search" id="search-field"
+             title="Type to search, Up and Down to navigate, Enter to load">
+    </h3>
+  </form>
+
+  <ul id="search-results" class="initially-hidden"></ul>
+</nav>
+
+
+  <div id="project-metadata">
+    
+    <nav id="classindex-section" class="section project-section">
+  <h3 class="section-header">Class and Module Index</h3>
+
+  <ul class="link-list">
+  
+    <li><a href="./PlayBot.html">PlayBot</a>
+  
+    <li><a href="./SitePlugin.html">SitePlugin</a>
+  
+    <li><a href="./TestPlugin.html">TestPlugin</a>
+  
+    <li><a href="./TestPlugin1.html">TestPlugin1</a>
+  
+    <li><a href="./TestPlugin2.html">TestPlugin2</a>
+  
+  </ul>
+</nav>
+
+  </div>
+</nav>
+
+<p>This is the API documentation for RDoc Documentation.
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/js/darkfish.js b/js/darkfish.js
new file mode 100644
index 0000000..4be722f
--- /dev/null
+++ b/js/darkfish.js
@@ -0,0 +1,153 @@
+/**
+ *
+ * Darkfish Page Functions
+ * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $
+ *
+ * Author: Michael Granger <mgranger@laika.com>
+ *
+ */
+
+/* Provide console simulation for firebug-less environments */
+if (!("console" in window) || !("firebug" in console)) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {};
+};
+
+
+/**
+ * Unwrap the first element that matches the given @expr@ from the targets and return them.
+ */
+$.fn.unwrap = function( expr ) {
+  return this.each( function() {
+    $(this).parents( expr ).eq( 0 ).after( this ).remove();
+  });
+};
+
+
+function showSource( e ) {
+  var target = e.target;
+  var codeSections = $(target).
+    parents('.method-detail').
+    find('.method-source-code');
+
+  $(target).
+    parents('.method-detail').
+    find('.method-source-code').
+    slideToggle();
+};
+
+function hookSourceViews() {
+  $('.method-heading').click( showSource );
+};
+
+function toggleDebuggingSection() {
+  $('.debugging-section').slideToggle();
+};
+
+function hookDebuggingToggle() {
+  $('#debugging-toggle img').click( toggleDebuggingSection );
+};
+
+function hookTableOfContentsToggle() {
+  $('.indexpage li .toc-toggle').each( function() {
+    $(this).click( function() {
+      $(this).toggleClass('open');
+    });
+
+    var section = $(this).next();
+
+    $(this).click( function() {
+      section.slideToggle();
+    });
+  });
+}
+
+function hookSearch() {
+  var input  = $('#search-field').eq(0);
+  var result = $('#search-results').eq(0);
+  $(result).show();
+
+  var search_section = $('#search-section').get(0);
+  $(search_section).show();
+
+  var search = new Search(search_data, input, result);
+
+  search.renderItem = function(result) {
+    var li = document.createElement('li');
+    var html = '';
+
+    // TODO add relative path to <script> per-page
+    html += '<p class="search-match"><a href="' + rdoc_rel_prefix + result.path + '">' + this.hlt(result.title);
+    if (result.params)
+      html += '<span class="params">' + result.params + '</span>';
+    html += '</a>';
+
+
+    if (result.namespace)
+      html += '<p class="search-namespace">' + this.hlt(result.namespace);
+
+    if (result.snippet)
+      html += '<div class="search-snippet">' + result.snippet + '</div>';
+
+    li.innerHTML = html;
+
+    return li;
+  }
+
+  search.select = function(result) {
+    var result_element = result.get(0);
+    window.location.href = result_element.firstChild.firstChild.href;
+  }
+
+  search.scrollIntoView = search.scrollInWindow;
+};
+
+function highlightTarget( anchor ) {
+  console.debug( "Highlighting target '%s'.", anchor );
+
+  $("a[name=" + anchor + "]").each( function() {
+    if ( !$(this).parent().parent().hasClass('target-section') ) {
+      console.debug( "Wrapping the target-section" );
+      $('div.method-detail').unwrap( 'div.target-section' );
+      $(this).parent().wrap( '<div class="target-section"></div>' );
+    } else {
+      console.debug( "Already wrapped." );
+    }
+  });
+};
+
+function highlightLocationTarget() {
+  console.debug( "Location hash: %s", window.location.hash );
+  if ( ! window.location.hash || window.location.hash.length == 0 ) return;
+
+  var anchor = window.location.hash.substring(1);
+  console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" );
+
+  highlightTarget( anchor );
+};
+
+function highlightClickTarget( event ) {
+  console.debug( "Highlighting click target for event %o", event.target );
+  try {
+    var anchor = $(event.target).attr( 'href' ).substring(1);
+    console.debug( "Found target anchor: %s", anchor );
+    highlightTarget( anchor );
+  } catch ( err ) {
+    console.error( "Exception while highlighting: %o", err );
+  };
+};
+
+
+$(document).ready( function() {
+  hookSourceViews();
+  hookDebuggingToggle();
+  hookSearch();
+  highlightLocationTarget();
+  hookTableOfContentsToggle();
+
+  $('ul.link-list a').bind( "click", highlightClickTarget );
+});
diff --git a/js/jquery.js b/js/jquery.js
new file mode 100644
index 0000000..48590ec
--- /dev/null
+++ b/js/jquery.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file
diff --git a/js/navigation.js b/js/navigation.js
new file mode 100644
index 0000000..e412681
--- /dev/null
+++ b/js/navigation.js
@@ -0,0 +1,142 @@
+/*
+ * Navigation allows movement using the arrow keys through the search results.
+ *
+ * When using this library you will need to set scrollIntoView to the
+ * appropriate function for your layout.  Use scrollInWindow if the container
+ * is not scrollable and scrollInElement if the container is a separate
+ * scrolling region.
+ */
+Navigation = new function() {
+  this.initNavigation = function() {
+    var _this = this;
+
+    $(document).keydown(function(e) {
+      _this.onkeydown(e);
+    }).keyup(function(e) {
+      _this.onkeyup(e);
+    });
+
+    this.navigationActive = true;
+  }
+
+  this.setNavigationActive = function(state) {
+    this.navigationActive = state;
+    this.clearMoveTimeout();
+  }
+
+  this.onkeyup = function(e) {
+    if (!this.navigationActive) return;
+
+    switch(e.keyCode) {
+      case 37: //Event.KEY_LEFT:
+      case 38: //Event.KEY_UP:
+      case 39: //Event.KEY_RIGHT:
+      case 40: //Event.KEY_DOWN:
+        this.clearMoveTimeout();
+        break;
+    }
+  }
+
+  this.onkeydown = function(e) {
+    if (!this.navigationActive) return;
+    switch(e.keyCode) {
+      case 37: //Event.KEY_LEFT:
+        if (this.moveLeft()) e.preventDefault();
+        break;
+      case 38: //Event.KEY_UP:
+        if (e.keyCode == 38 || e.ctrlKey) {
+          if (this.moveUp()) e.preventDefault();
+          this.startMoveTimeout(false);
+        }
+        break;
+      case 39: //Event.KEY_RIGHT:
+        if (this.moveRight()) e.preventDefault();
+        break;
+      case 40: //Event.KEY_DOWN:
+        if (e.keyCode == 40 || e.ctrlKey) {
+          if (this.moveDown()) e.preventDefault();
+          this.startMoveTimeout(true);
+        }
+        break;
+      case 13: //Event.KEY_RETURN:
+        if (this.$current)
+          e.preventDefault();
+          this.select(this.$current);
+        break;
+    }
+    if (e.ctrlKey && e.shiftKey) this.select(this.$current);
+  }
+
+  this.clearMoveTimeout = function() {
+    clearTimeout(this.moveTimeout);
+    this.moveTimeout = null;
+  }
+
+  this.startMoveTimeout = function(isDown) {
+    if (!$.browser.mozilla && !$.browser.opera) return;
+    if (this.moveTimeout) this.clearMoveTimeout();
+    var _this = this;
+
+    var go = function() {
+      if (!_this.moveTimeout) return;
+      _this[isDown ? 'moveDown' : 'moveUp']();
+      _this.moveTimout = setTimeout(go, 100);
+    }
+    this.moveTimeout = setTimeout(go, 200);
+  }
+
+  this.moveRight = function() {
+  }
+
+  this.moveLeft = function() {
+  }
+
+  this.move = function(isDown) {
+  }
+
+  this.moveUp = function() {
+    return this.move(false);
+  }
+
+  this.moveDown = function() {
+    return this.move(true);
+  }
+
+  /*
+   * Scrolls to the given element in the scrollable element view.
+   */
+  this.scrollInElement = function(element, view) {
+    var offset, viewHeight, viewScroll, height;
+    offset = element.offsetTop;
+    height = element.offsetHeight;
+    viewHeight = view.offsetHeight;
+    viewScroll = view.scrollTop;
+
+    if (offset - viewScroll + height > viewHeight) {
+      view.scrollTop = offset - viewHeight + height;
+    }
+    if (offset < viewScroll) {
+      view.scrollTop = offset;
+    }
+  }
+
+  /*
+   * Scrolls to the given element in the window.  The second argument is
+   * ignored
+   */
+  this.scrollInWindow = function(element, ignored) {
+    var offset, viewHeight, viewScroll, height;
+    offset = element.offsetTop;
+    height = element.offsetHeight;
+    viewHeight = window.innerHeight;
+    viewScroll = window.scrollY;
+
+    if (offset - viewScroll + height > viewHeight) {
+      window.scrollTo(window.scrollX, offset - viewHeight + height);
+    }
+    if (offset < viewScroll) {
+      window.scrollTo(window.scrollX, offset);
+    }
+  }
+}
+
diff --git a/js/search.js b/js/search.js
new file mode 100644
index 0000000..dbdfdcb
--- /dev/null
+++ b/js/search.js
@@ -0,0 +1,94 @@
+Search = function(data, input, result) {
+  this.data = data;
+  this.$input = $(input);
+  this.$result = $(result);
+
+  this.$current = null;
+  this.$view = this.$result.parent();
+  this.searcher = new Searcher(data.index);
+  this.init();
+}
+
+Search.prototype = $.extend({}, Navigation, new function() {
+  var suid = 1;
+
+  this.init = function() {
+    var _this = this;
+    var observer = function() {
+      _this.search(_this.$input[0].value);
+    };
+    this.$input.keyup(observer);
+    this.$input.click(observer); // mac's clear field
+
+    this.searcher.ready(function(results, isLast) {
+      _this.addResults(results, isLast);
+    })
+
+    this.initNavigation();
+    this.setNavigationActive(false);
+  }
+
+  this.search = function(value, selectFirstMatch) {
+    value = jQuery.trim(value).toLowerCase();
+    if (value) {
+      this.setNavigationActive(true);
+    } else {
+      this.setNavigationActive(false);
+    }
+
+    if (value == '') {
+      this.lastQuery = value;
+      this.$result.empty();
+      this.setNavigationActive(false);
+    } else if (value != this.lastQuery) {
+      this.lastQuery = value;
+      this.firstRun = true;
+      this.searcher.find(value);
+    }
+  }
+
+  this.addResults = function(results, isLast) {
+    var target = this.$result.get(0);
+    if (this.firstRun && (results.length > 0 || isLast)) {
+      this.$current = null;
+      this.$result.empty();
+    }
+
+    for (var i=0, l = results.length; i < l; i++) {
+      target.appendChild(this.renderItem.call(this, results[i]));
+    };
+
+    if (this.firstRun && results.length > 0) {
+      this.firstRun = false;
+      this.$current = $(target.firstChild);
+      this.$current.addClass('current');
+    }
+    if (jQuery.browser.msie) this.$element[0].className += '';
+  }
+
+  this.move = function(isDown) {
+    if (!this.$current) return;
+    var $next = this.$current[isDown ? 'next' : 'prev']();
+    if ($next.length) {
+      this.$current.removeClass('current');
+      $next.addClass('current');
+      this.scrollIntoView($next[0], this.$view[0]);
+      this.$current = $next;
+    }
+    return true;
+  }
+
+  this.hlt = function(html) {
+    return this.escapeHTML(html).
+      replace(/\u0001/g, '<em>').
+      replace(/\u0002/g, '</em>');
+  }
+
+  this.escapeHTML = function(html) {
+    return html.replace(/[&<>]/g, function(c) {
+      return '&#' + c.charCodeAt(0) + ';';
+    });
+  }
+
+});
+
diff --git a/js/search_index.js b/js/search_index.js
new file mode 100644
index 0000000..d759daa
--- /dev/null
+++ b/js/search_index.js
@@ -0,0 +1 @@
+var search_data = {"index":{"searchIndex":["playbot","siteplugin","testplugin","testplugin1","testplugin2","add_custom_handlers()","can_handle?()","can_handle?()","can_handle?()","can_handle?()","for_site()","inherited()","new()","new()","repository()"],"longSearchIndex":["playbot","siteplugin","testplugin","testplugin1","testplugin2","playbot#add_custom_handlers()","siteplugin#can_handle?()","testplugin::can_handle?()","testplugin1::can_handle?()","testplugin2::can_handle?()","siteplugin::for_site()","siteplugin::inherited()","playbot::new()","testplugin::new()","siteplugin::repository()"],"info":[["PlayBot","","PlayBot.html","",""],["SitePlugin","","SitePlugin.html","","<p>Implement a plugin system.\n<p>Each plugin have to inherite from this class and implement a\ncan_handle?(site) …\n"],["TestPlugin","","TestPlugin.html","",""],["TestPlugin1","","TestPlugin1.html","",""],["TestPlugin2","","TestPlugin2.html","",""],["add_custom_handlers","PlayBot","PlayBot.html#method-i-add_custom_handlers","()","<p>This metod is called by IRCBot#connect_socket\n"],["can_handle?","SitePlugin","SitePlugin.html#method-i-can_handle-3F","(site)","<p>A place holder method. This method <strong>must</strong> be implemented in\nthe subclasses.\n"],["can_handle?","TestPlugin","TestPlugin.html#method-c-can_handle-3F","(site)",""],["can_handle?","TestPlugin1","TestPlugin1.html#method-c-can_handle-3F","(site)",""],["can_handle?","TestPlugin2","TestPlugin2.html#method-c-can_handle-3F","(site)",""],["for_site","SitePlugin","SitePlugin.html#method-c-for_site","(site)","<p>Return the plugin that can handle a given site.\n"],["inherited","SitePlugin","SitePlugin.html#method-c-inherited","(target)",""],["new","PlayBot","PlayBot.html#method-c-new","(options = {})","<p>Start a new instance\n<p>Options:\n<p><code>:address</code>: irc server\n"],["new","TestPlugin","TestPlugin.html#method-c-new","()",""],["repository","SitePlugin","SitePlugin.html#method-c-repository","()",""]]}}
\ No newline at end of file
diff --git a/js/searcher.js b/js/searcher.js
new file mode 100644
index 0000000..f854b54
--- /dev/null
+++ b/js/searcher.js
@@ -0,0 +1,228 @@
+Searcher = function(data) {
+  this.data = data;
+  this.handlers = [];
+}
+
+Searcher.prototype = new function() {
+  // search is performed in chunks of 1000 for non-blocking user input
+  var CHUNK_SIZE = 1000;
+  // do not try to find more than 100 results
+  var MAX_RESULTS = 100;
+  var huid = 1;
+  var suid = 1;
+  var runs = 0;
+
+  this.find = function(query) {
+    var queries = splitQuery(query);
+    var regexps = buildRegexps(queries);
+    var highlighters = buildHilighters(queries);
+    var state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++};
+    var _this = this;
+
+    this.currentSuid = state.n;
+
+    if (!query) return;
+
+    var run = function() {
+      // stop current search thread if new search started
+      if (state.n != _this.currentSuid) return;
+
+      var results =
+        performSearch(_this.data, regexps, queries, highlighters, state);
+      var hasMore = (state.limit > 0 && state.pass < 4);
+
+      triggerResults.call(_this, results, !hasMore);
+      if (hasMore) {
+        setTimeout(run, 2);
+      }
+      runs++;
+    };
+    runs = 0;
+
+    // start search thread
+    run();
+  }
+
+  /*  ----- Events ------  */
+  this.ready = function(fn) {
+    fn.huid = huid;
+    this.handlers.push(fn);
+  }
+
+  /*  ----- Utilities ------  */
+  function splitQuery(query) {
+    return jQuery.grep(query.split(/(\s+|::?|\(\)?)/), function(string) {
+      return string.match(/\S/)
+    });
+  }
+
+  function buildRegexps(queries) {
+    return jQuery.map(queries, function(query) {
+      return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i')
+    });
+  }
+
+  function buildHilighters(queries) {
+    return jQuery.map(queries, function(query) {
+      return jQuery.map(query.split(''), function(l, i) {
+        return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2);
+      }).join('');
+    });
+  }
+
+  // function longMatchRegexp(index, longIndex, regexps) {
+  //     for (var i = regexps.length - 1; i >= 0; i--){
+  //         if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false;
+  //     };
+  //     return true;
+  // }
+
+
+  /*  ----- Mathchers ------  */
+
+  /*
+   * This record matches if the index starts with queries[0] and the record
+   * matches all of the regexps
+   */
+  function matchPassBeginning(index, longIndex, queries, regexps) {
+    if (index.indexOf(queries[0]) != 0) return false;
+    for (var i=1, l = regexps.length; i < l; i++) {
+      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
+        return false;
+    };
+    return true;
+  }
+
+  /*
+   * This record matches if the longIndex starts with queries[0] and the
+   * longIndex matches all of the regexps
+   */
+  function matchPassLongIndex(index, longIndex, queries, regexps) {
+    if (longIndex.indexOf(queries[0]) != 0) return false;
+    for (var i=1, l = regexps.length; i < l; i++) {
+      if (!longIndex.match(regexps[i]))
+        return false;
+    };
+    return true;
+  }
+
+  /*
+   * This record matches if the index contains queries[0] and the record
+   * matches all of the regexps
+   */
+  function matchPassContains(index, longIndex, queries, regexps) {
+    if (index.indexOf(queries[0]) == -1) return false;
+    for (var i=1, l = regexps.length; i < l; i++) {
+      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
+        return false;
+    };
+    return true;
+  }
+
+  /*
+   * This record matches if regexps[0] matches the index and the record
+   * matches all of the regexps
+   */
+  function matchPassRegexp(index, longIndex, queries, regexps) {
+    if (!index.match(regexps[0])) return false;
+    for (var i=1, l = regexps.length; i < l; i++) {
+      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
+        return false;
+    };
+    return true;
+  }
+
+
+  /*  ----- Highlighters ------  */
+  function highlightRegexp(info, queries, regexps, highlighters) {
+    var result = createResult(info);
+    for (var i=0, l = regexps.length; i < l; i++) {
+      result.title = result.title.replace(regexps[i], highlighters[i]);
+      result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
+    };
+    return result;
+  }
+
+  function hltSubstring(string, pos, length) {
+    return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length);
+  }
+
+  function highlightQuery(info, queries, regexps, highlighters) {
+    var result = createResult(info);
+    var pos = 0;
+    var lcTitle = result.title.toLowerCase();
+
+    pos = lcTitle.indexOf(queries[0]);
+    if (pos != -1) {
+      result.title = hltSubstring(result.title, pos, queries[0].length);
+    }
+
+    result.namespace = result.namespace.replace(regexps[0], highlighters[0]);
+    for (var i=1, l = regexps.length; i < l; i++) {
+      result.title = result.title.replace(regexps[i], highlighters[i]);
+      result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
+    };
+    return result;
+  }
+
+  function createResult(info) {
+    var result = {};
+    result.title = info[0];
+    result.namespace = info[1];
+    result.path = info[2];
+    result.params = info[3];
+    result.snippet = info[4];
+    return result;
+  }
+
+  /*  ----- Searching ------  */
+  function performSearch(data, regexps, queries, highlighters, state) {
+    var searchIndex = data.searchIndex;
+    var longSearchIndex = data.longSearchIndex;
+    var info = data.info;
+    var result = [];
+    var i = state.from;
+    var l = searchIndex.length;
+    var togo = CHUNK_SIZE;
+    var matchFunc, hltFunc;
+
+    while (state.pass < 4 && state.limit > 0 && togo > 0) {
+      if (state.pass == 0) {
+        matchFunc = matchPassBeginning;
+        hltFunc = highlightQuery;
+      } else if (state.pass == 1) {
+        matchFunc = matchPassLongIndex;
+        hltFunc = highlightQuery;
+      } else if (state.pass == 2) {
+        matchFunc = matchPassContains;
+        hltFunc = highlightQuery;
+      } else if (state.pass == 3) {
+        matchFunc = matchPassRegexp;
+        hltFunc = highlightRegexp;
+      }
+
+      for (; togo > 0 && i < l && state.limit > 0; i++, togo--) {
+        if (info[i].n == state.n) continue;
+        if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) {
+          info[i].n = state.n;
+          result.push(hltFunc(info[i], queries, regexps, highlighters));
+          state.limit--;
+        }
+      };
+      if (searchIndex.length <= i) {
+        state.pass++;
+        i = state.from = 0;
+      } else {
+        state.from = i;
+      }
+    }
+    return result;
+  }
+
+  function triggerResults(results, isLast) {
+    jQuery.each(this.handlers, function(i, fn) {
+      fn.call(this, results, isLast)
+    })
+  }
+}
+
diff --git a/lib/playbot.rb b/lib/playbot.rb
deleted file mode 100644
index 3f9203b..0000000
--- a/lib/playbot.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-require 'rubygems'
-require 'net/yail/irc_bot'
-
-require 'site_plugin'
-
-#
-# Add plugins folder to LOAD_PATH and subsequently require all plugins.
-#
-dir = '../plugins'
-$LOAD_PATH << dir
-Dir[File.join(dir, '*.rb')].each {|file| require File.basename(file) }
-
-class PlayBot < IRCBot
-	BOTNAME = 'PlayBot'
-
-	public
-	# Start a new instance
-	#
-	# Options:
-	# * <tt>:address</tt>: irc server
-	# * <tt>:port</tt>: port number, default to 6667
-	# * <tt>:nicknames</tt>: array of nicknames to cycle through
-	# * <tt>:nick_passwd</tt>: password for the first nick of :nicknames
-	# 	if we are not connected with this nick, we will use ghost and take this nick
-	# * <tt>:channels</tt>: the channels we are going to connect to
-	# * <tt>:admin</tt>: the nick of the user who can command the bot
-	def initialize(options = {})
-		@admin = options.delete(:admin)
-		raise "You must provide an admin !" if !@admin
-
-		if options[:nick_passwd]
-			@nick = options[:nicknames].first
-			@nick_paswd = options.delete[:nick_passwd]
-		end
-
-		options[:username] = BOTNAME
-		options[:realname] = BOTNAME
-
-        super(options)
-		self.connect_socket
-		self.start_listening
-	end
-
-	# This metod is called by IRCBot#connect_socket
-	def add_custom_handlers()
-		@irc.hearing_welcome   self.method(:_in_welcome)
-		@irc.on_msg       self.method(:_in_msg)
-	end
-
-	private
-	# Welcome event handler
-	#
-	# We use it to identify us against NickServ
-	def _in_welcome(event)
-		return if !@nick
-
-		if self.bot_name != @nick
-			msg('NickServ', "ghost #{nick} #{nick_passwd}")
-			sleep 30
-			nick @nick
-		end
-
-		msg('NickServ', "identify #{nick_passwd}")
-	end
-
-    def _in_msg(event)
-        # we don't care of private messages
-        return if event.pm?
-    end
-end
diff --git a/lib/site_plugin.rb b/lib/site_plugin.rb
deleted file mode 100644
index c59d975..0000000
--- a/lib/site_plugin.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class SitePlugin
-    @@repository = []
-
-    def self.repository
-        @@repository
-    end
-
-    def self.inherited(target)
-        @@repository << target
-    end
-
-    def self.for_site(site)
-        @@repository.find {|handler| handler.can_handle? site }
-    end
-end
diff --git a/mixcloud.pm b/mixcloud.pm
deleted file mode 100644
index 8cd29a5..0000000
--- a/mixcloud.pm
+++ /dev/null
@@ -1,71 +0,0 @@
-package mixcloud;
-
-use LWP::UserAgent;
-use HTML::Parser;
-use HTML::Entities;
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = qw(mixcloud);
-
-
-my $inTitle = 0;
-my $inAuthor = 0;
-my %infos;
-
-
-sub mixcloud {
-	my ($url) = @_;
-
-	my $ua = LWP::UserAgent->new(
-		agent   => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1",
-		timeout => 30
-	);
-
-	my $response = $ua->get($url);
-	die($response->status_line) unless ($response->is_success);
-
-	my $content = $response->decoded_content;
-
-	my $parser = HTML::Parser->new();
-	$parser->handler(text => \&parser_text, 'text');
-	$parser->handler(start => \&parser_start, 'tagname');
-	$parser->handler(end => \&parser_end, 'tagname');
-	$parser->unbroken_text(1);
-	$parser->report_tags('title', 'a');
-	$parser->parse($content);
-	$parser->eof();
-	
-	$infos{'url'} = $url;
-	
-	return %infos;
-}
-
-sub parser_text
-{
-	my ($text) = @_;
-	chomp $text;
-	$text = decode_entities($text);
-
-	if ($inTitle) {
-		$text =~ s/\n//;
-		$text =~ s/ \| Mixcloud .*//;
-		$text =~ s/^ *//;
-		$text =~ s/[^a-zA-Z0-9\(\)\[\]]*$//;
-		($infos{'author'}, $infos{'title'}) = split (' - ', $text, 2);
-	}
-}
-
-sub parser_start
-{
-	my ($tag) = @_;
-	$inTitle = 1 if ($tag eq 'title');
-}
-
-sub parser_end
-{
-	my ($tag) = @_;
-	$inTitle = 0 if ($tag eq 'title');
-}
-
-1;
diff --git a/run.rb b/run.rb
deleted file mode 100755
index 165659f..0000000
--- a/run.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/ruby
-
-require 'logger'
-require 'optparse'
-
-$LOAD_PATH << './lib'
-require 'playbot'
-
-# This code start the PlayBot with somes options.
-
-options = {}
-
-OptionParser.new do |opts|
-    opts.banner = "Usage: ./run.rb [OPTIONS]"
-
-    opts.on('-h', '--help', 'show this help') do
-        puts opts
-        exit
-    end
-
-    opts.on('-s', '--silent', 'set log to FATAL') do
-        options[:silent] = true
-    end
-
-    opts.on('-a', '--admin', 'admin nick') do
-        options[:admin] = arg
-    end
-
-    opts.on('-n', '--network', 'server address') do
-        options[:address] = arg
-    end
-
-    opts.on('-p', '--port', 'server port') do
-        options[:port] = arg
-    end
-end.parse!
-
-options[:silent] ||= false
-options[:admin] ||= 'moise'
-options[:address] ||= 'irc.iiens.net'
-
-bot = PlayBot.new(
-    :address    => options[:address],
-    :port       => options[:port],
-    :nicknames  => ['PlayBot', 'Play_Bot', 'Play__Bot', 'Play___Bot'],
-    :channels   => ['#hormone'],
-    :admin      => options[:admin],
-    :silent     => options[:silent]
-)
-bot.irc_loop
diff --git a/soundcloud.pm b/soundcloud.pm
deleted file mode 100644
index 1e00ebf..0000000
--- a/soundcloud.pm
+++ /dev/null
@@ -1,35 +0,0 @@
-package soundcloud;
-
-use LWP::UserAgent;
-use JSON;
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = qw(soundcloud);
-
-
-my $root = 'http://api.soundcloud.com';
-my $clientId = 'f4956716fe1a9dc9c3725af822963365';
-
-
-sub soundcloud {
-	my ($url) = @_;
-
-	my $ua = LWP::UserAgent->new(timeout => 30);
-
-	my $response = $ua->get($root.'/resolve.json?url='.$url.'&client_id='.$clientId);
-	die($response->status_line) unless ($response->is_success);
-
-	$content = decode_json($response->decoded_content);
-	$infos{'title'} = $content->{'title'};
-	$infos{'author'} = $content->{'user'}->{'username'};
-	$infos{'url'} = $url;
-
-	if ($content->{'downloadable'}) {
-		$infos{'ddl'} = $content->{'download_url'};
-	}
-	
-	return %infos;
-}
-
-1;
diff --git a/spec/site_plugin_spec.rb b/spec/site_plugin_spec.rb
deleted file mode 100644
index 612cf31..0000000
--- a/spec/site_plugin_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-$LOAD_PATH << '../lib'
-require 'site_plugin'
-
-describe SitePlugin do
-    describe 'inherance' do
-        it 'add the class to the repository' do
-            class TestPlugin1 < SitePlugin
-                def self.can_handle?(site)
-                    false
-                end
-            end
-
-            SitePlugin.repository.empty?.should be_false
-        end
-    end
-
-    describe '.for_site' do
-        it 'return plugin that can handle a given site"' do
-            class TestPlugin2 < SitePlugin
-                def self.can_handle?(site)
-                    site =~ /test/
-                end
-            end
-
-            SitePlugin.for_site('OfCourseICanHandle_test_').nil?.should be_false
-        end
-    end
-end
diff --git a/table_of_contents.html b/table_of_contents.html
new file mode 100644
index 0000000..2b27aaa
--- /dev/null
+++ b/table_of_contents.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
+
+<title>Table of Contents - RDoc Documentation</title>
+
+<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
+
+<script type="text/javascript">
+  var rdoc_rel_prefix = "./";
+</script>
+
+<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
+<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
+
+
+<body class="indexpage">
+<h1>Table of Contents - RDoc Documentation</h1>
+
+
+<h2 id="classes">Classes/Modules</h2>
+<ul>
+  <li class="class">
+    <a href="PlayBot.html">PlayBot</a>
+  </li>
+    <li class="class">
+    <a href="SitePlugin.html">SitePlugin</a>
+  </li>
+    <li class="class">
+    <a href="TestPlugin.html">TestPlugin</a>
+  </li>
+    <li class="class">
+    <a href="TestPlugin1.html">TestPlugin1</a>
+  </li>
+    <li class="class">
+    <a href="TestPlugin2.html">TestPlugin2</a>
+  </li>
+  
+</ul>
+
+<h2 id="methods">Methods</h2>
+<ul>
+  
+    <li class="method"><a href="TestPlugin.html#method-c-can_handle-3F">::can_handle? &mdash; TestPlugin</a>
+  
+    <li class="method"><a href="TestPlugin1.html#method-c-can_handle-3F">::can_handle? &mdash; TestPlugin1</a>
+  
+    <li class="method"><a href="TestPlugin2.html#method-c-can_handle-3F">::can_handle? &mdash; TestPlugin2</a>
+  
+    <li class="method"><a href="SitePlugin.html#method-c-for_site">::for_site &mdash; SitePlugin</a>
+  
+    <li class="method"><a href="SitePlugin.html#method-c-inherited">::inherited &mdash; SitePlugin</a>
+  
+    <li class="method"><a href="PlayBot.html#method-c-new">::new &mdash; PlayBot</a>
+  
+    <li class="method"><a href="TestPlugin.html#method-c-new">::new &mdash; TestPlugin</a>
+  
+    <li class="method"><a href="SitePlugin.html#method-c-repository">::repository &mdash; SitePlugin</a>
+  
+    <li class="method"><a href="PlayBot.html#method-i-add_custom_handlers">#add_custom_handlers &mdash; PlayBot</a>
+  
+    <li class="method"><a href="SitePlugin.html#method-i-can_handle-3F">#can_handle? &mdash; SitePlugin</a>
+  
+</ul>
+
+
+<footer id="validator-badges">
+  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
+  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
+  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
+</footer>
+
diff --git a/youtube.pm b/youtube.pm
deleted file mode 100644
index d9039b5..0000000
--- a/youtube.pm
+++ /dev/null
@@ -1,76 +0,0 @@
-package youtube;
-
-use LWP::UserAgent;
-use HTML::Parser;
-use HTML::Entities;
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = qw(youtube);
-
-
-my $inTitle = 0;
-my $inAuthor = 0;
-my %infos;
-
-
-sub youtube {
-	my ($url) = @_;
-
-	my $ua = LWP::UserAgent->new(
-		agent   => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1",
-		timeout => 30
-	);
-
-	my $response = $ua->get($url);
-	die($response->status_line) unless ($response->is_success);
-
-	my $content = $response->decoded_content;
-
-	my $parser = HTML::Parser->new();
-	$parser->handler(text => \&parser_text, 'text');
-	$parser->handler(start => \&parser_start, 'tagname,attr');
-	$parser->handler(end => \&parser_end, 'tagname');
-	$parser->unbroken_text(1);
-	$parser->report_tags('title', 'a');
-	$parser->parse($content);
-	$parser->eof();
-	
-	$infos{'url'} = $url;
-	
-	return %infos;
-}
-
-sub parser_text
-{
-	my ($text) = @_;
-	chomp $text;
-
-	if ($inTitle) {
-		$text =~ s/\n//;
-		$text =~ s/- YouTube//;
-		$text =~ s/^ *//;
-		$text =~ s/[^a-zA-Z0-9\(\)\[\]]*$//;
-		$infos{'title'} = decode_entities($text);
-	}
-	elsif ($inAuthor) {
-		$infos{'author'} = $text;
-	}
-}
-
-sub parser_start
-{
-	my ($tag, $attr) = @_;
-	$inTitle = 1 if ($tag eq 'title');
-	return unless (defined $attr);
-	$inAuthor = 1 if ($tag eq 'a' && exists($attr->{'class'}) && $attr->{'class'} =~ /yt-user-name author/);
-}
-
-sub parser_end
-{
-	my ($tag) = @_;
-	$inTitle = 0 if ($tag eq 'title');
-	$inAuthor = 0 if ($tag eq 'a');
-}
-
-1;
diff --git a/zippy.pm b/zippy.pm
deleted file mode 100644
index 872b13a..0000000
--- a/zippy.pm
+++ /dev/null
@@ -1,70 +0,0 @@
-package zippy;
-
-use LWP::UserAgent;
-use HTML::Parser;
-use HTML::Entities;
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = qw(zippy);
-
-
-my $inTitle = 0;
-my $inAuthor = 0;
-my %infos;
-
-
-sub zippy {
-	my ($url) = @_;
-
-	my $ua = LWP::UserAgent->new(
-		agent   => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1",
-		timeout => 30
-	);
-
-	my $response = $ua->get($url);
-	die($response->status_line) unless ($response->is_success);
-
-	my $content = $response->decoded_content;
-
-	my $parser = HTML::Parser->new();
-	$parser->handler(text => \&parser_text, 'text');
-	$parser->handler(start => \&parser_start, 'tagname');
-	$parser->handler(end => \&parser_end, 'tagname');
-	$parser->unbroken_text(1);
-	$parser->report_tags('title', 'a');
-	$parser->parse($content);
-	$parser->eof();
-	
-	$infos{'url'} = $url;
-	$infos{'author'} = undef;
-	
-	return %infos;
-}
-
-sub parser_text
-{
-	my ($text) = @_;
-	chomp $text;
-	$text = decode_entities($text);
-
-	if ($inTitle) {
-		$text =~ s/^Zippyshare.com - //;
-		$text =~ s/\.mp3$//;
-		$infos{'title'} = $text;
-	}
-}
-
-sub parser_start
-{
-	my ($tag) = @_;
-	$inTitle = 1 if ($tag eq 'title');
-}
-
-sub parser_end
-{
-	my ($tag) = @_;
-	$inTitle = 0 if ($tag eq 'title');
-}
-
-1;
-- 
GitLab