diff --git a/.gitignore b/.gitignore
index 65a22c8..a6d0efa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@
/*.dump
spec/examples.txt
+
+.rake_tasks~
diff --git a/.ruby-version b/.ruby-version
index 7d2ed7c..530cdd9 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.1.4
+2.2.4
diff --git a/.travis.yml b/.travis.yml
index a80b6e0..d37577c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
-language: node_js
-node_js:
- - '0.10'
+language: ruby
before_script:
- - 'npm install -g bower grunt-cli'
- - 'bower install'
+ - 'RAILS_ENV=test bundle exec rake db:create db:migrate'
+script:
+ - 'RAILS_ENV=test bundle exec rake spec'
+ - 'RAILS_ENV=test bundle exec rake spec:javascript'
diff --git a/Gemfile b/Gemfile
index 4e4d0c1..062eb32 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,5 @@
source 'https://rubygems.org'
-ruby '2.1.4'
+ruby '2.2.4'
gem 'rails', '~> 4.2.0'
gem 'uglifier', '>= 1.3.0'
@@ -8,6 +8,7 @@ gem 'sdoc', '~> 0.4.0', group: :doc
gem 'spring', group: :development
gem 'pg', '~> 0.17.1'
gem 'responders', '~> 2.1.1'
+gem 'react-rails', '~> 1.10.0'
group :development, :test do
gem 'rspec-rails', '~> 3.4.0'
@@ -15,6 +16,7 @@ group :development, :test do
gem 'factory_girl_rails', '~> 4.4.1'
gem 'database_cleaner', '~> 1.5.1'
gem 'faker', '~> 1.6.1'
+ gem 'jasmine-rails', '~> 0.14.1'
end
group :test do
@@ -23,9 +25,10 @@ group :test do
end
gem 'spring-commands-rspec', group: :development
-gem 'thin', '~> 1.6.2'
-gem 'sass', '~> 3.4.5'
-gem 'compass', '~> 1.0.1'
+gem 'thin', '~> 1.7.0'
+gem 'sass-rails', '~> 5.0.6'
+gem 'compass-rails', '~> 3.0.2'
+gem 'bootstrap-sass', '~> 3.3.7'
gem 'will_paginate', '~> 3.0.7'
gem 'geokit-rails', '~> 2.0.1'
gem 'countries', '~> 0.9.3'
diff --git a/Gemfile.lock b/Gemfile.lock
index 353552d..43076c2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,147 +1,178 @@
GEM
remote: https://rubygems.org/
specs:
- actionmailer (4.2.0)
- actionpack (= 4.2.0)
- actionview (= 4.2.0)
- activejob (= 4.2.0)
+ actionmailer (4.2.7.1)
+ actionpack (= 4.2.7.1)
+ actionview (= 4.2.7.1)
+ activejob (= 4.2.7.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
- actionpack (4.2.0)
- actionview (= 4.2.0)
- activesupport (= 4.2.0)
- rack (~> 1.6.0)
+ actionpack (4.2.7.1)
+ actionview (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
+ rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
- rails-html-sanitizer (~> 1.0, >= 1.0.1)
- actionview (4.2.0)
- activesupport (= 4.2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ actionview (4.2.7.1)
+ activesupport (= 4.2.7.1)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
- rails-html-sanitizer (~> 1.0, >= 1.0.1)
- activejob (4.2.0)
- activesupport (= 4.2.0)
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
+ activejob (4.2.7.1)
+ activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
- activemodel (4.2.0)
- activesupport (= 4.2.0)
+ activemodel (4.2.7.1)
+ activesupport (= 4.2.7.1)
builder (~> 3.1)
- activerecord (4.2.0)
- activemodel (= 4.2.0)
- activesupport (= 4.2.0)
+ activerecord (4.2.7.1)
+ activemodel (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
arel (~> 6.0)
- activesupport (4.2.0)
+ activesupport (4.2.7.1)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
- addressable (2.3.6)
- arel (6.0.0)
- builder (3.2.2)
- chunky_png (1.3.1)
- compass (1.0.1)
+ addressable (2.5.0)
+ public_suffix (~> 2.0, >= 2.0.2)
+ arel (6.0.4)
+ autoprefixer-rails (6.7.0)
+ execjs
+ babel-source (5.8.35)
+ babel-transpiler (0.7.0)
+ babel-source (>= 4.0, < 6)
+ execjs (~> 2.0)
+ bootstrap-sass (3.3.7)
+ autoprefixer-rails (>= 5.2.1)
+ sass (>= 3.3.4)
+ builder (3.2.3)
+ chunky_png (1.3.8)
+ coffee-script-source (1.12.2)
+ compass (1.0.3)
chunky_png (~> 1.2)
- compass-core (~> 1.0.1)
+ compass-core (~> 1.0.2)
compass-import-once (~> 1.0.5)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
sass (>= 3.3.13, < 3.5)
- compass-core (1.0.1)
+ compass-core (1.0.3)
multi_json (~> 1.0)
sass (>= 3.3.0, < 3.5)
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
+ compass-rails (3.0.2)
+ compass (~> 1.0.0)
+ sass-rails (< 5.1)
+ sprockets (< 4.0)
+ concurrent-ruby (1.0.4)
+ connection_pool (2.2.1)
countries (0.9.3)
currencies (~> 0.4.2)
- crack (0.4.2)
+ crack (0.4.3)
safe_yaml (~> 1.0.0)
currencies (0.4.2)
- daemons (1.1.9)
- database_cleaner (1.5.1)
- diff-lcs (1.2.5)
+ daemons (1.2.4)
+ database_cleaner (1.5.3)
+ diff-lcs (1.3)
erubis (2.7.0)
- eventmachine (1.0.3)
- execjs (2.2.1)
+ eventmachine (1.2.1)
+ execjs (2.7.0)
factory_girl (4.4.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.4.1)
factory_girl (~> 4.4.0)
railties (>= 3.0.0)
- faker (1.6.1)
+ faker (1.6.6)
i18n (~> 0.5)
- ffi (1.9.5)
+ ffi (1.9.17)
geoip (1.4.0)
- geokit (1.9.0)
- multi_json (>= 1.3.2)
+ geokit (1.10.0)
geokit-rails (2.0.1)
geokit (~> 1.5)
rails (>= 3.0)
- globalid (0.3.0)
+ globalid (0.3.7)
activesupport (>= 4.1.0)
- hike (1.2.3)
i18n (0.7.0)
- jbuilder (2.1.3)
- activesupport (>= 3.0.0, < 5)
+ jasmine-core (2.5.2)
+ jasmine-rails (0.14.1)
+ jasmine-core (>= 1.3, < 3.0)
+ phantomjs (>= 1.9)
+ railties (>= 3.2.0)
+ sprockets-rails
+ jbuilder (2.6.1)
+ activesupport (>= 3.0.0, < 5.1)
multi_json (~> 1.2)
- json (1.8.2)
- loofah (2.0.1)
+ json (1.8.6)
+ loofah (2.0.3)
nokogiri (>= 1.5.9)
- mail (2.6.3)
- mime-types (>= 1.16, < 3)
- mime-types (2.4.3)
- mini_portile (0.6.2)
- minitest (5.5.1)
- multi_json (1.10.1)
- nokogiri (1.6.5)
- mini_portile (~> 0.6.0)
+ mail (2.6.4)
+ mime-types (>= 1.16, < 4)
+ mime-types (3.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2016.0521)
+ mini_portile2 (2.1.0)
+ minitest (5.10.1)
+ multi_json (1.12.1)
+ nokogiri (1.7.0.1)
+ mini_portile2 (~> 2.1.0)
pg (0.17.1)
- rack (1.6.0)
+ phantomjs (2.1.1.0)
+ public_suffix (2.0.5)
+ rack (1.6.5)
rack-test (0.6.3)
rack (>= 1.0)
- rails (4.2.0)
- actionmailer (= 4.2.0)
- actionpack (= 4.2.0)
- actionview (= 4.2.0)
- activejob (= 4.2.0)
- activemodel (= 4.2.0)
- activerecord (= 4.2.0)
- activesupport (= 4.2.0)
+ rails (4.2.7.1)
+ actionmailer (= 4.2.7.1)
+ actionpack (= 4.2.7.1)
+ actionview (= 4.2.7.1)
+ activejob (= 4.2.7.1)
+ activemodel (= 4.2.7.1)
+ activerecord (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
bundler (>= 1.3.0, < 2.0)
- railties (= 4.2.0)
+ railties (= 4.2.7.1)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
- rails-dom-testing (1.0.5)
+ rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0)
- nokogiri (~> 1.6.0)
+ nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1)
- rails-html-sanitizer (1.0.1)
+ rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
- railties (4.2.0)
- actionpack (= 4.2.0)
- activesupport (= 4.2.0)
+ railties (4.2.7.1)
+ actionpack (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
- rake (10.4.2)
- rb-fsevent (0.9.4)
- rb-inotify (0.9.5)
+ rake (12.0.0)
+ rb-fsevent (0.9.8)
+ rb-inotify (0.9.8)
ffi (>= 0.5.0)
- rdoc (4.1.2)
- json (~> 1.4)
- responders (2.1.1)
+ rdoc (4.3.0)
+ react-rails (1.10.0)
+ babel-transpiler (>= 0.7.0)
+ coffee-script-source (~> 1.8)
+ connection_pool
+ execjs
+ railties (>= 3.2)
+ tilt
+ responders (2.1.2)
railties (>= 4.2.0, < 5.1)
- rspec-collection_matchers (1.1.2)
+ rspec-collection_matchers (1.1.3)
rspec-expectations (>= 2.99.0.beta1)
- rspec-core (3.4.1)
+ rspec-core (3.4.4)
rspec-support (~> 3.4.0)
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
- rspec-mocks (3.4.0)
+ rspec-mocks (3.4.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
- rspec-rails (3.4.0)
+ rspec-rails (3.4.2)
actionpack (>= 3.0, < 4.3)
activesupport (>= 3.0, < 4.3)
railties (>= 3.0, < 4.3)
@@ -151,66 +182,76 @@ GEM
rspec-support (~> 3.4.0)
rspec-support (3.4.1)
safe_yaml (1.0.4)
- sass (3.4.5)
- sdoc (0.4.1)
+ sass (3.4.23)
+ sass-rails (5.0.6)
+ railties (>= 4.0.0, < 6)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (>= 1.1, < 3)
+ sdoc (0.4.2)
json (~> 1.7, >= 1.7.7)
rdoc (~> 4.0)
- spring (1.1.3)
- spring-commands-rspec (1.0.2)
+ spring (2.0.1)
+ activesupport (>= 4.2)
+ spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
- sprockets (2.12.3)
- hike (~> 1.2)
- multi_json (~> 1.0)
- rack (~> 1.0)
- tilt (~> 1.1, != 1.3.0)
- sprockets-rails (2.2.2)
- actionpack (>= 3.0)
- activesupport (>= 3.0)
- sprockets (>= 2.8, < 4.0)
- thin (1.6.2)
- daemons (>= 1.0.9)
- eventmachine (>= 1.0.0)
- rack (>= 1.0.0)
- thor (0.19.1)
- thread_safe (0.3.4)
- tilt (1.4.1)
+ sprockets (3.7.1)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ sprockets-rails (3.2.0)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (>= 3.0.0)
+ thin (1.7.0)
+ daemons (~> 1.0, >= 1.0.9)
+ eventmachine (~> 1.0, >= 1.0.4)
+ rack (>= 1, < 3)
+ thor (0.19.4)
+ thread_safe (0.3.5)
+ tilt (2.0.6)
tzinfo (1.2.2)
thread_safe (~> 0.1)
- uglifier (2.5.3)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
+ uglifier (3.0.4)
+ execjs (>= 0.3.0, < 3)
vcr (2.9.3)
webmock (1.19.0)
addressable (>= 2.3.6)
crack (>= 0.3.2)
- will_paginate (3.0.7)
+ will_paginate (3.0.12)
PLATFORMS
ruby
DEPENDENCIES
- compass (~> 1.0.1)
+ bootstrap-sass (~> 3.3.7)
+ compass-rails (~> 3.0.2)
countries (~> 0.9.3)
database_cleaner (~> 1.5.1)
factory_girl_rails (~> 4.4.1)
faker (~> 1.6.1)
geoip (~> 1.4.0)
geokit-rails (~> 2.0.1)
+ jasmine-rails (~> 0.14.1)
jbuilder (~> 2.0)
pg (~> 0.17.1)
rails (~> 4.2.0)
+ react-rails (~> 1.10.0)
responders (~> 2.1.1)
rspec-collection_matchers (~> 1.1.2)
rspec-rails (~> 3.4.0)
- sass (~> 3.4.5)
+ sass-rails (~> 5.0.6)
sdoc (~> 0.4.0)
spring
spring-commands-rspec
- thin (~> 1.6.2)
+ thin (~> 1.7.0)
uglifier (>= 1.3.0)
vcr (~> 2.9.3)
webmock (~> 1.19.0)
will_paginate (~> 3.0.7)
+RUBY VERSION
+ ruby 2.2.4p230
+
BUNDLED WITH
- 1.11.2
+ 1.13.6
diff --git a/README.md b/README.md
index d36d89d..b557bcb 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,13 @@
# BlicblockJS
-Blicblock is a game your Sims in The Sims 4 can play on the computer. I thought
-it would be fun to recreate the game. Our Sims shouldn't have all the fun!
+[![Build Status](https://travis-ci.org/cheshire137/blicblock-js.svg?branch=master)](https://travis-ci.org/cheshire137/blicblock-js)
+
+Blicblock is a game that Sims in The Sims 4 play on their computers. I thought
+it would be fun to recreate the game; our Sims shouldn't have all the fun!
![BlicblockJS gameplay](https://raw.githubusercontent.com/cheshire137/blicblock-js/master/blicblockjs-screenshot-1.png)
-BlickblockJS is built using AngularJS, Bower, Yeoman, and Twitter Bootstrap.
+BlickblockJS is built using ReactJS and Ruby on Rails.
## Blicblock Notes from The Sims 4
@@ -18,42 +20,28 @@ BlickblockJS is built using AngularJS, Bower, Yeoman, and Twitter Bootstrap.
## How to Run
-You need Ruby, RubyGems, Bundler, Node.js, and PostgreSQL.
-
-1. `bundle`
-1. Create a `blicblockjs` role in PostgreSQL:
-
- % psql
- psql (9.2.1)
- Type "help" for help.
+You need Ruby, RubyGems, Bundler, and PostgreSQL.
- sarah=# CREATE USER blicblockjs WITH PASSWORD 'password';
- CREATE ROLE
- sarah=# ALTER USER blicblockjs WITH SUPERUSER;
- ALTER ROLE
-
- Or via command line: `createuser -P -s -e blicblockjs`
-
-1. `bundle exec rake db:create db:migrate db:seed`
-1. `cd client/`
-1. `npm install`
-1. `npm install -g bower`
-1. `bower install`
-1. `npm install -g grunt-cli`
-1. `grunt serve` to watch for file changes and to launch the Rails server.
+```bash
+bundle
+bundle exec rake db:create db:migrate db:seed
+bundle exec rails s
+open http://localhost:3000
+```
## How to Test
-### Rails API
-
-1. `RAILS_ENV=test bundle exec rake db:create db:migrate`
-1. `RAILS_ENV=test bundle exec rspec`
+```bash
+RAILS_ENV=test bundle exec rake db:create db:migrate
+RAILS_ENV=test bundle exec rake spec
+```
-### AngularJS
+You can also run Jasmine JavaScript tests in the browser:
-1. `cd client/`
-1. `npm install`
-1. `grunt test`
+```bash
+bundle exec rails s
+open http://localhost:3000/specs
+```
## How to Deploy to Heroku
diff --git a/public/images/blank.43deb719.gif b/app/assets/images/blank.gif
similarity index 100%
rename from public/images/blank.43deb719.gif
rename to app/assets/images/blank.gif
diff --git a/public/images/blicblock-screenshot-1.ff391b61.png b/app/assets/images/blicblock-screenshot-1.png
similarity index 100%
rename from public/images/blicblock-screenshot-1.ff391b61.png
rename to app/assets/images/blicblock-screenshot-1.png
diff --git a/public/images/blicblock-screenshot-2.61427e17.png b/app/assets/images/blicblock-screenshot-2.png
similarity index 100%
rename from public/images/blicblock-screenshot-2.61427e17.png
rename to app/assets/images/blicblock-screenshot-2.png
diff --git a/public/images/flags.65f87fe2.png b/app/assets/images/flags.png
similarity index 100%
rename from public/images/flags.65f87fe2.png
rename to app/assets/images/flags.png
diff --git a/public/images/yeoman.d2754b85.png b/app/assets/images/yeoman.png
similarity index 100%
rename from public/images/yeoman.d2754b85.png
rename to app/assets/images/yeoman.png
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 0000000..222a677
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,4 @@
+//= require react
+//= require react_ujs
+//= require_tree ./models
+//= require_tree ./components
diff --git a/app/assets/javascripts/components/.gitkeep b/app/assets/javascripts/components/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/javascripts/components/app.es6.jsx b/app/assets/javascripts/components/app.es6.jsx
new file mode 100644
index 0000000..c107124
--- /dev/null
+++ b/app/assets/javascripts/components/app.es6.jsx
@@ -0,0 +1,12 @@
+class App extends React.Component {
+ constructor() {
+ super()
+ this.state = { view: 'board' }
+ }
+
+ render () {
+ switch (this.state.view) {
+ default: return
`, ``, and ``.
-$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
-$font-family-base: $font-family-sans-serif !default;
-
-$font-size-base: 15px !default;
-$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
-$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
-
-$font-size-h1: floor(($font-size-base * 2.15)) !default;
-$font-size-h2: floor(($font-size-base * 1.7)) !default;
-$font-size-h3: ceil(($font-size-base * 1.25)) !default;
-$font-size-h4: $font-size-base !default;
-$font-size-h5: ceil(($font-size-base * 0.85)) !default;
-$font-size-h6: ceil(($font-size-base * 0.85)) !default;
-
-//** Unit-less `line-height` for use in components like buttons.
-$line-height-base: 1.428571429 !default; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
-
-//** By default, this inherits from the ``.
-$headings-font-family: "Open Sans", $font-family-sans-serif !default;
-$headings-font-weight: 600 !default;
-$headings-line-height: 1.1 !default;
-$headings-color: inherit !default;
-
-
-//== Iconography
-//
-//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-//** Load fonts from this directory.
-
-// [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
-$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
-
-//** File name for all font files.
-$icon-font-name: "glyphicons-halflings-regular" !default;
-//** Element ID within SVG icon file.
-$icon-font-svg-id: "glyphicons_halflingsregular" !default;
-
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-$padding-base-vertical: 6px !default;
-$padding-base-horizontal: 12px !default;
-
-$padding-large-vertical: 10px !default;
-$padding-large-horizontal: 16px !default;
-
-$padding-small-vertical: 5px !default;
-$padding-small-horizontal: 10px !default;
-
-$padding-xs-vertical: 1px !default;
-$padding-xs-horizontal: 5px !default;
-
-$line-height-large: 1.33 !default;
-$line-height-small: 1.5 !default;
-
-$border-radius-base: 4px !default;
-$border-radius-large: 6px !default;
-$border-radius-small: 2px !default;
-
-//** Global color for active items (e.g., navs or dropdowns).
-$component-active-color: #fff !default;
-//** Global background color for active items (e.g., navs or dropdowns).
-$component-active-bg: $brand-primary !default;
-
-//** Width of the `border` for generating carets that indicator dropdowns.
-$caret-width-base: 4px !default;
-//** Carets increase slightly in size for larger components.
-$caret-width-large: 5px !default;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for ``s and ` `s.
-$table-cell-padding: 8px !default;
-//** Padding for cells in `.table-condensed`.
-$table-condensed-cell-padding: 5px !default;
-
-//** Default background color used for all tables.
-$table-bg: transparent !default;
-//** Background color used for `.table-striped`.
-$table-bg-accent: lighten($body-bg, 3%) !default;
-//** Background color used for `.table-hover`.
-$table-bg-hover: $table-bg-accent !default;
-$table-bg-active: $table-bg-hover !default;
-
-//** Border color for table and cell borders.
-$table-border-color: lighten($body-bg, 5%) !default;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-$btn-font-weight: normal !default;
-
-$btn-default-color: #efefef !default;
-$btn-default-bg: #333 !default;
-$btn-default-border: lighten($btn-default-bg, 5%) !default;
-
-$btn-primary-color: #fff !default;
-$btn-primary-bg: $brand-primary !default;
-$btn-primary-border: darken($btn-primary-bg, 5%) !default;
-
-$btn-success-color: #fff !default;
-$btn-success-bg: $brand-success !default;
-$btn-success-border: darken($btn-success-bg, 5%) !default;
-
-$btn-info-color: #fff !default;
-$btn-info-bg: $brand-info !default;
-$btn-info-border: darken($btn-info-bg, 5%) !default;
-
-$btn-warning-color: #fff !default;
-$btn-warning-bg: $brand-warning !default;
-$btn-warning-border: darken($btn-warning-bg, 5%) !default;
-
-$btn-danger-color: #fff !default;
-$btn-danger-bg: $brand-danger !default;
-$btn-danger-border: darken($btn-danger-bg, 5%) !default;
-
-$btn-link-disabled-color: $gray-light !default;
-
-
-//== Forms
-//
-//##
-
-//** `` background color
-$input-bg: $btn-default-bg !default;
-//** `` background color
-$input-bg-disabled: #343434 !default;
-
-//** Text color for ``s
-$input-color: $btn-default-color !default;
-//** `` border color
-$input-border: $btn-default-border !default;
-//** `` border radius
-$input-border-radius: $border-radius-base !default;
-//** Border color for inputs on focus
-$input-border-focus: lighten($input-bg, 15%) !default;
-
-//** Placeholder text color
-$input-color-placeholder: lighten($input-bg, 25%) !default;
-
-//** Default `.form-control` height
-$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
-//** Large `.form-control` height
-$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
-//** Small `.form-control` height
-$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
-
-$legend-color: $gray-dark !default;
-$legend-border-color: #e5e5e5 !default;
-
-//** Background color for textual input addons
-$input-group-addon-bg: $gray-lighter !default;
-//** Border color for textual input addons
-$input-group-addon-border-color: $input-border !default;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-$dropdown-bg: #fff !default;
-//** Dropdown menu `border-color`.
-$dropdown-border: rgba(0,0,0,.15) !default;
-//** Dropdown menu `border-color` **for IE8**.
-$dropdown-fallback-border: #ccc !default;
-//** Divider color for between dropdown items.
-$dropdown-divider-bg: #e5e5e5 !default;
-
-//** Dropdown link text color.
-$dropdown-link-color: $gray-dark !default;
-//** Hover color for dropdown links.
-$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
-//** Hover background for dropdown links.
-$dropdown-link-hover-bg: #f5f5f5 !default;
-
-//** Active dropdown menu item text color.
-$dropdown-link-active-color: $component-active-color !default;
-//** Active dropdown menu item background color.
-$dropdown-link-active-bg: $component-active-bg !default;
-
-//** Disabled dropdown menu item background color.
-$dropdown-link-disabled-color: $gray-light !default;
-
-//** Text color for headers within dropdown menus.
-$dropdown-header-color: $gray-light !default;
-
-//** Deprecated `$dropdown-caret-color` as of v3.1.0
-$dropdown-caret-color: #000 !default;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-$zindex-navbar: 1000 !default;
-$zindex-dropdown: 1000 !default;
-$zindex-popover: 1060 !default;
-$zindex-tooltip: 1070 !default;
-$zindex-navbar-fixed: 1030 !default;
-$zindex-modal-background: 1040 !default;
-$zindex-modal: 1050 !default;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-//** Deprecated `$screen-xs` as of v3.0.1
-$screen-xs: 480px !default;
-//** Deprecated `$screen-xs-min` as of v3.2.0
-$screen-xs-min: $screen-xs !default;
-//** Deprecated `$screen-phone` as of v3.0.1
-$screen-phone: $screen-xs-min !default;
-
-// Small screen / tablet
-//** Deprecated `$screen-sm` as of v3.0.1
-$screen-sm: 768px !default;
-$screen-sm-min: $screen-sm !default;
-//** Deprecated `$screen-tablet` as of v3.0.1
-$screen-tablet: $screen-sm-min !default;
-
-// Medium screen / desktop
-//** Deprecated `$screen-md` as of v3.0.1
-$screen-md: 992px !default;
-$screen-md-min: $screen-md !default;
-//** Deprecated `$screen-desktop` as of v3.0.1
-$screen-desktop: $screen-md-min !default;
-
-// Large screen / wide desktop
-//** Deprecated `$screen-lg` as of v3.0.1
-$screen-lg: 1200px !default;
-$screen-lg-min: $screen-lg !default;
-//** Deprecated `$screen-lg-desktop` as of v3.0.1
-$screen-lg-desktop: $screen-lg-min !default;
-
-// So media queries don't overlap when required, provide a maximum
-$screen-xs-max: ($screen-sm-min - 1) !default;
-$screen-sm-max: ($screen-md-min - 1) !default;
-$screen-md-max: ($screen-lg-min - 1) !default;
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-$grid-columns: 12 !default;
-//** Padding between columns. Gets divided in half for the left and right.
-$grid-gutter-width: 30px !default;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-$grid-float-breakpoint: $screen-sm-min !default;
-//** Point at which the navbar begins collapsing.
-$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-$container-tablet: ((720px + $grid-gutter-width)) !default;
-//** For `$screen-sm-min` and up.
-$container-sm: $container-tablet !default;
-
-// Medium screen / desktop
-$container-desktop: ((940px + $grid-gutter-width)) !default;
-//** For `$screen-md-min` and up.
-$container-md: $container-desktop !default;
-
-// Large screen / wide desktop
-$container-large-desktop: ((1140px + $grid-gutter-width)) !default;
-//** For `$screen-lg-min` and up.
-$container-lg: $container-large-desktop !default;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-$navbar-height: 50px !default;
-$navbar-margin-bottom: $line-height-computed !default;
-$navbar-border-radius: $border-radius-base !default;
-$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
-$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;
-$navbar-collapse-max-height: 340px !default;
-
-$navbar-default-color: #777 !default;
-$navbar-default-bg: #f8f8f8 !default;
-$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;
-
-// Navbar links
-$navbar-default-link-color: #777 !default;
-$navbar-default-link-hover-color: #333 !default;
-$navbar-default-link-hover-bg: transparent !default;
-$navbar-default-link-active-color: #555 !default;
-$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;
-$navbar-default-link-disabled-color: #ccc !default;
-$navbar-default-link-disabled-bg: transparent !default;
-
-// Navbar brand label
-$navbar-default-brand-color: $navbar-default-link-color !default;
-$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;
-$navbar-default-brand-hover-bg: transparent !default;
-
-// Navbar toggle
-$navbar-default-toggle-hover-bg: #ddd !default;
-$navbar-default-toggle-icon-bar-bg: #888 !default;
-$navbar-default-toggle-border-color: #ddd !default;
-
-
-// Inverted navbar
-// Reset inverted navbar basics
-$navbar-inverse-color: $gray-light !default;
-$navbar-inverse-bg: $body-bg !default;
-$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
-
-// Inverted navbar links
-$navbar-inverse-link-color: $gray-light !default;
-$navbar-inverse-link-hover-color: #fff !default;
-$navbar-inverse-link-hover-bg: transparent !default;
-$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
-$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;
-$navbar-inverse-link-disabled-color: #444 !default;
-$navbar-inverse-link-disabled-bg: transparent !default;
-
-// Inverted navbar brand label
-$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
-$navbar-inverse-brand-hover-color: #fff !default;
-$navbar-inverse-brand-hover-bg: transparent !default;
-
-// Inverted navbar toggle
-$navbar-inverse-toggle-hover-bg: #333 !default;
-$navbar-inverse-toggle-icon-bar-bg: #fff !default;
-$navbar-inverse-toggle-border-color: #333 !default;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-$nav-link-padding: 10px 15px !default;
-$nav-link-hover-bg: $gray-lighter !default;
-
-$nav-disabled-link-color: $gray-light !default;
-$nav-disabled-link-hover-color: $gray-light !default;
-
-$nav-open-link-hover-color: #fff !default;
-
-//== Tabs
-$nav-tabs-border-color: #ddd !default;
-
-$nav-tabs-link-hover-border-color: $gray-lighter !default;
-
-$nav-tabs-active-link-hover-bg: $body-bg !default;
-$nav-tabs-active-link-hover-color: $gray !default;
-$nav-tabs-active-link-hover-border-color: #ddd !default;
-
-$nav-tabs-justified-link-border-color: #ddd !default;
-$nav-tabs-justified-active-link-border-color: $body-bg !default;
-
-//== Pills
-$nav-pills-border-radius: $border-radius-base !default;
-$nav-pills-active-link-hover-bg: $component-active-bg !default;
-$nav-pills-active-link-hover-color: $component-active-color !default;
-
-
-//== Pagination
-//
-//##
-
-$pagination-color: $link-color !default;
-$pagination-bg: lighten($body-bg, 5%) !default;
-$pagination-border: lighten($body-bg, 7%) !default;
-
-$pagination-hover-color: $link-color !default;
-$pagination-hover-bg: lighten($body-bg, 10%) !default;
-$pagination-hover-border: lighten($body-bg, 12%) !default;
-
-$pagination-active-color: #fff !default;
-$pagination-active-bg: $brand-primary !default;
-$pagination-active-border: $brand-primary !default;
-
-$pagination-disabled-color: $gray-light !default;
-$pagination-disabled-bg: lighten($body-bg, 10%) !default;
-$pagination-disabled-border: lighten($body-bg, 15%) !default;
-
-
-//== Pager
-//
-//##
-
-$pager-bg: $pagination-bg !default;
-$pager-border: $pagination-border !default;
-$pager-border-radius: 15px !default;
-
-$pager-hover-bg: $pagination-hover-bg !default;
-
-$pager-active-bg: $pagination-active-bg !default;
-$pager-active-color: $pagination-active-color !default;
-
-$pager-disabled-color: $pagination-disabled-color !default;
-
-
-//== Jumbotron
-//
-//##
-
-$jumbotron-padding: 30px !default;
-$jumbotron-color: inherit !default;
-$jumbotron-bg: lighten($body-bg, 10%) !default;
-$jumbotron-heading-color: inherit !default;
-$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-$state-success-text: #fff !default;
-$state-success-bg: #6EAB34 !default;
-$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;
-
-$state-info-text: #fff !default;
-$state-info-bg: #439CAE !default;
-$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;
-
-$state-warning-text: #fff !default;
-$state-warning-bg: #AF6D19 !default;
-$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;
-
-$state-danger-text: #fff !default;
-$state-danger-bg: #AF3519 !default;
-$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-$tooltip-max-width: 200px !default;
-//** Tooltip text color
-$tooltip-color: #fff !default;
-//** Tooltip background color
-$tooltip-bg: darken($brand-primary, 10%) !default;
-$tooltip-opacity: 0.9 !default;
-
-//** Tooltip arrow width
-$tooltip-arrow-width: 5px !default;
-//** Tooltip arrow color
-$tooltip-arrow-color: $tooltip-bg !default;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-$popover-bg: #fff !default;
-//** Popover maximum width
-$popover-max-width: 276px !default;
-//** Popover border color
-$popover-border-color: rgba(0,0,0,.2) !default;
-//** Popover fallback border color
-$popover-fallback-border-color: #ccc !default;
-
-//** Popover title background color
-$popover-title-bg: darken($popover-bg, 3%) !default;
-
-//** Popover arrow width
-$popover-arrow-width: 10px !default;
-//** Popover arrow color
-$popover-arrow-color: #fff !default;
-
-//** Popover outer arrow width
-$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
-//** Popover outer arrow color
-$popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default;
-//** Popover outer arrow fallback color
-$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-$label-default-bg: $gray-light !default;
-//** Primary label background color
-$label-primary-bg: $brand-primary !default;
-//** Success label background color
-$label-success-bg: $brand-success !default;
-//** Info label background color
-$label-info-bg: $brand-info !default;
-//** Warning label background color
-$label-warning-bg: $brand-warning !default;
-//** Danger label background color
-$label-danger-bg: $brand-danger !default;
-
-//** Default label text color
-$label-color: #fff !default;
-//** Default text color of a linked label
-$label-link-hover-color: #fff !default;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-$modal-inner-padding: 15px !default;
-
-//** Padding applied to the modal title
-$modal-title-padding: 15px !default;
-//** Modal title line-height
-$modal-title-line-height: $line-height-base !default;
-
-//** Background color of modal content area
-$modal-content-bg: #fff !default;
-//** Modal content border color
-$modal-content-border-color: rgba(0,0,0,.2) !default;
-//** Modal content border color **for IE8**
-$modal-content-fallback-border-color: #999 !default;
-
-//** Modal backdrop background color
-$modal-backdrop-bg: #000 !default;
-//** Modal backdrop opacity
-$modal-backdrop-opacity: .5 !default;
-//** Modal header border color
-$modal-header-border-color: #e5e5e5 !default;
-//** Modal footer border color
-$modal-footer-border-color: $modal-header-border-color !default;
-
-$modal-lg: 900px !default;
-$modal-md: 600px !default;
-$modal-sm: 300px !default;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-$alert-padding: 15px !default;
-$alert-border-radius: $border-radius-base !default;
-$alert-link-font-weight: bold !default;
-
-$alert-success-bg: $state-success-bg !default;
-$alert-success-text: $state-success-text !default;
-$alert-success-border: $state-success-border !default;
-
-$alert-info-bg: $state-info-bg !default;
-$alert-info-text: $state-info-text !default;
-$alert-info-border: $state-info-border !default;
-
-$alert-warning-bg: $state-warning-bg !default;
-$alert-warning-text: $state-warning-text !default;
-$alert-warning-border: $state-warning-border !default;
-
-$alert-danger-bg: $state-danger-bg !default;
-$alert-danger-text: $state-danger-text !default;
-$alert-danger-border: $state-danger-border !default;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-$progress-bg: #f5f5f5 !default;
-//** Progress bar text color
-$progress-bar-color: #fff !default;
-
-//** Default progress bar color
-$progress-bar-bg: $brand-primary !default;
-//** Success progress bar color
-$progress-bar-success-bg: $brand-success !default;
-//** Warning progress bar color
-$progress-bar-warning-bg: $brand-warning !default;
-//** Danger progress bar color
-$progress-bar-danger-bg: $brand-danger !default;
-//** Info progress bar color
-$progress-bar-info-bg: $brand-info !default;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-$list-group-bg: #fff !default;
-//** `.list-group-item` border color
-$list-group-border: #ddd !default;
-//** List group border radius
-$list-group-border-radius: $border-radius-base !default;
-
-//** Background color of single list items on hover
-$list-group-hover-bg: #f5f5f5 !default;
-//** Text color of active list items
-$list-group-active-color: $component-active-color !default;
-//** Background color of active list items
-$list-group-active-bg: $component-active-bg !default;
-//** Border color of active list elements
-$list-group-active-border: $list-group-active-bg !default;
-//** Text color for content within active list items
-$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
-
-//** Text color of disabled list items
-$list-group-disabled-color: $gray-light !default;
-//** Background color of disabled list items
-$list-group-disabled-bg: $gray-lighter !default;
-//** Text color for content within disabled list items
-$list-group-disabled-text-color: $list-group-disabled-color !default;
-
-$list-group-link-color: #555 !default;
-$list-group-link-hover-color: $list-group-link-color !default;
-$list-group-link-heading-color: #333 !default;
-
-
-//== Panels
-//
-//##
-
-$panel-bg: #fff !default;
-$panel-body-padding: 15px !default;
-$panel-heading-padding: 10px 15px !default;
-$panel-footer-padding: $panel-heading-padding !default;
-$panel-border-radius: $border-radius-base !default;
-
-//** Border color for elements within panels
-$panel-inner-border: #ddd !default;
-$panel-footer-bg: #f5f5f5 !default;
-
-$panel-default-text: $gray-dark !default;
-$panel-default-border: #ddd !default;
-$panel-default-heading-bg: #f5f5f5 !default;
-
-$panel-primary-text: #fff !default;
-$panel-primary-border: $brand-primary !default;
-$panel-primary-heading-bg: $brand-primary !default;
-
-$panel-success-text: $state-success-text !default;
-$panel-success-border: $state-success-border !default;
-$panel-success-heading-bg: $state-success-bg !default;
-
-$panel-info-text: $state-info-text !default;
-$panel-info-border: $state-info-border !default;
-$panel-info-heading-bg: $state-info-bg !default;
-
-$panel-warning-text: $state-warning-text !default;
-$panel-warning-border: $state-warning-border !default;
-$panel-warning-heading-bg: $state-warning-bg !default;
-
-$panel-danger-text: $state-danger-text !default;
-$panel-danger-border: $state-danger-border !default;
-$panel-danger-heading-bg: $state-danger-bg !default;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-$thumbnail-padding: 4px !default;
-//** Thumbnail background color
-$thumbnail-bg: $body-bg !default;
-//** Thumbnail border color
-$thumbnail-border: #ddd !default;
-//** Thumbnail border radius
-$thumbnail-border-radius: $border-radius-base !default;
-
-//** Custom text color for thumbnail captions
-$thumbnail-caption-color: $text-color !default;
-//** Padding around the thumbnail caption
-$thumbnail-caption-padding: 9px !default;
-
-
-//== Wells
-//
-//##
-
-$well-bg: #f5f5f5 !default;
-$well-border: darken($well-bg, 7%) !default;
-
-
-//== Badges
-//
-//##
-
-$badge-color: #fff !default;
-//** Linked badge text color on hover
-$badge-link-hover-color: #fff !default;
-$badge-bg: $gray-light !default;
-
-//** Badge text color in active nav link
-$badge-active-color: $link-color !default;
-//** Badge background color in active nav link
-$badge-active-bg: #fff !default;
-
-$badge-font-weight: bold !default;
-$badge-line-height: 1 !default;
-$badge-border-radius: 10px !default;
-
-
-//== Breadcrumbs
-//
-//##
-
-$breadcrumb-padding-vertical: 8px !default;
-$breadcrumb-padding-horizontal: 15px !default;
-//** Breadcrumb background color
-$breadcrumb-bg: #f5f5f5 !default;
-//** Breadcrumb text color
-$breadcrumb-color: #ccc !default;
-//** Text color of current page in the breadcrumb
-$breadcrumb-active-color: $gray-light !default;
-//** Textual separator for between breadcrumb elements
-$breadcrumb-separator: "/" !default;
-
-
-//== Carousel
-//
-//##
-
-$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
-
-$carousel-control-color: #fff !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-$carousel-control-font-size: 20px !default;
-
-$carousel-indicator-active-bg: #fff !default;
-$carousel-indicator-border-color: #fff !default;
-
-$carousel-caption-color: #fff !default;
-
-
-//== Close
-//
-//##
-
-$close-font-weight: bold !default;
-$close-color: #000 !default;
-$close-text-shadow: 0 1px 0 #fff !default;
-
-
-//== Code
-//
-//##
-
-$code-color: #c7254e !default;
-$code-bg: #f9f2f4 !default;
-
-$kbd-color: #fff !default;
-$kbd-bg: #333 !default;
-
-$pre-bg: #f5f5f5 !default;
-$pre-color: $gray-dark !default;
-$pre-border-color: #ccc !default;
-$pre-scrollable-max-height: 340px !default;
-
-
-//== Type
-//
-//##
-
-//** Horizontal offset for forms and lists.
-$component-offset-horizontal: 180px !default;
-//** Text muted color
-$text-muted: $gray-lighter !default;
-//** Abbreviations and acronyms border color
-$abbr-border-color: $gray-dark !default;
-//** Headings small color
-$headings-small-color: $gray-lighter !default;
-//** Blockquote small color
-$blockquote-small-color: $gray-lighter !default;
-//** Blockquote font size
-$blockquote-font-size: ($font-size-base * 1.25) !default;
-//** Blockquote border color
-$blockquote-border-color: lighten($body-bg, 15%) !default;
-//** Page header border color
-$page-header-border-color: lighten($body-bg, 15%) !default;
-//** Width of horizontal description list titles
-$dl-horizontal-offset: $component-offset-horizontal !default;
-//** Horizontal line color.
-$hr-border: lighten($body-bg, 15%) !default;
-
-
diff --git a/client/app/styles/bootstrap.scss b/client/app/styles/bootstrap.scss
deleted file mode 100644
index 2f44e7a..0000000
--- a/client/app/styles/bootstrap.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-// Core variables and mixins
-@import "variables";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/mixins";
-
-// Reset and dependencies
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/normalize";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/print";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/glyphicons";
-
-// Core CSS
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/scaffolding";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/type";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/code";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/grid";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/tables";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/forms";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/buttons";
-
-// Components
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/component-animations";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/dropdowns";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/button-groups";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/input-groups";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/navs";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/navbar";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/breadcrumbs";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/pagination";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/pager";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/labels";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/badges";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/jumbotron";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/thumbnails";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/alerts";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/progress-bars";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/media";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/list-group";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/panels";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-embed";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/wells";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/close";
-
-// Components w/ JavaScript
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/modals";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/tooltip";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/popovers";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/carousel";
-
-// Utility classes
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/utilities";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap/responsive-utilities";
diff --git a/client/bower.json b/client/bower.json
deleted file mode 100644
index ab6b03c..0000000
--- a/client/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "blicblock",
- "version": "0.0.0",
- "dependencies": {
- "angular": "1.2.16",
- "json3": "~3.3.1",
- "es5-shim": "~3.1.0",
- "bootstrap-sass-official": "~3.2.0",
- "angular-resource": "1.2.16",
- "angular-cookies": "1.2.16",
- "angular-sanitize": "1.2.16",
- "angular-animate": "1.2.16",
- "angular-touch": "1.2.16",
- "angular-route": "1.2.16",
- "animate-css": "~3.2.0",
- "angular-bootstrap": "~0.11.0",
- "angular-local-storage": "~0.0.7",
- "angular-moment": "~0.8.2",
- "angular-swipe": "~0.0.6",
- "angularjs-multiselect": "~2.0.2"
- },
- "devDependencies": {
- "angular-mocks": "1.2.16",
- "angular-scenario": "1.2.16",
- "jquery": "~2.1.1"
- },
- "appPath": "app",
- "resolutions": {
- "angular": "1.2.16"
- }
-}
diff --git a/client/package.json b/client/package.json
deleted file mode 100644
index 601221a..0000000
--- a/client/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "name": "blicblockJS",
- "description": "A JavaScript implementation of the game Blicblock that your Sims play in The Sims 4.",
- "repository": {
- "type": "git",
- "url": "git://github.com/cheshire137/blicblock-js.git"
- },
- "version": "0.0.0",
- "dependencies": {},
- "devDependencies": {
- "coffee-script": "^1.8.0",
- "grunt": "^0.4.1",
- "grunt-autoprefixer": "^0.7.3",
- "grunt-compass-multiple": "^0.2.1",
- "grunt-concurrent": "^0.5.0",
- "grunt-connect-proxy": "^0.1.10",
- "grunt-contrib-clean": "^0.5.0",
- "grunt-contrib-coffee": "^0.10.1",
- "grunt-contrib-compass": "^0.7.2",
- "grunt-contrib-concat": "^0.4.0",
- "grunt-contrib-connect": "^0.7.1",
- "grunt-contrib-copy": "^0.5.0",
- "grunt-contrib-cssmin": "^0.9.0",
- "grunt-contrib-htmlmin": "^0.3.0",
- "grunt-contrib-imagemin": "^0.7.0",
- "grunt-contrib-jshint": "^0.10.0",
- "grunt-contrib-uglify": "^0.4.0",
- "grunt-contrib-watch": "^0.6.1",
- "grunt-filerev": "^0.2.1",
- "grunt-google-cdn": "^0.4.0",
- "grunt-karma": "^0.9.0",
- "grunt-newer": "^0.7.0",
- "grunt-ngmin": "^0.0.3",
- "grunt-rails-server": "^0.1.0",
- "grunt-shell-spawn": "^0.3.0",
- "grunt-svgmin": "^0.4.0",
- "grunt-usemin": "^2.1.1",
- "grunt-wiredep": "^1.9.0",
- "jshint-stylish": "^0.2.0",
- "karma": "^0.12.23",
- "karma-coffee-preprocessor": "^0.2.1",
- "karma-jasmine": "^0.1.5",
- "karma-phantomjs-launcher": "^0.1.4",
- "load-grunt-tasks": "^0.4.0",
- "time-grunt": "^0.3.1"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "scripts": {
- "preinstall": "npm install -g bower grunt-cli",
- "postinstall": "bower install",
- "test": "grunt test --single-run"
- }
-}
diff --git a/config/application.rb b/config/application.rb
index 10fc69c..b0235e7 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -30,6 +30,10 @@ class Application < Rails::Application
controller_specs: true
end
+ config.react.addons = true
+
config.gem 'geokit'
+
+ config.sass.preferred_syntax = :scss
end
end
diff --git a/config/database.yml b/config/database.yml
index f4e7abe..f1b30fb 100644
--- a/config/database.yml
+++ b/config/database.yml
@@ -24,8 +24,6 @@ default: &default
development:
<<: *default
database: blicblockjs_development
- username: blicblockjs
- password: password
# The specified database role being used to connect to postgres.
# To create additional roles in postgres see `$ createuser --help`.
@@ -60,8 +58,6 @@ development:
test:
<<: *default
database: blicblockjs_test
- username: blicblockjs
- password: password
# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
diff --git a/config/routes.rb b/config/routes.rb
index dff97de..1d53f3a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
Rails.application.routes.draw do
+ mount JasmineRails::Engine => '/specs' if defined?(JasmineRails)
scope '/api' do
resources :scores, defaults: {format: :json},
only: [:index, :show, :create] do
@@ -7,5 +8,5 @@
end
end
end
- root to: redirect('/api/scores.json')
+ root to: 'home#index'
end
diff --git a/db/schema.rb b/db/schema.rb
index 955768d..5f1a26f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -17,16 +17,16 @@
enable_extension "plpgsql"
create_table "locations", force: :cascade do |t|
- t.string "country"
+ t.string "country", limit: 255
t.string "country_code", limit: 3
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "scores", force: :cascade do |t|
- t.string "initials"
- t.integer "value", null: false
- t.string "ip_address"
+ t.string "initials", limit: 255
+ t.integer "value", null: false
+ t.string "ip_address", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
t.integer "location_id"
diff --git a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.eot b/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.eot
deleted file mode 100644
index 4a4ca86..0000000
Binary files a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.eot and /dev/null differ
diff --git a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.svg b/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
deleted file mode 100644
index e3e2dc7..0000000
--- a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,229 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf b/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 67fa00b..0000000
Binary files a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf and /dev/null differ
diff --git a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.woff b/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.woff
deleted file mode 100644
index 8c54182..0000000
Binary files a/public/bower_components/bootstrap-sass-official/assets/fonts/bootstrap/glyphicons-halflings-regular.woff and /dev/null differ
diff --git a/public/index.html b/public/index.html
deleted file mode 100644
index defae33..0000000
--- a/public/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
- BlicblockJS
\ No newline at end of file
diff --git a/public/scripts/oldieshim.ff90b0fb.js b/public/scripts/oldieshim.ff90b0fb.js
deleted file mode 100644
index 3c47282..0000000
--- a/public/scripts/oldieshim.ff90b0fb.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.returnExports=b()}(this,function(){function a(){}function b(a){return a=+a,a!==a?a=0:0!==a&&a!==1/0&&a!==-(1/0)&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a}function c(a){var b=typeof a;return null===a||"undefined"===b||"boolean"===b||"number"===b||"string"===b}function d(a){var b,d,e;if(c(a))return a;if(d=a.valueOf,l(d)&&(b=d.call(a),c(b)))return b;if(e=a.toString,l(e)&&(b=e.call(a),c(b)))return b;throw new TypeError}var e=Function.prototype.call,f=Array.prototype,g=Object.prototype,h=f.slice,i=Array.prototype.splice,j=Array.prototype.push,k=Array.prototype.unshift,l=function(a){return"[object Function]"===g.toString.call(a)},m=function(a){return"[object RegExp]"===g.toString.call(a)};Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(!l(c))throw new TypeError("Function.prototype.bind called on incompatible "+c);for(var d=h.call(arguments,1),e=function(){if(this instanceof j){var a=c.apply(this,d.concat(h.call(arguments)));return Object(a)===a?a:this}return c.apply(b,d.concat(h.call(arguments)))},f=Math.max(0,c.length-d.length),g=[],i=0;f>i;i++)g.push("$"+i);var j=Function("binder","return function("+g.join(",")+"){return binder.apply(this,arguments)}")(e);return c.prototype&&(a.prototype=c.prototype,j.prototype=new a,a.prototype=null),j});var n,o,p,q,r,s=e.bind(g.hasOwnProperty),t=e.bind(g.toString);(r=s(g,"__defineGetter__"))&&(n=e.bind(g.__defineGetter__),o=e.bind(g.__defineSetter__),p=e.bind(g.__lookupGetter__),q=e.bind(g.__lookupSetter__)),2!==[1,2].splice(0).length&&(Array.prototype.splice=function(){function a(a){for(var b=[];a--;)b.unshift(a);return b}var b,c=[];return c.splice.bind(c,0,0).apply(null,a(20)),c.splice.bind(c,0,0).apply(null,a(26)),b=c.length,c.splice(5,0,"XXX"),b+1===c.length?!0:void 0}()?function(a,b){return arguments.length?i.apply(this,[void 0===a?0:a,void 0===b?this.length-a:b].concat(h.call(arguments,2))):[]}:function(a,b){var c,d=h.call(arguments,2),e=d.length;if(!arguments.length)return[];if(void 0===a&&(a=0),void 0===b&&(b=this.length-a),e>0){if(0>=b){if(a===this.length)return j.apply(this,d),[];if(0===a)return k.apply(this,d),[]}return c=h.call(this,a,a+b),d.push.apply(d,h.call(this,a+b,this.length)),d.unshift.apply(d,h.call(this,0,a)),d.unshift(0,this.length),i.apply(this,d),c}return i.call(this,a,b)}),1!==[].unshift(0)&&(Array.prototype.unshift=function(){return k.apply(this,arguments),this.length}),Array.isArray||(Array.isArray=function(a){return"[object Array]"===t(a)});var u=Object("a"),v="a"!==u[0]||!(0 in u),w=function(a){var b=!0;return a&&a.call("foo",function(a,c,d){"object"!=typeof d&&(b=!1)}),!!a&&b};Array.prototype.forEach&&w(Array.prototype.forEach)||(Array.prototype.forEach=function(a){var b=S(this),c=v&&"[object String]"===t(this)?this.split(""):b,d=arguments[1],e=-1,f=c.length>>>0;if(!l(a))throw new TypeError;for(;++e>>0,e=Array(d),f=arguments[1];if(!l(a))throw new TypeError(a+" is not a function");for(var g=0;d>g;g++)g in c&&(e[g]=a.call(f,c[g],g,b));return e}),Array.prototype.filter&&w(Array.prototype.filter)||(Array.prototype.filter=function(a){var b,c=S(this),d=v&&"[object String]"===t(this)?this.split(""):c,e=d.length>>>0,f=[],g=arguments[1];if(!l(a))throw new TypeError(a+" is not a function");for(var h=0;e>h;h++)h in d&&(b=d[h],a.call(g,b,h,c)&&f.push(b));return f}),Array.prototype.every&&w(Array.prototype.every)||(Array.prototype.every=function(a){var b=S(this),c=v&&"[object String]"===t(this)?this.split(""):b,d=c.length>>>0,e=arguments[1];if(!l(a))throw new TypeError(a+" is not a function");for(var f=0;d>f;f++)if(f in c&&!a.call(e,c[f],f,b))return!1;return!0}),Array.prototype.some&&w(Array.prototype.some)||(Array.prototype.some=function(a){var b=S(this),c=v&&"[object String]"===t(this)?this.split(""):b,d=c.length>>>0,e=arguments[1];if(!l(a))throw new TypeError(a+" is not a function");for(var f=0;d>f;f++)if(f in c&&a.call(e,c[f],f,b))return!0;return!1});var x=!1;if(Array.prototype.reduce&&(x="object"==typeof Array.prototype.reduce.call("a",function(a,b,c,d){return d})),Array.prototype.reduce&&x||(Array.prototype.reduce=function(a){var b=S(this),c=v&&"[object String]"===t(this)?this.split(""):b,d=c.length>>>0;if(!l(a))throw new TypeError(a+" is not a function");if(!d&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var e,f=0;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f++];break}if(++f>=d)throw new TypeError("reduce of empty array with no initial value")}for(;d>f;f++)f in c&&(e=a.call(void 0,e,c[f],f,b));return e}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(a){var b=S(this),c=v&&"[object String]"===t(this)?this.split(""):b,d=c.length>>>0;if(!l(a))throw new TypeError(a+" is not a function");if(!d&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var e,f=d-1;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f--];break}if(--f<0)throw new TypeError("reduceRight of empty array with no initial value")}if(0>f)return e;do f in this&&(e=a.call(void 0,e,c[f],f,b));while(f--);return e}),Array.prototype.indexOf&&-1===[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(a){var c=v&&"[object String]"===t(this)?this.split(""):S(this),d=c.length>>>0;if(!d)return-1;var e=0;for(arguments.length>1&&(e=b(arguments[1])),e=e>=0?e:Math.max(0,d+e);d>e;e++)if(e in c&&c[e]===a)return e;return-1}),Array.prototype.lastIndexOf&&-1===[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(a){var c=v&&"[object String]"===t(this)?this.split(""):S(this),d=c.length>>>0;if(!d)return-1;var e=d-1;for(arguments.length>1&&(e=Math.min(e,b(arguments[1]))),e=e>=0?e:d-Math.abs(e);e>=0;e--)if(e in c&&a===c[e])return e;return-1}),!Object.keys){var y=!{toString:null}.propertyIsEnumerable("toString"),z=function(){}.propertyIsEnumerable("prototype"),A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],B=A.length,C=function(a){var b=t(a),c="[object Arguments]"===b;return c||(c=!Array.isArray(b)&&null!==a&&"object"==typeof a&&"number"==typeof a.length&&a.length>=0&&l(a.callee)),c};Object.keys=function(a){var b=l(a),c=C(a),d=null!==a&&"object"==typeof a,e=d&&"[object String]"===t(a);if(!d&&!b&&!c)throw new TypeError("Object.keys called on a non-object");var f=[],g=z&&b;if(e||c)for(var h=0;hm;m++){var n=A[m];k&&"constructor"===n||!s(a,n)||f.push(n)}return f}}var D=-621987552e5,E="-000001";Date.prototype.toISOString&&-1!==new Date(D).toISOString().indexOf(E)||(Date.prototype.toISOString=function(){var a,b,c,d,e;if(!isFinite(this))throw new RangeError("Date.prototype.toISOString called on non-finite value.");for(d=this.getUTCFullYear(),e=this.getUTCMonth(),d+=Math.floor(e/12),e=(e%12+12)%12,a=[e+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],d=(0>d?"-":d>9999?"+":"")+("00000"+Math.abs(d)).slice(d>=0&&9999>=d?-4:-6),b=a.length;b--;)c=a[b],10>c&&(a[b]="0"+c);return d+"-"+a.slice(0,2).join("-")+"T"+a.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"});var F=!1;try{F=Date.prototype.toJSON&&null===new Date(0/0).toJSON()&&-1!==new Date(D).toJSON().indexOf(E)&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(G){}F||(Date.prototype.toJSON=function(){var a,b=Object(this),c=d(b);if("number"==typeof c&&!isFinite(c))return null;if(a=b.toISOString,"function"!=typeof a)throw new TypeError("toISOString property is not callable");return a.call(b)});var H=1e15===Date.parse("+033658-09-27T01:46:40.000Z"),I=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z")),J=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));(!Date.parse||J||I||!H)&&(Date=function(a){function b(c,d,e,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=1===j&&String(c)===c?new a(b.parse(c)):j>=7?new a(c,d,e,f,g,h,i):j>=6?new a(c,d,e,f,g,h):j>=5?new a(c,d,e,f,g):j>=4?new a(c,d,e,f):j>=3?new a(c,d,e):j>=2?new a(c,d):j>=1?new a(c):new a;return k.constructor=b,k}return a.apply(this,arguments)}function c(a,b){var c=b>1?1:0;return f[b]+Math.floor((a-1969+c)/4)-Math.floor((a-1901+c)/100)+Math.floor((a-1601+c)/400)+365*(a-1970)}function d(b){return Number(new a(1970,0,1,0,0,0,b))}var e=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),f=[0,31,59,90,120,151,181,212,243,273,304,334,365];for(var g in a)b[g]=a[g];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function(b){var f=e.exec(b);if(f){var g,h=Number(f[1]),i=Number(f[2]||1)-1,j=Number(f[3]||1)-1,k=Number(f[4]||0),l=Number(f[5]||0),m=Number(f[6]||0),n=Math.floor(1e3*Number(f[7]||0)),o=Boolean(f[4]&&!f[8]),p="-"===f[9]?1:-1,q=Number(f[10]||0),r=Number(f[11]||0);return(l>0||m>0||n>0?24:25)>k&&60>l&&60>m&&1e3>n&&i>-1&&12>i&&24>q&&60>r&&j>-1&&j=-864e13&&864e13>=g)?g:0/0}return a.parse.apply(this,arguments)},b}(Date)),Date.now||(Date.now=function(){return(new Date).getTime()}),Number.prototype.toFixed&&"0.000"===8e-5.toFixed(3)&&"0"!==.9.toFixed(0)&&"1.25"===1.255.toFixed(2)&&"1000000000000000128"===0xde0b6b3a7640080.toFixed(0)||!function(){function a(a,b){for(var c=-1;++c=0;)c+=h[b],h[b]=Math.floor(c/a),c=c%a*f}function c(){for(var a=g,b="";--a>=0;)if(""!==b||0===a||0!==h[a]){var c=String(h[a]);""===b?b=c:b+="0000000".slice(0,7-c.length)+c}return b}function d(a,b,c){return 0===b?c:b%2===1?d(a,b-1,c*a):d(a*a,b/2,c)}function e(a){for(var b=0;a>=4096;)b+=12,a/=4096;for(;a>=2;)b+=1,a/=2;return b}var f,g,h;f=1e7,g=6,h=[0,0,0,0,0,0],Number.prototype.toFixed=function(f){var g,h,i,j,k,l,m,n;if(g=Number(f),g=g!==g?0:Math.floor(g),0>g||g>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(h=Number(this),h!==h)return"NaN";if(-1e21>=h||h>=1e21)return String(h);if(i="",0>h&&(i="-",h=-h),j="0",h>1e-21)if(k=e(h*d(2,69,1))-69,l=0>k?h*d(2,-k,1):h/d(2,k,1),l*=4503599627370496,k=52-k,k>0){for(a(0,l),m=g;m>=7;)a(1e7,0),m-=7;for(a(d(10,m,1),0),m=k-1;m>=23;)b(1<<23),m-=23;b(1<0?(n=j.length,j=g>=n?i+"0.0000000000000000000".slice(0,g-n+2)+j:i+j.slice(0,n-g)+"."+j.slice(n-g)):j=i+j,j}}();var K=String.prototype.split;2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||"".split(/.?/).length||".".split(/()()/).length>1?!function(){var a=void 0===/()??/.exec("")[1];String.prototype.split=function(b,c){var d=this;if(void 0===b&&0===c)return[];if("[object RegExp]"!==Object.prototype.toString.call(b))return K.apply(this,arguments);var e,f,g,h,i=[],j=(b.ignoreCase?"i":"")+(b.multiline?"m":"")+(b.extended?"x":"")+(b.sticky?"y":""),k=0;for(b=new RegExp(b.source,j+"g"),d+="",a||(e=new RegExp("^"+b.source+"$(?!\\s)",j)),c=void 0===c?-1>>>0:c>>>0;(f=b.exec(d))&&(g=f.index+f[0].length,!(g>k&&(i.push(d.slice(k,f.index)),!a&&f.length>1&&f[0].replace(e,function(){for(var a=1;a1&&f.index=c)));)b.lastIndex===f.index&&b.lastIndex++;return k===d.length?(h||!b.test(""))&&i.push(""):i.push(d.slice(k)),i.length>c?i.slice(0,c):i}}():"0".split(void 0,0).length&&(String.prototype.split=function(a,b){return void 0===a&&0===b?[]:K.apply(this,arguments)});var L=String.prototype.replace,M=function(){var a=[];return"x".replace(/x(.)?/g,function(b,c){a.push(c)}),1===a.length&&"undefined"==typeof a[0]}();if(M||(String.prototype.replace=function(a,b){var c=l(b),d=m(a)&&/\)[*?]/.test(a.source);if(c&&d){var e=function(c){var d=arguments.length,e=a.lastIndex;a.lastIndex=0;var f=a.exec(c);return a.lastIndex=e,f.push(arguments[d-2],arguments[d-1]),b.apply(this,f)};return L.call(this,a,e)}return L.apply(this,arguments)}),"".substr&&"b"!=="0b".substr(-1)){var N=String.prototype.substr;String.prototype.substr=function(a,b){return N.call(this,0>a&&(a=this.length+a)<0?0:a,b)}}var O=" \n\f\r \u2028\u2029",P="";if(!String.prototype.trim||O.trim()||!P.trim()){O="["+O+"]";var Q=new RegExp("^"+O+O+"*"),R=new RegExp(O+O+"*$");String.prototype.trim=function(){if(void 0===this||null===this)throw new TypeError("can't convert "+this+" to object");return String(this).replace(Q,"").replace(R,"")}}(8!==parseInt(O+"08")||22!==parseInt(O+"0x16"))&&(parseInt=function(a){var b=/^0[xX]/;return function(c,d){return c=String(c).trim(),Number(d)||(d=b.test(c)?16:10),a(c,d)}}(parseInt));var S=function(a){if(null==a)throw new TypeError("can't convert "+a+" to object");return Object(a)}}),function(){function a(b,d){function f(a){if(f[a]!==q)return f[a];var b;if("bug-string-char-index"==a)b="a"!="a"[0];else if("json"==a)b=f("json-stringify")&&f("json-parse");else{var c;if("json-stringify"==a){b=d.stringify;var e="function"==typeof b&&s;if(e){(c=function(){return 1}).toJSON=c;try{e="0"===b(0)&&"0"===b(new g)&&'""'==b(new h)&&b(r)===q&&b(q)===q&&b()===q&&"1"===b(c)&&"[1]"==b([c])&&"[null]"==b([q])&&"null"==b(null)&&"[null,null,null]"==b([q,r,null])&&'{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}'==b({a:[c,!0,!1,null,"\x00\b\n\f\r "]})&&"1"===b(null,c)&&"[\n 1,\n 2\n]"==b([1,2],null,1)&&'"-271821-04-20T00:00:00.000Z"'==b(new j(-864e13))&&'"+275760-09-13T00:00:00.000Z"'==b(new j(864e13))&&'"-000001-01-01T00:00:00.000Z"'==b(new j(-621987552e5))&&'"1969-12-31T23:59:59.999Z"'==b(new j(-1))}catch(i){e=!1}}b=e}if("json-parse"==a){if(b=d.parse,"function"==typeof b)try{if(0===b("0")&&!b(!1)){c=b('{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}');var k=5==c.a.length&&1===c.a[0];if(k){try{k=!b('" "')}catch(l){}if(k)try{k=1!==b("01")}catch(m){}if(k)try{k=1!==b("1.")}catch(n){}}}}catch(o){k=!1}b=k}}return f[a]=!!b}b||(b=e.Object()),d||(d=e.Object());var g=b.Number||e.Number,h=b.String||e.String,i=b.Object||e.Object,j=b.Date||e.Date,k=b.SyntaxError||e.SyntaxError,l=b.TypeError||e.TypeError,m=b.Math||e.Math,n=b.JSON||e.JSON;"object"==typeof n&&n&&(d.stringify=n.stringify,d.parse=n.parse);var o,p,q,i=i.prototype,r=i.toString,s=new j(-0xc782b5b800cec);try{s=-109252==s.getUTCFullYear()&&0===s.getUTCMonth()&&1===s.getUTCDate()&&10==s.getUTCHours()&&37==s.getUTCMinutes()&&6==s.getUTCSeconds()&&708==s.getUTCMilliseconds()}catch(t){}if(!f("json")){var u=f("bug-string-char-index");if(!s)var v=m.floor,w=[0,31,59,90,120,151,181,212,243,273,304,334],x=function(a,b){return w[b]+365*(a-1970)+v((a-1969+(b=+(b>1)))/4)-v((a-1901+b)/100)+v((a-1601+b)/400)};if((o=i.hasOwnProperty)||(o=function(a){var b,c={};return(c.__proto__=null,c.__proto__={toString:1},c).toString!=r?o=function(a){var b=this.__proto__;return a=a in(this.__proto__=null,this),this.__proto__=b,a}:(b=c.constructor,o=function(a){var c=(this.constructor||b).prototype;return a in this&&!(a in c&&this[a]===c[a])}),c=null,o.call(this,a)}),p=function(a,b){var d,e,f,g=0;(d=function(){this.valueOf=0}).prototype.valueOf=0,e=new d;for(f in e)o.call(e,f)&&g++;return d=e=null,g?p=2==g?function(a,b){var c,d={},e="[object Function]"==r.call(a);for(c in a)e&&"prototype"==c||o.call(d,c)||!(d[c]=1)||!o.call(a,c)||b(c)}:function(a,b){var c,d,e="[object Function]"==r.call(a);for(c in a)e&&"prototype"==c||!o.call(a,c)||(d="constructor"===c)||b(c);(d||o.call(a,c="constructor"))&&b(c)}:(e="valueOf toString toLocaleString propertyIsEnumerable isPrototypeOf hasOwnProperty constructor".split(" "),p=function(a,b){var d,f="[object Function]"==r.call(a),g=!f&&"function"!=typeof a.constructor&&c[typeof a.hasOwnProperty]&&a.hasOwnProperty||o;for(d in a)f&&"prototype"==d||!g.call(a,d)||b(d);for(f=e.length;d=e[--f];g.call(a,d)&&b(d));}),p(a,b)},!f("json-stringify")){var y={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"},z=function(a,b){return("000000"+(b||0)).slice(-a)},A=function(a){for(var b='"',c=0,d=a.length,e=!u||d>10,f=e&&(u?a.split(""):a);d>c;c++){var g=a.charCodeAt(c);switch(g){case 8:case 9:case 10:case 12:case 13:case 34:case 92:b+=y[g];break;default:if(32>g){b+="\\u00"+z(2,g.toString(16));break}b+=e?f[c]:a.charAt(c)}}return b+'"'},B=function(a,b,c,d,e,f,g){var h,i,j,k,m,n,s,t,u;try{h=b[a]}catch(w){}if("object"==typeof h&&h)if(i=r.call(h),"[object Date]"!=i||o.call(h,"toJSON"))"function"==typeof h.toJSON&&("[object Number]"!=i&&"[object String]"!=i&&"[object Array]"!=i||o.call(h,"toJSON"))&&(h=h.toJSON(a));else if(h>-1/0&&1/0>h){if(x){for(k=v(h/864e5),i=v(k/365.2425)+1970-1;x(i+1,0)<=k;i++);for(j=v((k-x(i,0))/30.42);x(i,j+1)<=k;j++);k=1+k-x(i,j),m=(h%864e5+864e5)%864e5,n=v(m/36e5)%24,s=v(m/6e4)%60,t=v(m/1e3)%60,m%=1e3}else i=h.getUTCFullYear(),j=h.getUTCMonth(),k=h.getUTCDate(),n=h.getUTCHours(),s=h.getUTCMinutes(),t=h.getUTCSeconds(),m=h.getUTCMilliseconds();h=(0>=i||i>=1e4?(0>i?"-":"+")+z(6,0>i?-i:i):z(4,i))+"-"+z(2,j+1)+"-"+z(2,k)+"T"+z(2,n)+":"+z(2,s)+":"+z(2,t)+"."+z(3,m)+"Z"}else h=null;if(c&&(h=c.call(b,a,h)),null===h)return"null";if(i=r.call(h),"[object Boolean]"==i)return""+h;if("[object Number]"==i)return h>-1/0&&1/0>h?""+h:"null";if("[object String]"==i)return A(""+h);if("object"==typeof h){for(a=g.length;a--;)if(g[a]===h)throw l();if(g.push(h),u=[],b=f,f+=e,"[object Array]"==i){for(j=0,a=h.length;a>j;j++)i=B(j,h,c,d,e,f,g),u.push(i===q?"null":i);a=u.length?e?"[\n"+f+u.join(",\n"+f)+"\n"+b+"]":"["+u.join(",")+"]":"[]"}else p(d||h,function(a){var b=B(a,h,c,d,e,f,g);b!==q&&u.push(A(a)+":"+(e?" ":"")+b)}),a=u.length?e?"{\n"+f+u.join(",\n"+f)+"\n"+b+"}":"{"+u.join(",")+"}":"{}";return g.pop(),a}};d.stringify=function(a,b,d){var e,f,g,h;if(c[typeof b]&&b)if("[object Function]"==(h=r.call(b)))f=b;else if("[object Array]"==h){g={};for(var i,j=0,k=b.length;k>j;i=b[j++],h=r.call(i),("[object String]"==h||"[object Number]"==h)&&(g[i]=1));}if(d)if("[object Number]"==(h=r.call(d))){if(0<(d-=d%1))for(e="",d>10&&(d=10);e.length=d.length?d:d.slice(0,10));return B("",(i={},i[""]=a,i),f,g,e,"",[])}}if(!f("json-parse")){var C,D,E=h.fromCharCode,F={92:"\\",34:'"',47:"/",98:"\b",116:" ",110:"\n",102:"\f",114:"\r"},G=function(){throw C=D=null,k()},H=function(){for(var a,b,c,d,e,f=D,g=f.length;g>C;)switch(e=f.charCodeAt(C)){case 9:case 10:case 13:case 32:C++;break;case 123:case 125:case 91:case 93:case 58:case 44:return a=u?f.charAt(C):f[C],C++,a;case 34:for(a="@",C++;g>C;)if(e=f.charCodeAt(C),32>e)G();else if(92==e)switch(e=f.charCodeAt(++C)){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:a+=F[e],C++;break;case 117:for(b=++C,c=C+4;c>C;C++)e=f.charCodeAt(C),e>=48&&57>=e||e>=97&&102>=e||e>=65&&70>=e||G();a+=E("0x"+f.slice(b,C));break;default:G()}else{if(34==e)break;for(e=f.charCodeAt(C),b=C;e>=32&&92!=e&&34!=e;)e=f.charCodeAt(++C);a+=f.slice(b,C)}if(34==f.charCodeAt(C))return C++,a;G();default:if(b=C,45==e&&(d=!0,e=f.charCodeAt(++C)),e>=48&&57>=e){for(48==e&&(e=f.charCodeAt(C+1),e>=48&&57>=e)&&G();g>C&&(e=f.charCodeAt(C),e>=48&&57>=e);C++);if(46==f.charCodeAt(C)){for(c=++C;g>c&&(e=f.charCodeAt(c),e>=48&&57>=e);c++);c==C&&G(),C=c}if(e=f.charCodeAt(C),101==e||69==e){for(e=f.charCodeAt(++C),43!=e&&45!=e||C++,c=C;g>c&&(e=f.charCodeAt(c),e>=48&&57>=e);c++);c==C&&G(),C=c}return+f.slice(b,C)}if(d&&G(),"true"==f.slice(C,C+4))return C+=4,!0;if("false"==f.slice(C,C+5))return C+=5,!1;if("null"==f.slice(C,C+4))return C+=4,null;G()}return"$"},I=function(a){var b,c;if("$"==a&&G(),"string"==typeof a){if("@"==(u?a.charAt(0):a[0]))return a.slice(1);if("["==a){for(b=[];a=H(),"]"!=a;c||(c=!0))c&&(","==a?(a=H(),"]"==a&&G()):G()),","==a&&G(),b.push(I(a));return b}if("{"==a){for(b={};a=H(),"}"!=a;c||(c=!0))c&&(","==a?(a=H(),"}"==a&&G()):G()),","!=a&&"string"==typeof a&&"@"==(u?a.charAt(0):a[0])&&":"==H()||G(),b[a.slice(1)]=I(H());return b}G()}return a},J=function(a,b,c){c=K(a,b,c),c===q?delete a[b]:a[b]=c},K=function(a,b,c){var d,e=a[b];if("object"==typeof e&&e)if("[object Array]"==r.call(e))for(d=e.length;d--;)J(e,d,c);else p(e,function(a){J(e,a,c)});return c.call(a,b,e)};d.parse=function(a,b){var c,d;return C=0,D=""+a,c=I(H()),"$"!=H()&&G(),C=D=null,b&&"[object Function]"==r.call(b)?K((d={},d[""]=c,d),"",b):c}}}return d.runInContext=a,d}var b="function"==typeof define&&define.amd,c={"function":!0,object:!0},d=c[typeof exports]&&exports&&!exports.nodeType&&exports,e=c[typeof window]&&window||this,f=d&&c[typeof module]&&module&&!module.nodeType&&"object"==typeof global&&global;if(!f||f.global!==f&&f.window!==f&&f.self!==f||(e=f),d&&!b)a(e,d);else{var g=e.JSON,h=e.JSON3,i=!1,j=a(e,e.JSON3={noConflict:function(){return i||(i=!0,e.JSON=g,e.JSON3=h,g=h=null),j}});e.JSON={parse:j.parse,stringify:j.stringify}}b&&define(function(){return j})}.call(this);
\ No newline at end of file
diff --git a/public/scripts/scripts.433fc63d.js b/public/scripts/scripts.433fc63d.js
deleted file mode 100644
index 1c08443..0000000
--- a/public/scripts/scripts.433fc63d.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(){"use strict";angular.module("blicblockApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","ui.bootstrap","LocalStorageModule","angularMoment","swipe"]).config(["$routeProvider","localStorageServiceProvider",function(a,b){var c;return b.setPrefix("blicblockJS"),a.when("/",{templateUrl:"views/main.html",controller:"MainCtrl",title:"Play"}).when("/test/:color_count",{templateUrl:"views/main.html",controller:"MainCtrl",title:"Test"}).when("/test/cascade/:cascade_count",{templateUrl:"views/main.html",controller:"MainCtrl",title:"Test Cascades"}).when("/about",{templateUrl:"views/about.html",controller:"AboutCtrl",title:"About"}).when("/help",{templateUrl:"views/help.html",controller:"AboutCtrl",title:"How to Play"}),c={templateUrl:"views/scores.html",controller:"ScoresCtrl",title:"High Scores"},a.when("/scores",c).when("/scores/country/:country_code",c).when("/scores/initials/:initials",c).when("/scores/time/:time",c).when("/scores/order/:order",c).when("/scores/page/:page",c).when("/scores/country/:country_code/page/:page",c).when("/scores/initials/:initials/page/:page",c).when("/scores/time/:time/page/:page",c).when("/scores/order/:order/page/:page",c).when("/scores/country/:country_code/order/:order",c).when("/scores/country/:country_code/order/:order/page/:page",c).when("/scores/country/:country_code/initials/:initials",c).when("/scores/country/:country_code/initials/:initials/page/:page",c).when("/scores/country/:country_code/initials/:initials/order/:order",c).when("/scores/country/:country_code/initials/:initials/order/:order/page/:page",c).when("/scores/country/:country_code/time/:time",c).when("/scores/country/:country_code/time/:time/page/:page",c).when("/scores/country/:country_code/time/:time/order/:order",c).when("/scores/country/:country_code/time/:time/order/:order/page/:page",c).when("/scores/country/:country_code/initials/:initials/time/:time",c).when("/scores/country/:country_code/initials/:initials/time/:time/page/:page",c).when("/scores/country/:country_code/initials/:initials/time/:time/order/:order",c).when("/scores/country/:country_code/initials/:initials/time/:time/order/:order/page/:page",c).when("/scores/initials/:initials/order/:order",c).when("/scores/initials/:initials/order/:order/page/:page",c).when("/scores/initials/:initials/time/:time",c).when("/scores/initials/:initials/time/:time/page/:page",c).when("/scores/initials/:initials/time/:time/order/:order",c).when("/scores/initials/:initials/time/:time/order/:order/page/:page",c).when("/scores/time/:time/order/:order",c).when("/scores/time/:time/order/:order/page/:page",c),a.otherwise({redirectTo:"/"})}]).filter("reverse",function(){return function(a){return a.slice().reverse()}}).filter("range",function(){return function(a,b){var c,d;for(b=parseInt(b,10),c=d=0;b>=0?b>d:d>b;c=b>=0?++d:--d)a.push(c);return a}}).run(["$location","$rootScope",function(a,b){return b.$on("$routeChangeSuccess",function(a,c){return c.hasOwnProperty("$$route")?(b.collapse.nav=!0,b.title=c.$$route.title):void 0})}])}).call(this),function(){var a;a=function(){function a(a){this.color=a.color,this.x=a.x,this.y=a.y,this.locked="undefined"==typeof a.locked?!1:a.locked,this.active="undefined"==typeof a.active?!0:a.active,this.sliding=!1,this.plummetting=!1,this.highlight=!1,this.id="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b,c;return b=16*Math.random()|0,c="x"===a?b:3&b|8,c.toString(16)})}return a}(),("undefined"!=typeof exports&&null!==exports?exports:this).Block=a}.call(this),function(){"use strict";angular.module("blicblockApp").directive("ngLeft",function(){return function(a,b,c){var d;return d=void 0,b.bind("keydown keypress",function(b){return $(b.target).is("input")||!b.which||d&&d.which===b.which?void 0:(d=b,37===b.which||"a"===String.fromCharCode(b.which)?(a.$apply(function(){return a.$eval(c.ngLeft)}),b.preventDefault()):void 0)}),b.bind("keyup",function(){return d=void 0})}})}.call(this),function(){"use strict";angular.module("blicblockApp").directive("ngRight",function(){return function(a,b,c){var d;return d=void 0,b.bind("keydown keypress",function(b){return $(b.target).is("input")||!b.which||d&&d.which===b.which?void 0:(d=b,39===b.which||"d"===String.fromCharCode(b.which)?(a.$apply(function(){return a.$eval(c.ngRight)}),b.preventDefault()):void 0)}),b.bind("keyup",function(){return d=void 0})}})}.call(this),function(){"use strict";angular.module("blicblockApp").directive("ngDown",function(){return function(a,b,c){return b.bind("keydown keypress",function(b){return!$(b.target).is("input")&&b.which&&(40===b.which||"s"===String.fromCharCode(b.which))?(a.$apply(function(){return a.$eval(c.ngDown)}),b.preventDefault()):void 0})}})}.call(this),function(){"use strict";angular.module("blicblockApp").directive("ngSpace",function(){return function(a,b,c){return b.bind("keydown keypress",function(b){return b.which&&32===b.which?(a.$apply(function(){return a.$eval(c.ngSpace)}),b.preventDefault()):void 0})}})}.call(this),function(){"use strict";angular.module("blicblockApp").directive("ngTap",function(){return{link:function(a,b,c){var d;return d=!1,b.bind("touchstart",function(){return b.addClass("active"),d=!0,!0}),b.bind("touchmove",function(){return b.removeClass("active"),d=!1,!0}),b.bind("touchend",function(){return b.removeClass("active"),d&&a.$apply(c.ngTap,b),!0})}}})}.call(this),function(){"use strict";angular.module("blicblockApp").service("Config",function(){var a;return new(a=function(){function a(){this.storage_keys={high_score:"high_score",initials:"initials"}}return a}())})}.call(this),function(){"use strict";angular.module("blicblockApp").service("Tetromino",["$rootScope","$interval","$timeout",function(a,b,c){var d;return new(d=function(){function a(){this.blocks=[],this.upcoming=[],this.colors=["magenta","orange","yellow","green","blue","white"],this.info={cols:5,rows:7,score_value:1e3,checking:!1,in_progress:!0,plummetting_block:!1,sliding_block:!1,game_over:!1,current_score:0,tick_length_decrement_pct:.09,tick_length:1200,level:1,test_mode:!1,submitted_score:!1},this.info.middle_col_idx=(this.info.cols-1)/2}return a.prototype.remove_all_blocks=function(){var a,b;for(a=this.blocks.length-1,b=[];a>=0;)this.blocks.splice(a,1),b.push(a--);return b},a.prototype.add_locked_block=function(a,b,c){return this.blocks.push(new Block({color:a,x:b,y:c,locked:!0,active:!1}))},a.prototype.setup_cascade=function(){return this.info.in_progress=!1,this.remove_all_blocks()},a.prototype.setup_one_cascade=function(){var a,b,c;return this.setup_cascade(),c=this.info.rows-1,a=this.colors[0],b=this.colors[1],this.add_locked_block(a,c,0),this.add_locked_block(a,c,1),this.add_locked_block(a,c,2),this.add_locked_block(b,c-1,0),this.add_locked_block(b,c-1,1),this.add_locked_block(b,c-1,2),this.add_locked_block(a,c-2,0),this.upcoming[0]=new Block({color:b}),this.info.in_progress=!0},a.prototype.setup_two_cascades=function(){var a,b;return this.setup_one_cascade(),a=this.colors[2],b=this.info.rows-1,this.add_locked_block(a,b-4,0),this.add_locked_block(a,b-3,0),this.add_locked_block(a,b-5,0),this.add_locked_block(a,b-2,1)},a.prototype.setup_three_cascades=function(){var a,b;return this.setup_two_cascades(),a=this.colors[3],b=this.info.rows-1,this.add_locked_block(a,b-6,0),this.add_locked_block(a,b-3,1),this.add_locked_block(a,b-4,1),this.add_locked_block(a,b-5,1)},a.prototype.setup_four_cascades=function(){var a,b,c,d;return this.setup_cascade(),d=this.info.rows-1,c=this.info.cols-1,a=this.colors[0],b=this.colors[1],this.add_locked_block(a,d,c),this.add_locked_block(b,d,c-1),this.add_locked_block(b,d,c-2),this.add_locked_block(b,d,c-3),this.add_locked_block(b,d-1,c),this.add_locked_block(a,d-1,c-1),this.add_locked_block(a,d-1,c-2),this.add_locked_block(a,d-1,c-3),this.add_locked_block(a,d-2,c),this.add_locked_block(b,d-2,c-1),this.add_locked_block(b,d-2,c-2),this.add_locked_block(b,d-2,c-3),this.add_locked_block(b,d-3,c),this.add_locked_block(a,d-3,c-1),this.add_locked_block(a,d-3,c-2),this.add_locked_block(a,d-3,c-3),this.add_locked_block(a,d-4,c),this.add_locked_block(b,d-4,c-1),this.add_locked_block(b,d-4,c-2),this.add_locked_block(b,d-4,c-3),this.upcoming[0]=new Block({color:b}),this.info.in_progress=!0},a.prototype.get_active_block=function(){return this.blocks.filter(function(a){return a.active})[0]},a.prototype.get_middle_column_blocks=function(){return this.blocks.filter(function(a){return function(b){return b.y===a.info.middle_col_idx}}(this))},a.prototype.check_for_tetrominos=function(){var a,b,c,d;if(this.info.in_progress&&!this.info.checking){for(this.info.checking=!0,d=this.blocks,b=0,c=d.length;c>b;b++)a=d[b],a&&a.locked&&!a.active&&(this.check_for_straight_tetromino(a),this.check_for_square_tetromino(a),this.check_for_l_tetromino(a),this.check_for_z_tetromino(a),this.check_for_t_tetromino(a));return this.info.checking=!1}},a.prototype.get_closest_block_to_left=function(a,b){var c;return c=this.blocks.filter(function(c){return c.x===a&&c.yb.y?1:0}),c[c.length-1]},a.prototype.get_closest_block_to_right=function(a,b){var c;return c=this.blocks.filter(function(c){return c.x===a&&c.y>b}),c.sort(function(a,b){return a.yb.y?1:0}),c[0]},a.prototype.get_closest_block_below=function(a,b){var c;return c=this.blocks.filter(function(c){return c.x>a&&c.y===b}),c.sort(function(a,b){return a.xb.x?1:0}),c[0]},a.prototype.is_block_directly_below=function(a,b){return this.blocks.filter(function(c){return c.x===a+1&&c.y===b})[0]},a.prototype.plummet_block=function(a,c,d){var e,f;return a.x===c?void(d&&d()):(f=void 0,e=function(e){return function(){return a.plummetting=!0,e.info.plummetting_block=!0,a.xc;c++)b=a[c],e.push(b.x);return e}(),f=function(){var c,d,e;for(e=[],c=0,d=a.length;d>c;c++)b=a[c],e.push(b.y);return e}(),c=Math.max.apply(Math,e),d=this.blocks.filter(function(a){return a.x-1}),d.sort(function(a,b){return a.xb.x?-1:0}),d},a.prototype.highlight=function(a){return a.highlight=!0,c(function(){return a.highlight=!1},.21*this.info.tick_length)},a.prototype.drop_blocks=function(){var a,b,c,d,e,f;if(this.info.in_progress){for(b=this.info.rows-1,e=this.blocks,f=[],c=0,d=e.length;d>c;c++)a=e[c],a&&(a.sliding||((a.active||!a.locked)&&(a.x===b&&(a.locked=!0,a.active=!1,this.on_block_land(a)),this.is_block_directly_below(a.x,a.y)&&(a.locked=!0,a.active=!1,this.on_block_land(a))),a.locked||f.push(a.x++)));return f}},a.prototype.on_block_land=function(a){return this.highlight(a),this.check_for_tetrominos()},a.prototype.increment_level_if_necessary=function(){return this.info.current_score%4e3===0?this.info.level++:void 0},a.prototype.plummet_blocks=function(a,b){var c,d,e;return"undefined"==typeof b&&(b=0),c=a[b],d=this.get_closest_block_below(c.x,c.y),e=d?d.x-1:this.info.rows-1,this.plummet_block(c,e,function(c){return function(){return b=0;)b.indexOf(this.blocks[c].id)>-1&&this.blocks.splice(c,1),c--;return this.info.current_score+=this.info.score_value,this.increment_level_if_necessary(),d=this.blocks_on_top(a),d=d.filter(function(a){return!a.active}),d.length>0&&this.plummet_blocks(d),this.check_for_tetrominos()}},a.prototype.lookup=function(a,b,c){return a>=this.info.rows||b>=this.info.cols?void 0:this.blocks.filter(function(d){return d.x===a&&d.y===b&&d.color===c})[0]},a.prototype.check_for_straight_tetromino=function(a){return this.check_for_straight_hor_tetromino(a),this.check_for_straight_ver_tetromino(a)},a.prototype.check_for_straight_hor_tetromino=function(a){var b,c,d,e,f,g;return g=a.y,f=a.x,e=a.color,b=this.lookup(f,g+1,e),b&&(c=this.lookup(f,g+2,e),c&&(d=this.lookup(f,g+3,e)))?this.remove_blocks([a,b,c,d]):void 0},a.prototype.check_for_straight_ver_tetromino=function(a){var b,c,d,e,f,g;return f=a.x,g=a.y,e=a.color,b=this.lookup(f+1,g,e),b&&(c=this.lookup(f+2,g,e),c&&(d=this.lookup(f+3,g,e)))?this.remove_blocks([a,b,c,d]):void 0},a.prototype.check_for_square_tetromino=function(a){var b,c,d,e,f,g;return f=a.x,g=a.y,e=a.color,b=this.lookup(f,g+1,e),b&&(c=this.lookup(f+1,g,e),c&&(d=this.lookup(f+1,g+1,e)))?this.remove_blocks([a,b,c,d]):void 0},a.prototype.check_for_l_tetromino=function(a){return this.check_for_left_l_tetromino(a),this.check_for_right_l_tetromino(a)},a.prototype.check_for_left_l_tetromino=function(a){var b,c,d,e,f,g;if(f=a.x,g=a.y,e=a.color,b=this.lookup(f+1,g,e)){if(c=this.lookup(f+2,g,e)){if(d=this.lookup(f+2,g-1,e))return this.remove_blocks([a,b,c,d]);if(d=this.lookup(f,g+1,e),!d)return;return this.remove_blocks([a,b,c,d])}if(c=this.lookup(f+1,g+1,e)){if(d=this.lookup(f+1,g+2,e),!d)return;return this.remove_blocks([a,b,c,d])}if((c=this.lookup(f,g-1,e))&&(d=this.lookup(f,g-2,e)))return this.remove_blocks([a,b,c,d])}},a.prototype.check_for_right_l_tetromino=function(a){var b,c,d,e,f,g;if(f=a.x,g=a.y,e=a.color,b=this.lookup(f+1,g,e)){if(c=this.lookup(f+2,g,e)){if(d=this.lookup(f+2,g+1,e))return this.remove_blocks([a,b,c,d]);if(d=this.lookup(f,g-1,e),!d)return;return this.remove_blocks([a,b,c,d])}if(c=this.lookup(f+1,g-1,e)){if(d=this.lookup(f+1,g-2,e),!d)return;return this.remove_blocks([a,b,c,d])}if((c=this.lookup(f,g+1,e))&&(d=this.lookup(f,g+2,e)))return this.remove_blocks([a,b,c,d])}},a.prototype.check_for_z_tetromino=function(a){var b,c,d,e,f,g;if(f=a.x,g=a.y,e=a.color,b=this.lookup(f+1,g,e)){if(c=this.lookup(f,g-1,e)){if(d=this.lookup(f+1,g+1,e),!d)return;return this.remove_blocks([a,b,c,d])}if(c=this.lookup(f,g+1,e)){if(d=this.lookup(f+1,g-1,e),!d)return;return this.remove_blocks([a,b,c,d])}if(c=this.lookup(f+1,g+1,e)){if(d=this.lookup(f+2,g+1,e),!d)return;return this.remove_blocks([a,b,c,d])}if((c=this.lookup(f+1,g-1,e))&&(d=this.lookup(f+2,g-1,e)))return this.remove_blocks([a,b,c,d])}},a.prototype.check_for_t_tetromino=function(a){var b,c,d,e,f,g;if(f=a.x,g=a.y,e=a.color,b=this.lookup(f+1,g,e)){if(c=this.lookup(f+2,g,e)){if(d=this.lookup(f+1,g+1,e))return this.remove_blocks([a,b,c,d]);if(d=this.lookup(f+1,g-1,e),!d)return;return this.remove_blocks([a,b,c,d])}if(c=this.lookup(f+1,g-1,e)){if(d=this.lookup(f+1,g+1,e),!d)return;return this.remove_blocks([a,b,c,d])}if((c=this.lookup(f,g-1,e))&&(d=this.lookup(f,g+1,e)))return this.remove_blocks([a,b,c,d])}},a}())}])}.call(this),function(){"use strict";angular.module("blicblockApp").factory("Country",["$resource",function(a){return a("/api/scores/countries.json",{},{})}])}.call(this),function(){"use strict";angular.module("blicblockApp").factory("Score",["$resource",function(a){return a("/api/scores/:id.json",{},{query:{method:"GET",isArray:!1},update:{method:"PUT"}})}])}.call(this),function(){"use strict";angular.module("blicblockApp").service("Notification",["$timeout",function(a){var b;return new(b=function(){function b(){this.notices=[],this.errors=[]}return b.prototype.wipe_notices=function(){var a,b,c,d,e;for(d=this.notices,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(this.remove("notice",a.id));return e},b.prototype.wipe_errors=function(){var a,b,c,d,e;for(d=this.errors,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(this.remove("error",a.id));return e},b.prototype.wipe_notifications=function(){return this.wipe_notices(),this.wipe_errors()},b.prototype.remove=function(a,b){var c,d,e,f,g,h,i;if("error"===a){f=this.errors,h=[];for(d in f)c=f[d],c.id===b&&h.push(this.errors.splice(d,1));return h}g=this.notices,i=[];for(d in g)e=g[d],e.id===b&&i.push(this.notices.splice(d,1));return i},b.prototype.error=function(b){var c;if(b)return console.error(b),c=this.errors.length+1,this.errors.push({message:b,id:c}),a(function(a){return function(){return a.remove("error",c)}}(this),3500)},b.prototype.notice=function(b){var c;if(b)return c=this.notices.length+1,this.notices.push({message:b,id:c}),a(function(a){return function(){return a.remove("notice",c)}}(this),3e3)},b}())}])}.call(this),function(){"use strict";angular.module("blicblockApp").controller("NotificationsCtrl",["$scope","$cookieStore","Notification",function(a,b,c){var d;return a.notices=c.notices,a.errors=c.errors,a.remove=function(a,b){return c.remove(a,b)},d=b.get("error"),d?(c.error(d),b.remove("error")):void 0}])}.call(this),function(){"use strict";angular.module("blicblockApp").controller("MainCtrl",["$scope","$window","$timeout","$interval","$routeParams","$rootScope","localStorageService","Config","Tetromino","Score","Notification",function(a,b,c,d,e,f,g,h,i,j,k){var l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;if(a.blocks=i.blocks,a.upcoming=i.upcoming,a.game_info=i.info,a.score_record=new j,a.new_high_score={},r=void 0,a.new_game=function(){return a.score_record=new j,b.location.reload()},e.color_count?(n=parseInt(e.color_count,10),n>i.colors.length&&(n=i.colors.length-1),1>n&&(n=1),o=i.colors.slice(0,n)):(o=i.colors,a.game_info.test_mode&&a.new_game()),u=function(){return o[Math.floor(Math.random()*o.length)]},e.cascade_count){switch(m=parseInt(e.cascade_count,10)){case 1:i.setup_one_cascade();break;case 2:i.setup_two_cascades();break;case 3:i.setup_three_cascades();break;default:i.setup_four_cascades()}a.upcoming.push(new Block({color:u()}))}else for(a.game_info.test_mode&&a.new_game();a.upcoming.length<2;)a.upcoming.push(new Block({color:u()}));return a.game_info.test_mode=!!e.color_count||!!e.cascade_count,v=function(){var b;return a.game_info.test_mode?{value:-1e6,date:new Date(1969,0,1)}:(b=g.get(h.storage_keys.high_score),b?b:{})},a.existing_high_score=v(),l=function(){return angular.isDefined(r)?(d.cancel(r),r=void 0):void 0},x=function(){var b,c;if(!a.game_info.test_mode)return c=g.get(h.storage_keys.high_score),b=a.game_info.current_score,a.score_record.value=b,a.score_record.initials=g.get(h.storage_keys.initials),c&&c.value1&&(a.game_info.tick_length-=a.game_info.tick_length*a.game_info.tick_length_decrement_pct,l()),y()}),a.$on("$locationChangeStart",function(){return a.$emit("pause")}),f.$watch("collapse.nav",function(){return f.collapse.nav?void 0:a.$emit("pause")}),a.capitalize_initials=function(){return a.score_record.initials?a.score_record.initials=a.score_record.initials.toUpperCase():void 0}}])}.call(this),function(){"use strict";angular.module("blicblockApp").controller("AboutCtrl",function(){})}.call(this),function(){"use strict";angular.module("blicblockApp").controller("ScoresCtrl",["$scope","$location","$routeParams","Score","Country",function(a,b,c,d,e){var f,g,h,i;return a.countries=e.query(),i="week",g="",f="",h="value",a.filters={time:c.time||i,initials:c.initials||g,order:c.order||h,country_code:c.country_code||f,page:c.page||1},a.score_results=d.query(a.filters),a.filter=function(){var c,d;return d="/scores",c=a.filters.country_code,c&&c!==f&&(d+="/country/"+c),a.filters.initials!==g&&(d+="/initials/"+a.filters.initials),a.filters.time!==i&&(d+="/time/"+a.filters.time),a.filters.order!==h&&(d+="/order/"+a.filters.order),1!==a.filters.page&&(d+="/page/"+a.filters.page),b.path(d)},a.change_page=function(){return a.filters.page=a.score_results.page,a.filter()}}])}.call(this);
\ No newline at end of file
diff --git a/public/scripts/vendor.667a6f66.js b/public/scripts/vendor.667a6f66.js
deleted file mode 100644
index 011225c..0000000
--- a/public/scripts/vendor.667a6f66.js
+++ /dev/null
@@ -1,12 +0,0 @@
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("")).appendTo(b.documentElement),b=Nb[0].contentDocument,b.write(),b.close(),c=t(a,b),Nb.detach()),Ob[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Rb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qb.test(g)&&Pb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xb.length;e--;)if(b=Xb[e]+c,b in a)return b;return d}function y(a,b,c){var d=Tb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=_.css(a,c+wb[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wb[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wb[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wb[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wb[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Rb(a),g="border-box"===_.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=v(a,b,f),(0>e||null==e)&&(e=a.style[b]),Qb.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=rb.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&xb(d)&&(f[g]=rb.access(d,"olddisplay",u(d.nodeName)))):(e=xb(d),"none"===c&&e||rb.set(d,"olddisplay",e?c:_.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function C(a,b,c,d,e){return new C.prototype.init(a,b,c,d,e)}function D(){return setTimeout(function(){Yb=void 0}),Yb=_.now()}function E(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=wb[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function F(a,b,c){for(var d,e=(cc[b]||[]).concat(cc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function G(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},n=a.style,o=a.nodeType&&xb(a),p=rb.get(a,"fxshow");c.queue||(h=_._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,_.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[n.overflow,n.overflowX,n.overflowY],j=_.css(a,"display"),k="none"===j?rb.get(a,"olddisplay")||u(a.nodeName):j,"inline"===k&&"none"===_.css(a,"float")&&(n.display="inline-block")),c.overflow&&(n.overflow="hidden",l.always(function(){n.overflow=c.overflow[0],n.overflowX=c.overflow[1],n.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],$b.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(o?"hide":"show")){if("show"!==e||!p||void 0===p[d])continue;o=!0}m[d]=p&&p[d]||_.style(a,d)}else j=void 0;if(_.isEmptyObject(m))"inline"===("none"===j?u(a.nodeName):j)&&(n.display=j);else{p?"hidden"in p&&(o=p.hidden):p=rb.access(a,"fxshow",{}),f&&(p.hidden=!o),o?_(a).show():l.done(function(){_(a).hide()}),l.done(function(){var b;rb.remove(a,"fxshow");for(b in m)_.style(a,b,m[b])});for(d in m)g=F(o?p[d]:0,d,l),d in p||(p[d]=g.start,o&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function H(a,b){var c,d,e,f,g;for(c in a)if(d=_.camelCase(c),e=b[d],f=a[c],_.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=_.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function I(a,b,c){var d,e,f=0,g=bc.length,h=_.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Yb||D(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:_.extend({},b),opts:_.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Yb||D(),duration:c.duration,tweens:[],createTween:function(b,c){var d=_.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(H(k,j.opts.specialEasing);g>f;f++)if(d=bc[f].call(j,a,k,j.opts))return d;return _.map(k,F,j),_.isFunction(j.opts.start)&&j.opts.start.call(a,j),_.fx.timer(_.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function J(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(nb)||[];if(_.isFunction(c))for(;d=f[e++];)"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function K(a,b,c,d){function e(h){var i;return f[h]=!0,_.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||g||f[j]?g?!(i=j):void 0:(b.dataTypes.unshift(j),e(j),!1)}),i}var f={},g=a===vc;return e(b.dataTypes[0])||!f["*"]&&e("*")}function L(a,b){var c,d,e=_.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&_.extend(!0,a,d),a}function M(a,b,c){for(var d,e,f,g,h=a.contents,i=a.dataTypes;"*"===i[0];)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function N(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];for(f=k.shift();f;)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}function O(a,b,c,d){var e;if(_.isArray(b))_.each(b,function(b,e){c||zc.test(a)?d(a,e):O(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==_.type(b))d(a,b);else for(e in b)O(a+"["+e+"]",b[e],c,d)}function P(a){return _.isWindow(a)?a:9===a.nodeType&&a.defaultView}var Q=[],R=Q.slice,S=Q.concat,T=Q.push,U=Q.indexOf,V={},W=V.toString,X=V.hasOwnProperty,Y={},Z=a.document,$="2.1.1",_=function(a,b){return new _.fn.init(a,b)},ab=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bb=/^-ms-/,cb=/-([\da-z])/gi,db=function(a,b){return b.toUpperCase()};_.fn=_.prototype={jquery:$,constructor:_,selector:"",length:0,toArray:function(){return R.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:R.call(this)},pushStack:function(a){var b=_.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return _.each(this,a,b)},map:function(a){return this.pushStack(_.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(R.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:T,sort:Q.sort,splice:Q.splice},_.extend=_.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||_.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(_.isPlainObject(d)||(e=_.isArray(d)))?(e?(e=!1,f=c&&_.isArray(c)?c:[]):f=c&&_.isPlainObject(c)?c:{},g[b]=_.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},_.extend({expando:"jQuery"+($+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===_.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!_.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==_.type(a)||a.nodeType||_.isWindow(a)?!1:a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(bb,"ms-").replace(cb,db)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;g>f&&(e=b.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=b.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=b.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),e===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(ab,"")},makeArray:function(a,b){var d=b||[];return null!=a&&(c(Object(a))?_.merge(d,"string"==typeof a?[a]:a):T.call(d,a)),d},inArray:function(a,b,c){return null==b?-1:U.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,d){var e,f=0,g=a.length,h=c(a),i=[];if(h)for(;g>f;f++)e=b(a[f],f,d),null!=e&&i.push(e);else for(f in a)e=b(a[f],f,d),null!=e&&i.push(e);return S.apply([],i)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),_.isFunction(a)?(d=R.call(arguments,2),e=function(){return a.apply(b||this,d.concat(R.call(arguments)))},e.guid=a.guid=a.guid||_.guid++,e):void 0},now:Date.now,support:Y}),_.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){V["[object "+b+"]"]=b.toLowerCase()});var eb=function(a){function b(a,b,c,d){var e,f,g,h,i,j,l,n,o,p;if((b?b.ownerDocument||b:O)!==G&&F(b),b=b||G,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(I&&!d){if(e=sb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&M(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return _.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&v.getElementsByClassName&&b.getElementsByClassName)return _.apply(c,b.getElementsByClassName(g)),c}if(v.qsa&&(!J||!J.test(a))){if(n=l=N,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(j=z(a),(l=b.getAttribute("id"))?n=l.replace(ub,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=j.length;i--;)j[i]=n+m(j[i]);o=tb.test(a)&&k(b.parentNode)||b,p=j.join(",")}if(p)try{return _.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{l||b.removeAttribute("id")}}}return B(a.replace(ib,"$1"),b,c,d)}function c(){function a(c,d){return b.push(c+" ")>w.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function n(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=Q++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[P,f];if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e){if(i=b[N]||(b[N]={}),(h=i[d])&&h[0]===P&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function o(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;f>e;e++)b(a,c[e],d);return d}function q(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function r(a,b,c,e,f,g){return e&&!e[N]&&(e=r(e)),f&&!f[N]&&(f=r(f,g)),d(function(d,g,h,i){var j,k,l,m=[],n=[],o=g.length,r=d||p(b||"*",h.nodeType?[h]:h,[]),s=!a||!d&&b?r:q(r,m,a,h,i),t=c?f||(d?a:o||e)?[]:g:s;if(c&&c(s,t,h,i),e)for(j=q(t,n),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[n[k]]=!(s[n[k]]=l));if(d){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?bb.call(d,l):m[k])>-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return bb.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])k=[n(o(k),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[N]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return r(h>1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ib,"$1"),c,d>h&&s(a.slice(h,d)),e>d&&s(a=a.slice(d)),e>d&&m(a))}k.push(c)}return o(k)}function t(a,c){var e=c.length>0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,ab=Y.slice,bb=Y.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},cb="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",db="[\\x20\\t\\r\\n\\f]",eb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",fb=eb.replace("w","w#"),gb="\\["+db+"*("+eb+")(?:"+db+"*([*^$|!~]?=)"+db+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+fb+"))|)"+db+"*\\]",hb=":("+eb+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+gb+")*)|.*)\\)|)",ib=new RegExp("^"+db+"+|((?:^|[^\\\\])(?:\\\\.)*)"+db+"+$","g"),jb=new RegExp("^"+db+"*,"+db+"*"),kb=new RegExp("^"+db+"*([>+~]|"+db+")"+db+"*"),lb=new RegExp("="+db+"*([^\\]'\"]*?)"+db+"*\\]","g"),mb=new RegExp(hb),nb=new RegExp("^"+fb+"$"),ob={ID:new RegExp("^#("+eb+")"),CLASS:new RegExp("^\\.("+eb+")"),TAG:new RegExp("^("+eb.replace("w","w*")+")"),ATTR:new RegExp("^"+gb),PSEUDO:new RegExp("^"+hb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+db+"*(even|odd|(([+-]|)(\\d*)n|)"+db+"*(?:([+-]|)"+db+"*(\\d+)|))"+db+"*\\)|)","i"),bool:new RegExp("^(?:"+cb+")$","i"),needsContext:new RegExp("^"+db+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+db+"*((?:-\\d)?\\d*)"+db+"*\\)|)(?=[^-]|$)","i")},pb=/^(?:input|select|textarea|button)$/i,qb=/^h\d$/i,rb=/^[^{]+\{\s*\[native \w/,sb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tb=/[+~]/,ub=/'|\\/g,vb=new RegExp("\\\\([\\da-f]{1,6}"+db+"?|("+db+")|.)","ig"),wb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=ab.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(xb){_={apply:Y.length?function(a,b){$.apply(a,ab.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("unload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=rb.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(vb,wb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=v.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&I?b.getElementsByClassName(a):void 0},K=[],J=[],(v.qsa=rb.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+db+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+db+"*(?:value|"+cb+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+db+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=rb.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",hb)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=rb.test(H.compareDocumentPosition),M=b||rb.test(H.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1:D?bb.call(D,a)-bb.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?bb.call(D,a)-bb.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(lb,"='$1']"),!(!v.matchesSelector||!I||K&&K.test(c)||J&&J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:ob,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(vb,wb),a[3]=(a[3]||a[4]||a[5]||"").replace(vb,wb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return ob.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&mb.test(c)&&(b=z(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(vb,wb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+db+")"+a+"("+db+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:c?(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===c?f===d||f.slice(0,d.length+1)===d+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=bb.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ib,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return nb.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(vb,wb).toLowerCase(),function(b){var c;do if(c=I?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return qb.test(a.nodeName)},input:function(a){return pb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[0>c?c+b:c]}),even:j(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:j(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:j(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=0>c?c+b:c;++d2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(vb,wb),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=ob.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(vb,wb),tb.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,tb.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(cb,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=eb,_.expr=eb.selectors,_.expr[":"]=_.expr.pseudos,_.unique=eb.uniqueSort,_.text=eb.getText,_.isXMLDoc=eb.isXML,_.contains=eb.contains;var fb=_.expr.match.needsContext,gb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hb=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;c>b;b++)if(_.contains(e[b],this))return!0
-}));for(b=0;c>b;b++)_.find(a,e[b],d);return d=this.pushStack(c>1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fb.test(a)?_(a):a||[],!1).length}});var ib,jb=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,kb=_.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:jb.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ib).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),gb.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):_.isFunction(a)?"undefined"!=typeof ib.ready?ib.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};kb.prototype=_.fn,ib=_(Z);var lb=/^(?:parents|prev(?:Until|All))/,mb={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(_.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=fb.test(a)||"string"!=typeof a?_(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==typeof a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},function(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(mb[a]||_.unique(e),lb.test(a)&&e.reverse()),this.pushStack(e)}});var nb=/\S+/g,ob={};_.Callbacks=function(a){a="string"==typeof a?ob[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&g>h;h++)if(i[h].apply(f[0],f[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,i&&(j?j.length&&k(j.shift()):b?i=[]:l.disable())},l={add:function(){if(i){var c=i.length;!function f(b){_.each(b,function(b,c){var d=_.type(c);"function"===d?a.unique&&l.has(c)||i.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),d?g=i.length:b&&(e=c,k(b))}return this},remove:function(){return i&&_.each(arguments,function(a,b){for(var c;(c=_.inArray(b,i,c))>-1;)i.splice(c,1),d&&(g>=c&&g--,h>=c&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disable:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?_.extend(a,d):d}},e={};return d.pipe=d.then,_.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);g>e;e++)f[e]&&_.isFunction(f[e].promise)?f[e].promise().done(j(e,d,f)).fail(i.reject).progress(j(e,c,b)):--h;return h||i.resolveWith(d,f),i.promise()}});var pb;_.fn.ready=function(a){return _.ready.promise().done(a),this},_.extend({isReady:!1,readyWait:1,holdReady:function(a){a?_.readyWait++:_.ready(!0)},ready:function(a){(a===!0?--_.readyWait:_.isReady)||(_.isReady=!0,a!==!0&&--_.readyWait>0||(pb.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pb||(pb=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pb.promise(b)},_.ready.promise();var qb=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};_.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType},h.uid=1,h.accepts=_.acceptData,h.prototype={key:function(a){if(!h.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=h.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,_.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(_.isEmptyObject(f))_.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,_.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{_.isArray(b)?d=b.concat(b.map(_.camelCase)):(e=_.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(nb)||[])),c=d.length;for(;c--;)delete g[d[c]]}},hasData:function(a){return!_.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var rb=new h,sb=new h,tb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ub=/([A-Z])/g;_.extend({hasData:function(a){return sb.hasData(a)||rb.hasData(a)},data:function(a,b,c){return sb.access(a,b,c)},removeData:function(a,b){sb.remove(a,b)},_data:function(a,b,c){return rb.access(a,b,c)},_removeData:function(a,b){rb.remove(a,b)}}),_.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=sb.get(f),1===f.nodeType&&!rb.get(f,"hasDataAttrs"))){for(c=g.length;c--;)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=_.camelCase(d.slice(5)),i(f,d,e[d])));rb.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){sb.set(this,a)}):qb(this,function(b){var c,d=_.camelCase(a);if(f&&void 0===b){if(c=sb.get(f,a),void 0!==c)return c;if(c=sb.get(f,d),void 0!==c)return c;if(c=i(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=sb.get(this,d);sb.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&sb.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){sb.remove(this,a)})}}),_.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=rb.get(a,b),c&&(!d||_.isArray(c)?d=rb.access(a,b,_.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return rb.get(a,c)||rb.access(a,c,{empty:_.Callbacks("once memory").add(function(){rb.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var zb="undefined";Y.focusinBubbles="onfocusin"in a;var Ab=/^key/,Bb=/^(?:mouse|pointer|contextmenu)|click/,Cb=/^(?:focusinfocus|focusoutblur)$/,Db=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==zb&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(nb)||[""],j=b.length;j--;)h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=rb.hasData(a)&&rb.get(a);if(q&&(i=q.events)){for(b=(b||"").match(nb)||[""],j=b.length;j--;)if(h=Db.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,rb.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Cb.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Cb.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(rb.get(g,"events")||{})[b.type]&&rb.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(arguments),i=(rb.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)(!a.namespace_re||a.namespace_re.test(f.namespace))&&(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?_(e,this).index(i)>=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<|?\w+;/,Hb=/<(?:script|style|link)/i,Ib=/checked\s*(?:[^=]|=\s*.checked.)/i,Jb=/^$|\/(?:java|ecma)script/i,Kb=/^true\/(.*)/,Lb=/^\s*\s*$/g,Mb={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Mb.optgroup=Mb.option,Mb.tbody=Mb.tfoot=Mb.colgroup=Mb.caption=Mb.thead,Mb.th=Mb.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;e>d;d++)s(f[d],g[d]);if(b)if(c)for(f=f||r(a),g=g||r(h),d=0,e=f.length;e>d;d++)q(f[d],g[d]);else q(a,h);return g=r(h,"script"),g.length>0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;n>m;m++)if(e=a[m],e||0===e)if("object"===_.type(e))_.merge(l,e.nodeType?[e]:e);else if(Gb.test(e)){for(f=f||k.appendChild(b.createElement("div")),g=(Fb.exec(e)||["",""])[1].toLowerCase(),h=Mb[g]||Mb._default,f.innerHTML=h[1]+e.replace(Eb,"<$1>$2>")+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||-1===_.inArray(e,d))&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Jb.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[rb.expando],e&&(b=rb.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);rb.cache[e]&&delete rb.cache[e]}delete sb.cache[c[sb.expando]]}}}),_.fn.extend({text:function(a){return qb(this,function(a){return void 0===a?_.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=m(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qb(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Hb.test(a)&&!Mb[(Fb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Eb,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(_.cleanData(r(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,_.cleanData(r(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=S.apply([],a);var c,d,e,f,g,h,i=0,j=this.length,k=this,l=j-1,m=a[0],p=_.isFunction(m);if(p||j>1&&"string"==typeof m&&!Y.checkClone&&Ib.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;j>i;i++)g=c,i!==l&&(g=_.clone(g,!0,!0),f&&_.merge(e,r(g,"script"))),b.call(this[i],g,i);if(f)for(h=e[e.length-1].ownerDocument,_.map(e,o),i=0;f>i;i++)g=e[i],Jb.test(g.type||"")&&!rb.access(g,"globalEval")&&_.contains(h,g)&&(g.src?_._evalUrl&&_._evalUrl(g.src):_.globalEval(g.textContent.replace(Lb,"")))}return this}}),_.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){_.fn[a]=function(a){for(var c,d=[],e=_(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),_(e[g])[b](c),T.apply(d,c.get());return this.pushStack(d)}});var Nb,Ob={},Pb=/^margin/,Qb=new RegExp("^("+vb+")(?!px)[a-z%]+$","i"),Rb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};!function(){function b(){g.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",g.innerHTML="",e.appendChild(f);var b=a.getComputedStyle(g,null);c="1%"!==b.top,d="4px"===b.width,e.removeChild(f)}var c,d,e=Z.documentElement,f=Z.createElement("div"),g=Z.createElement("div");g.style&&(g.style.backgroundClip="content-box",g.cloneNode(!0).style.backgroundClip="",Y.clearCloneStyle="content-box"===g.style.backgroundClip,f.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",f.appendChild(g),a.getComputedStyle&&_.extend(Y,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return null==d&&b(),d},reliableMarginRight:function(){var b,c=g.appendChild(Z.createElement("div"));return c.style.cssText=g.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",g.style.width="1px",e.appendChild(f),b=!parseFloat(a.getComputedStyle(c,null).marginRight),e.removeChild(f),b}}))}(),_.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Sb=/^(none|table(?!-c[ea]).+)/,Tb=new RegExp("^("+vb+")(.*)$","i"),Ub=new RegExp("^([+-])=("+vb+")","i"),Vb={position:"absolute",visibility:"hidden",display:"block"},Wb={letterSpacing:"0",fontWeight:"400"},Xb=["Webkit","O","Moz","ms"];_.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=v(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=_.camelCase(b),i=a.style;return b=_.cssProps[h]||(_.cssProps[h]=x(i,h)),g=_.cssHooks[b]||_.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ub.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(_.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||_.cssNumber[h]||(c+="px"),Y.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=_.camelCase(b);return b=_.cssProps[h]||(_.cssProps[h]=x(a.style,h)),g=_.cssHooks[b]||_.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=v(a,b,d)),"normal"===e&&b in Wb&&(e=Wb[b]),""===c||c?(f=parseFloat(e),c===!0||_.isNumeric(f)?f||0:e):e}}),_.each(["height","width"],function(a,b){_.cssHooks[b]={get:function(a,c,d){return c?Sb.test(_.css(a,"display"))&&0===a.offsetWidth?_.swap(a,Vb,function(){return A(a,b,d)}):A(a,b,d):void 0},set:function(a,c,d){var e=d&&Rb(a);return y(a,c,d?z(a,b,d,"border-box"===_.css(a,"boxSizing",!1,e),e):0)}}}),_.cssHooks.marginRight=w(Y.reliableMarginRight,function(a,b){return b?_.swap(a,{display:"inline-block"},v,[a,"marginRight"]):void 0}),_.each({margin:"",padding:"",border:"Width"},function(a,b){_.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+wb[d]+b]=f[d]||f[d-2]||f[0];return e}},Pb.test(a)||(_.cssHooks[a+b].set=y)}),_.fn.extend({css:function(a,b){return qb(this,function(a,b,c){var d,e,f={},g=0;if(_.isArray(b)){for(d=Rb(a),e=b.length;e>g;g++)f[b[g]]=_.css(a,b[g],!1,d);return f}return void 0!==c?_.style(a,b,c):_.css(a,b)},a,b,arguments.length>1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xb(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.pos=b=this.options.duration?_.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Yb,Zb,$b=/^(?:toggle|show|hide)$/,_b=new RegExp("^(?:([+-])=|)("+vb+")([a-z%]*)$","i"),ac=/queueHooks$/,bc=[G],cc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_b.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!==f&&+d)&&_b.exec(_.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,_.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],cc[c]=cc[c]||[],cc[c].unshift(b)},prefilter:function(a,b){b?bc.unshift(a):bc.push(a)}}),_.speed=function(a,b,c){var d=a&&"object"==typeof a?_.extend({},a):{complete:c||!c&&b||_.isFunction(a)&&a,duration:a,easing:c&&b||b&&!_.isFunction(b)&&b};return d.duration=_.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in _.fx.speeds?_.fx.speeds[d.duration]:_.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){_.isFunction(d.old)&&d.old.call(this),d.queue&&_.dequeue(this,d.queue)},d},_.fn.extend({fadeTo:function(a,b,c,d){return this.filter(xb).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=_.isEmptyObject(a),f=_.speed(b,c,d),g=function(){var b=I(this,_.extend({},a),f);(e||rb.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=_.timers,g=rb.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ac.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&_.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=rb.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=_.timers,g=d?d.length:0;for(c.finish=!0,_.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),_.each(["toggle","show","hide"],function(a,b){var c=_.fn[b];
-_.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(E(b,!0),a,d,e)}}),_.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){_.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),_.timers=[],_.fx.tick=function(){var a,b=0,c=_.timers;for(Yb=_.now();b1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===zb?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?ec:dc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(nb);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),ec={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fc[b]||_.find.attr;fc[b]=function(a,b,d){var e,f;return d||(f=fc[b],fc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fc[b]=f),e}});var gc=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qb(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||gc.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hc=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):" ")){for(f=0;e=b[f++];)d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=_.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(nb)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(hc," "):"")){for(f=0;e=b[f++];)for(;d.indexOf(" "+e+" ")>=0;)d=d.replace(" "+e+" "," ");g=a?_.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(_.isFunction(a)?function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(nb)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else(c===zb||"boolean"===c)&&(this.className&&rb.set(this,"__className__",this.className),this.className=this.className||a===!1?"":rb.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(hc," ").indexOf(b)>=0)return!0;return!1}});var ic=/\r/g;_.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ic,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(Y.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&_.nodeName(c.parentNode,"optgroup"))){if(b=_(c).val(),f)return b;g.push(b)}return g},set:function(a,b){for(var c,d,e=a.options,f=_.makeArray(b),g=e.length;g--;)d=e[g],(d.selected=_.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){return _.isArray(b)?a.checked=_.inArray(_(a).val(),b)>=0:void 0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.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 contextmenu".split(" "),function(a,b){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var jc=_.now(),kc=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&_.error("Invalid XML: "+a),b};var lc,mc,nc=/#.*$/,oc=/([?&])_=[^&]*/,pc=/^(.*?):[ \t]*([^\r\n]*)$/gm,qc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rc=/^(?:GET|HEAD)$/,sc=/^\/\//,tc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,uc={},vc={},wc="*/".concat("*");try{mc=location.href}catch(xc){mc=Z.createElement("a"),mc.href="",mc=mc.href}lc=tc.exec(mc.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mc,type:"GET",isLocal:qc.test(lc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(uc),ajaxTransport:J(vc),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&300>a||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,(a||!w)&&(w="error",0>a&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pc.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url||mc)+"").replace(nc,"").replace(sc,lc[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(nb)||[""],null==l.crossDomain&&(i=tc.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lc[1]&&i[2]===lc[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lc[3]||("http:"===lc[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(uc,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rc.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kc.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=oc.test(e)?e.replace(oc,"$1_="+jc++):e+(kc.test(e)?"&":"?")+"_="+jc++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentType),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wc+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vc,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(w){if(!(2>t))throw w;c(-1,w)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(_.isFunction(a)?function(b){_(this).wrapInner(a.call(this,b))}:function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var yc=/%20/g,zc=/\[\]$/,Ac=/\r?\n/g,Bc=/^(?:submit|button|image|reset|file)$/i,Cc=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(yc,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Cc.test(this.nodeName)&&!Bc.test(a)&&(this.checked||!yb.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(Ac,"\r\n")}}):{name:b.name,value:c.replace(Ac,"\r\n")}}).get()}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Dc=0,Ec={},Fc={0:200,1223:204},Gc=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Ec)Ec[a]()}),Y.cors=!!Gc&&"withCredentials"in Gc,Y.ajax=Gc=!!Gc,_.ajaxTransport(function(a){var b;return Y.cors||Gc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Dc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Ec[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Fc[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Ec[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_("
diff --git a/public/views/help.html b/public/views/help.html
deleted file mode 100644
index b8f1444..0000000
--- a/public/views/help.html
+++ /dev/null
@@ -1 +0,0 @@
- How to Play
Create tetrominos to score points!
Blocks in six different colors —pink, orange, yellow green, blue, and white—will fall from the top.
Swipe left or right on the game board to position a block as it falls.
Swipe down on the game board to drop a block immediately.
Tap outside the game board to pause and resume the game.
The game ends when there is no more room for blocks to fall.
Possible tetrominos:
\ No newline at end of file
diff --git a/public/views/main.html b/public/views/main.html
deleted file mode 100644
index 649cd77..0000000
--- a/public/views/main.html
+++ /dev/null
@@ -1 +0,0 @@
- {{game_info.current_score}} {{game_info.level}}
\ No newline at end of file
diff --git a/public/views/scores.html b/public/views/scores.html
deleted file mode 100644
index ec4756d..0000000
--- a/public/views/scores.html
+++ /dev/null
@@ -1 +0,0 @@
-
Rank Score Name {{score.rank}} {{score.value}} {{score.initials}}
\ No newline at end of file
diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb
new file mode 100644
index 0000000..e672b25
--- /dev/null
+++ b/spec/controllers/home_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe HomeController, type: :controller do
+
+end
diff --git a/spec/javascripts/helpers/react_helper.js b/spec/javascripts/helpers/react_helper.js
new file mode 100644
index 0000000..751354b
--- /dev/null
+++ b/spec/javascripts/helpers/react_helper.js
@@ -0,0 +1 @@
+window.TestUtils = React.addons.TestUtils
diff --git a/spec/javascripts/models/tetromino_checker_spec.es6.js b/spec/javascripts/models/tetromino_checker_spec.es6.js
new file mode 100644
index 0000000..6a1dfcc
--- /dev/null
+++ b/spec/javascripts/models/tetromino_checker_spec.es6.js
@@ -0,0 +1,200 @@
+describe('TetrominoChecker', () => {
+ it('starts with no tetromino blocks', () => {
+ const checker = new TetrominoChecker([], 0)
+ expect(checker.tetromino).toEqual([])
+ })
+
+ it('returns false when no blocks are given', () => {
+ const checker = new TetrominoChecker([], 0)
+ expect(checker.check()).toEqual(false)
+ })
+
+ it('filters out blocks of a different color', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 1, color: 'magenta' })
+ const b3 = new Block({ x: 0, y: 2, color: 'white' })
+ const b4 = new Block({ x: 0, y: 3, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.blocks.length).toEqual(1)
+ expect(checker.blocks[0].id).toEqual(b4.id)
+ })
+
+ // 1***
+ it('returns true when straight horizontal tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b3 = new Block({ x: 0, y: 2, color: 'blue' })
+ const b4 = new Block({ x: 0, y: 3, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1
+ // *
+ // *
+ // *
+ it('returns true when straight vertical tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 2, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 3, y: 0, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1*
+ // **
+ it('returns true when square tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 1, y: 1, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1 1*
+ // * 1 * **1
+ // ** *** * *
+ // A B C D
+ it('returns true when left L A tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b3 = new Block({ x: 2, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 1, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when left L B tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 1, y: 2, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when left L C tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 0, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when left L D tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 2, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 2, color: 'blue' })
+ const b3 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 0, y: 0, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1 *1
+ // * 1 * 1**
+ // ** *** * *
+ // A B C D
+ it('returns true when right L A tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 2, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 1, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when right L B tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 2, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 2, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 1, y: 0, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when right L C tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 1, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when right L D tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 0, y: 2, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1 1
+ // *1 1* ** **
+ // ** ** * *
+ // A B C D
+ it('returns true when Z A tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b2 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b4 = new Block({ x: 1, y: 2, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when Z B tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 0, y: 2, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when Z C tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 0, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 1, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ it('returns true when Z D tetromino exists', () => {
+ const b1 = new Block({ x: 0, y: 1, color: 'blue' })
+ const b2 = new Block({ x: 1, y: 0, color: 'blue' })
+ const b3 = new Block({ x: 1, y: 1, color: 'blue' })
+ const b4 = new Block({ x: 2, y: 0, color: 'blue' })
+ const blocks = [b1, b2, b3, b4]
+ const checker = new TetrominoChecker(blocks, 0)
+ expect(checker.check()).toEqual(true)
+ })
+
+ // 1 1
+ // ** ** 1 *1*
+ // * * *** *
+ // A B C D
+ it('returns true when T A tetromino exists')
+ it('returns true when T B tetromino exists')
+ it('returns true when T C tetromino exists')
+ it('returns true when T D tetromino exists')
+})
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
new file mode 100644
index 0000000..858f601
--- /dev/null
+++ b/spec/javascripts/support/jasmine.yml
@@ -0,0 +1,50 @@
+# path to parent directory of src_files
+# relative path from Rails.root
+# defaults to app/assets/javascripts
+src_dir: "app/assets/javascripts"
+
+# path to additional directory of source file that are not part of assets pipeline and need to be included
+# relative path from Rails.root
+# defaults to []
+# include_dir:
+# - ../mobile_app/public/js
+
+# path to parent directory of css_files
+# relative path from Rails.root
+# defaults to app/assets/stylesheets
+css_dir: "app/assets/stylesheets"
+
+# list of file expressions to include as source files
+# relative path from src_dir
+src_files:
+ - "application.{js.coffee,js,coffee}"
+
+# list of file expressions to include as css files
+# relative path from css_dir
+css_files:
+
+# path to parent directory of spec_files
+# relative path from Rails.root
+#
+# Alternatively accept an array of directory to include external spec files
+# spec_dir:
+# - spec/javascripts
+# - ../engine/spec/javascripts
+#
+# defaults to spec/javascripts
+spec_dir: spec/javascripts
+
+# list of file expressions to include as helpers into spec runner
+# relative path from spec_dir
+helpers:
+ - "helpers/**/*.{js,es6.js}"
+
+# list of file expressions to include as specs into spec runner
+# relative path from spec_dir
+spec_files:
+ - "**/*[Ss]pec.{js.jsx,jsx,es6.jsx,es6.js,js}"
+
+# path to directory of temporary files
+# (spec runner and asset cache)
+# defaults to tmp/jasmine
+tmp_dir: "tmp/jasmine"