From 845116059f5d5b3845907075baf3c37fb0e31aee Mon Sep 17 00:00:00 2001 From: Matt Wright Date: Sun, 1 Apr 2012 21:05:59 -0700 Subject: [PATCH] Fairly complete Listter app, with some work left to do --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 15 + Gemfile | 43 ++ Gemfile.lock | 148 ++++++ Guardfile | 11 + README.rdoc | 261 +++++++++++ Rakefile | 7 + app/assets/javascripts/application.js | 18 + app/assets/javascripts/lists.js | 229 ++++++++++ app/assets/stylesheets/_application.css | 166 +++++++ app/assets/stylesheets/application.css.scss | 421 ++++++++++++++++++ app/assets/stylesheets/lists.css.scss | 4 + app/controllers/application_controller.rb | 23 + app/controllers/lists_controller.rb | 86 ++++ app/helpers/application_helper.rb | 2 + app/helpers/lists_helper.rb | 2 + app/mailers/.gitkeep | 0 app/models/.gitkeep | 0 app/models/user.rb | 14 + app/views/layouts/application.html.erb | 43 ++ app/views/lists/_merge-dialog.html.erb | 19 + app/views/lists/index.html.erb | 15 + config.ru | 4 + config/application.rb | 59 +++ config/boot.rb | 6 + config/database.yml | 25 ++ config/environment.rb | 5 + config/environments/development.rb | 37 ++ config/environments/production.rb | 67 +++ config/environments/test.rb | 37 ++ config/initializers/backtrace_silencers.rb | 7 + config/initializers/inflections.rb | 15 + config/initializers/mime_types.rb | 5 + config/initializers/omniauth.rb | 3 + config/initializers/secret_token.rb | 7 + config/initializers/session_store.rb | 8 + config/initializers/twitter.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 5 + config/routes.rb | 66 +++ db/migrate/20120326163018_create_users.rb | 14 + db/schema.rb | 27 ++ db/seeds.rb | 7 + doc/README_FOR_APP | 2 + lib/assets/.gitkeep | 0 lib/tasks/.gitkeep | 0 log/.gitkeep | 0 public/404.html | 26 ++ public/422.html | 26 ++ public/500.html | 25 ++ public/favicon.ico | 0 public/robots.txt | 5 + script/rails | 6 + test/fixtures/.gitkeep | 0 test/fixtures/users.yml | 11 + test/functional/.gitkeep | 0 test/functional/lists_controller_test.rb | 7 + test/integration/.gitkeep | 0 test/performance/browsing_test.rb | 12 + test/test_helper.rb | 13 + test/unit/.gitkeep | 0 test/unit/helpers/lists_helper_test.rb | 4 + test/unit/user_test.rb | 7 + vendor/assets/javascripts/.gitkeep | 0 vendor/assets/javascripts/ember-0.9.5.min.js | 13 + vendor/assets/javascripts/spin.min.js | 2 + vendor/assets/stylesheets/.gitkeep | 0 .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../stylesheets/jquery-ui-1.8.18.custom.css | 336 ++++++++++++++ vendor/plugins/.gitkeep | 0 82 files changed, 2444 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 README.rdoc create mode 100644 Rakefile create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/lists.js create mode 100644 app/assets/stylesheets/_application.css create mode 100644 app/assets/stylesheets/application.css.scss create mode 100644 app/assets/stylesheets/lists.css.scss create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/lists_controller.rb create mode 100644 app/helpers/application_helper.rb create mode 100644 app/helpers/lists_helper.rb create mode 100644 app/mailers/.gitkeep create mode 100644 app/models/.gitkeep create mode 100644 app/models/user.rb create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/lists/_merge-dialog.html.erb create mode 100644 app/views/lists/index.html.erb create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/omniauth.rb create mode 100644 config/initializers/secret_token.rb create mode 100644 config/initializers/session_store.rb create mode 100644 config/initializers/twitter.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/routes.rb create mode 100644 db/migrate/20120326163018_create_users.rb create mode 100644 db/schema.rb create mode 100644 db/seeds.rb create mode 100644 doc/README_FOR_APP create mode 100644 lib/assets/.gitkeep create mode 100644 lib/tasks/.gitkeep create mode 100644 log/.gitkeep create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100755 script/rails create mode 100644 test/fixtures/.gitkeep create mode 100644 test/fixtures/users.yml create mode 100644 test/functional/.gitkeep create mode 100644 test/functional/lists_controller_test.rb create mode 100644 test/integration/.gitkeep create mode 100644 test/performance/browsing_test.rb create mode 100644 test/test_helper.rb create mode 100644 test/unit/.gitkeep create mode 100644 test/unit/helpers/lists_helper_test.rb create mode 100644 test/unit/user_test.rb create mode 100644 vendor/assets/javascripts/.gitkeep create mode 100644 vendor/assets/javascripts/ember-0.9.5.min.js create mode 100644 vendor/assets/javascripts/spin.min.js create mode 100644 vendor/assets/stylesheets/.gitkeep create mode 100755 vendor/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 vendor/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 vendor/assets/stylesheets/images/ui-icons_222222_256x240.png create mode 100755 vendor/assets/stylesheets/images/ui-icons_2e83ff_256x240.png create mode 100755 vendor/assets/stylesheets/images/ui-icons_454545_256x240.png create mode 100755 vendor/assets/stylesheets/images/ui-icons_888888_256x240.png create mode 100755 vendor/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png create mode 100755 vendor/assets/stylesheets/jquery-ui-1.8.18.custom.css create mode 100644 vendor/plugins/.gitkeep diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 'git://github.com/rails/rails.git' + +gem 'sqlite3' +gem 'omniauth-twitter' +gem 'twitter' + +# Gems used only for assets and not required +# in production environments by default. +group :assets do + gem 'sass-rails', '~> 3.2.3' + gem 'coffee-rails', '~> 3.2.1' + + # See https://github.com/sstephenson/execjs#readme for more supported runtimes + # gem 'therubyracer' + + gem 'uglifier', '>= 1.0.3' +end + +group :development do + gem 'guard-livereload' +end + +gem 'jquery-rails' + +# To use ActiveModel has_secure_password +# gem 'bcrypt-ruby', '~> 3.0.0' + +# To use Jbuilder templates for JSON +# gem 'jbuilder' + +# Use unicorn as the web server +# gem 'unicorn' + +# Deploy with Capistrano +# gem 'capistrano' + +# To use debugger +# gem 'ruby-debug19', :require => 'ruby-debug' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..5c8838b --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,148 @@ +GEM + remote: https://rubygems.org/ + specs: + actionmailer (3.2.1) + actionpack (= 3.2.1) + mail (~> 2.4.0) + actionpack (3.2.1) + activemodel (= 3.2.1) + activesupport (= 3.2.1) + builder (~> 3.0.0) + erubis (~> 2.7.0) + journey (~> 1.0.1) + rack (~> 1.4.0) + rack-cache (~> 1.1) + rack-test (~> 0.6.1) + sprockets (~> 2.1.2) + activemodel (3.2.1) + activesupport (= 3.2.1) + builder (~> 3.0.0) + activerecord (3.2.1) + activemodel (= 3.2.1) + activesupport (= 3.2.1) + arel (~> 3.0.0) + tzinfo (~> 0.3.29) + activeresource (3.2.1) + activemodel (= 3.2.1) + activesupport (= 3.2.1) + activesupport (3.2.1) + i18n (~> 0.6) + multi_json (~> 1.0) + addressable (2.2.7) + arel (3.0.2) + builder (3.0.0) + coffee-rails (3.2.2) + coffee-script (>= 2.2.0) + railties (~> 3.2.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.2.0) + em-websocket (0.3.6) + addressable (>= 2.1.1) + eventmachine (>= 0.12.9) + erubis (2.7.0) + eventmachine (0.12.10) + execjs (1.3.0) + multi_json (~> 1.0) + faraday (0.7.6) + addressable (~> 2.2) + multipart-post (~> 1.1) + rack (~> 1.1) + ffi (1.0.11) + guard (1.0.1) + ffi (>= 0.5.0) + thor (~> 0.14.6) + guard-livereload (0.4.2) + em-websocket (>= 0.2.0) + guard (>= 0.10.0) + multi_json (~> 1.0) + hashie (1.2.0) + hike (1.2.1) + i18n (0.6.0) + journey (1.0.3) + jquery-rails (2.0.1) + railties (>= 3.2.0, < 5.0) + thor (~> 0.14) + json (1.6.5) + mail (2.4.4) + i18n (>= 0.4.0) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.18) + multi_json (1.1.0) + multipart-post (1.1.5) + oauth (0.4.5) + omniauth (1.0.3) + hashie (~> 1.2) + rack + omniauth-oauth (1.0.1) + oauth + omniauth (~> 1.0) + omniauth-twitter (0.0.8) + omniauth-oauth (~> 1.0) + polyglot (0.3.3) + rack (1.4.1) + rack-cache (1.2) + rack (>= 0.4) + rack-ssl (1.3.2) + rack + rack-test (0.6.1) + rack (>= 1.0) + rails (3.2.1) + actionmailer (= 3.2.1) + actionpack (= 3.2.1) + activerecord (= 3.2.1) + activeresource (= 3.2.1) + activesupport (= 3.2.1) + bundler (~> 1.0) + railties (= 3.2.1) + railties (3.2.1) + actionpack (= 3.2.1) + activesupport (= 3.2.1) + rack-ssl (~> 1.3.2) + rake (>= 0.8.7) + rdoc (~> 3.4) + thor (~> 0.14.6) + rake (0.9.2.2) + rdoc (3.12) + json (~> 1.4) + sass (3.1.15) + sass-rails (3.2.5) + railties (~> 3.2.0) + sass (>= 3.1.10) + tilt (~> 1.3) + simple_oauth (0.1.5) + sprockets (2.1.2) + hike (~> 1.2) + rack (~> 1.0) + tilt (~> 1.1, != 1.3.0) + sqlite3 (1.3.5) + thor (0.14.6) + tilt (1.3.3) + treetop (1.4.10) + polyglot + polyglot (>= 0.3.1) + twitter (2.1.1) + activesupport (>= 2.3.9, < 4) + faraday (~> 0.7) + multi_json (~> 1.0) + simple_oauth (~> 0.1) + tzinfo (0.3.32) + uglifier (1.2.3) + execjs (>= 0.3.0) + multi_json (>= 1.0.2) + +PLATFORMS + ruby + +DEPENDENCIES + coffee-rails (~> 3.2.1) + guard-livereload + jquery-rails + omniauth-twitter + rails (= 3.2.1) + sass-rails (~> 3.2.3) + sqlite3 + twitter + uglifier (>= 1.0.3) diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000..6922a30 --- /dev/null +++ b/Guardfile @@ -0,0 +1,11 @@ +# A sample Guardfile +# More info at https://github.com/guard/guard#readme + +guard 'livereload' do + watch(%r{app/views/.+\.(erb|haml|slim)}) + watch(%r{app/helpers/.+\.rb}) + watch(%r{public/.+\.(css|js|html)}) + watch(%r{config/locales/.+\.yml}) + # Rails Assets Pipeline + watch(%r{(app|vendor)/assets/\w+/(.+\.(css|js|html)).*}) { |m| "/assets/#{m[2]}" } +end diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..7c36f23 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,261 @@ +== Welcome to Rails + +Rails is a web-application framework that includes everything needed to create +database-backed web applications according to the Model-View-Control pattern. + +This pattern splits the view (also called the presentation) into "dumb" +templates that are primarily responsible for inserting pre-built data in between +HTML tags. The model contains the "smart" domain objects (such as Account, +Product, Person, Post) that holds all the business logic and knows how to +persist themselves to a database. The controller handles the incoming requests +(such as Save New Account, Update Product, Show Post) by manipulating the model +and directing data to the view. + +In Rails, the model is handled by what's called an object-relational mapping +layer entitled Active Record. This layer allows you to present the data from +database rows as objects and embellish these data objects with business logic +methods. You can read more about Active Record in +link:files/vendor/rails/activerecord/README.html. + +The controller and view are handled by the Action Pack, which handles both +layers by its two parts: Action View and Action Controller. These two layers +are bundled in a single package due to their heavy interdependence. This is +unlike the relationship between the Active Record and Action Pack that is much +more separate. Each of these packages can be used independently outside of +Rails. You can read more about Action Pack in +link:files/vendor/rails/actionpack/README.html. + + +== Getting Started + +1. At the command prompt, create a new Rails application: + rails new myapp (where myapp is the application name) + +2. Change directory to myapp and start the web server: + cd myapp; rails server (run with --help for options) + +3. Go to http://localhost:3000/ and you'll see: + "Welcome aboard: You're riding Ruby on Rails!" + +4. Follow the guidelines to start developing your application. You can find +the following resources handy: + +* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html +* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ + + +== Debugging Rails + +Sometimes your application goes wrong. Fortunately there are a lot of tools that +will help you debug it and get it back on the rails. + +First area to check is the application log files. Have "tail -f" commands +running on the server.log and development.log. Rails will automatically display +debugging and runtime information to these files. Debugging info will also be +shown in the browser on requests from 127.0.0.1. + +You can also log your own messages directly into the log file from your code +using the Ruby logger class from inside your controllers. Example: + + class WeblogController < ActionController::Base + def destroy + @weblog = Weblog.find(params[:id]) + @weblog.destroy + logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") + end + end + +The result will be a message in your log file along the lines of: + + Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! + +More information on how to use the logger is at http://www.ruby-doc.org/core/ + +Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are +several books available online as well: + +* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) +* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) + +These two books will bring you up to speed on the Ruby language and also on +programming in general. + + +== Debugger + +Debugger support is available through the debugger command when you start your +Mongrel or WEBrick server with --debugger. This means that you can break out of +execution at any point in the code, investigate and change the model, and then, +resume execution! You need to install ruby-debug to run the server in debugging +mode. With gems, use sudo gem install ruby-debug. Example: + + class WeblogController < ActionController::Base + def index + @posts = Post.all + debugger + end + end + +So the controller will accept the action, run the first line, then present you +with a IRB prompt in the server window. Here you can do things like: + + >> @posts.inspect + => "[#nil, "body"=>nil, "id"=>"1"}>, + #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" + >> @posts.first.title = "hello from a debugger" + => "hello from a debugger" + +...and even better, you can examine how your runtime objects actually work: + + >> f = @posts.first + => #nil, "body"=>nil, "id"=>"1"}> + >> f. + Display all 152 possibilities? (y or n) + +Finally, when you're ready to resume execution, you can enter "cont". + + +== Console + +The console is a Ruby shell, which allows you to interact with your +application's domain model. Here you'll have all parts of the application +configured, just like it is when the application is running. You can inspect +domain models, change values, and save to the database. Starting the script +without arguments will launch it in the development environment. + +To start the console, run rails console from the application +directory. + +Options: + +* Passing the -s, --sandbox argument will rollback any modifications + made to the database. +* Passing an environment name as an argument will load the corresponding + environment. Example: rails console production. + +To reload your controllers and models after launching the console run +reload! + +More information about irb can be found at: +link:http://www.rubycentral.org/pickaxe/irb.html + + +== dbconsole + +You can go to the command line of your database directly through rails +dbconsole. You would be connected to the database with the credentials +defined in database.yml. Starting the script without arguments will connect you +to the development database. Passing an argument will connect you to a different +database, like rails dbconsole production. Currently works for MySQL, +PostgreSQL and SQLite 3. + +== Description of Contents + +The default directory structure of a generated Ruby on Rails application: + + |-- app + | |-- assets + | |-- images + | |-- javascripts + | `-- stylesheets + | |-- controllers + | |-- helpers + | |-- mailers + | |-- models + | `-- views + | `-- layouts + |-- config + | |-- environments + | |-- initializers + | `-- locales + |-- db + |-- doc + |-- lib + | `-- tasks + |-- log + |-- public + |-- script + |-- test + | |-- fixtures + | |-- functional + | |-- integration + | |-- performance + | `-- unit + |-- tmp + | |-- cache + | |-- pids + | |-- sessions + | `-- sockets + `-- vendor + |-- assets + `-- stylesheets + `-- plugins + +app + Holds all the code that's specific to this particular application. + +app/assets + Contains subdirectories for images, stylesheets, and JavaScript files. + +app/controllers + Holds controllers that should be named like weblogs_controller.rb for + automated URL mapping. All controllers should descend from + ApplicationController which itself descends from ActionController::Base. + +app/models + Holds models that should be named like post.rb. Models descend from + ActiveRecord::Base by default. + +app/views + Holds the template files for the view that should be named like + weblogs/index.html.erb for the WeblogsController#index action. All views use + eRuby syntax by default. + +app/views/layouts + Holds the template files for layouts to be used with views. This models the + common header/footer method of wrapping views. In your views, define a layout + using the layout :default and create a file named default.html.erb. + Inside default.html.erb, call <% yield %> to render the view using this + layout. + +app/helpers + Holds view helpers that should be named like weblogs_helper.rb. These are + generated for you automatically when using generators for controllers. + Helpers can be used to wrap functionality for your views into methods. + +config + Configuration files for the Rails environment, the routing map, the database, + and other dependencies. + +db + Contains the database schema in schema.rb. db/migrate contains all the + sequence of Migrations for your schema. + +doc + This directory is where your application documentation will be stored when + generated using rake doc:app + +lib + Application specific libraries. Basically, any kind of custom code that + doesn't belong under controllers, models, or helpers. This directory is in + the load path. + +public + The directory available for the web server. Also contains the dispatchers and the + default HTML files. This should be set as the DOCUMENT_ROOT of your web + server. + +script + Helper scripts for automation and generation. + +test + Unit and functional tests along with fixtures. When using the rails generate + command, template test files will be generated for you and placed in this + directory. + +vendor + External libraries that the application depends on. Also includes the plugins + subdirectory. If the app has frozen rails, those gems also go here, under + vendor/rails/. This directory is in the load path. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..93990f2 --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +#!/usr/bin/env rake +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Listter::Application.load_tasks diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000..1425d12 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,18 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// the compiled file. +// +// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD +// GO AFTER THE REQUIRES BELOW. +// +//= require jquery +//= require jquery-ui +//= require jquery_ujs +//= require ember-0.9.5.min +//= require spin.min +//= require_tree . diff --git a/app/assets/javascripts/lists.js b/app/assets/javascripts/lists.js new file mode 100644 index 0000000..c777dab --- /dev/null +++ b/app/assets/javascripts/lists.js @@ -0,0 +1,229 @@ +var Listter = Em.Application.create(); + +Listter.List = Ember.Object.extend({ + name: null, + id: null, + members: null, + isChecked: false +}); + +Listter.listsController = Ember.ArrayController.create({ + content: [], + + targetSelection: null, + + mergeToNewList: false, + + deleteOnMerge: false, + + loadLists: function(){ + var uid = $('#lists-container').data('uid'); + + $.getJSON('https://api.twitter.com/1/lists/all.json?user_id=' + uid + '&callback=?', function(response){ + + // Add all users personal list (not subscribed) + response.forEach(function(list){ + if(list.user.id === uid){ + var list = Listter.List.create({ name: list.name, id: list.id, members: list.member_count, isChecked: false }); + Listter.listsController.pushObject(list); + } + }); + + }); + + }, + + checked: function() { + return this.filterProperty('isChecked') + }.property('@each.isChecked').cacheable(), + + lessThanTwoSelected: function() { + if( this.filterProperty('isChecked').length >= 2 ) { + return false; + } + else { + return true; + } + }.property('@each.isChecked').cacheable(), + + toggleMergeType: function() { + $('#merge-target-field').toggle(); + $('#new-list-field').toggle(); + this.mergeToNewList = !this.mergeToNewList + }, + + mergeLists: function() { + // Initialize merge target to first list selected + Listter.listsController.set('targetSelection', Listter.listsController.get('checked')[0]); + + // Remove any errors from last merge + $('#merge-dialog .error').remove(); + + // Clear new list name + $('#new-list-name')[0].value = ""; + + var mergeDialog = $('#merge-dialog').dialog({ + title: 'Merge Options', + modal: true, + resizable: false, + width: 275, + minHeight: false, + buttons: { + 'Merge Lists': function() { + var listsToMerge = [], + tooManyMembers = false, + mergedMemberCount = Listter.listsController.mergeToNewList ? 0 : Listter.listsController.targetSelection.members, + listObjectsToMerge = [], + targetList = Listter.listsController.mergeToNewList ? null : Listter.listsController.targetSelection.id, + newListName = $('#new-list-name')[0].value; + + // Add all checked lists (that aren't the target) to merge list + Listter.listsController.get('checked').forEach(function(list){ + if ( list.id !== targetList ) { + if ( mergedMemberCount + list.members <= 500 ) { + listsToMerge.push(list.id); + listObjectsToMerge.push(list); + mergedMemberCount += list.members; + } + else { + tooManyMembers = true; + } + } + }); + + if ( listsToMerge.length ) { + $.ajax({ + url: '/lists/merge', + type: 'POST', + dataType: 'json', + data: { + targetList: targetList, + newListName: newListName, + listsToMerge: listsToMerge, + deleteOnMerge: Listter.listsController.deleteOnMerge, + mergeToNewList: Listter.listsController.mergeToNewList, + authenticity_token: $('meta[name="csrf-token"]').attr("content") + }, + success: function(response) { + var dialog = mergeDialog.dialog('widget'), + buttons = dialog.find('.ui-dialog-buttonset button'); + + $(buttons).attr('disabled', false); + $('.ui-dialog-titlebar .spinner', dialog).remove(); + + if ( Listter.listsController.deleteOnMerge ) { + // Remove deleted lists + Listter.listsController.removeObjects(listObjectsToMerge); + } + + if ( Listter.listsController.mergeToNewList ) { + // Add new list + var newList = Listter.List.create({ name: newListName, id: response.newListId, members: mergedMemberCount, isChecked: false }); + Listter.listsController.unshiftObject(newList); + } + + else { + // Update visible member count indicator + Listter.listsController.targetSelection.set('members', response.updatedMemberCount); + } + + Listter.listsController.setEach('isChecked', false); + mergeDialog.dialog("close"); + + if ( tooManyMembers ) { + $('
Twitter only allows a max of 500 members for each list. Your selected lists combined are bigger than that, so some of them weren\'t able to be added. Sorry!
') + .dialog({ + title: 'Merge Warning', + dialogClass: 'alert-dialog', + resizable: false, + width: 260, + minHeight: false + }); + } + }, + error: function(xhr) { + var dialog = mergeDialog.dialog('widget'), + buttons = dialog.find('.ui-dialog-buttonset button'); + + $(buttons).attr('disabled', false); + $('.ui-dialog-titlebar .spinner', dialog).remove(); + + mergeDialog.prepend('
' + xhr.responseText + '
'); + }, + beforeSend: function() { + $('.error', mergeDialog).remove(); + + var spinner = new Spinner({ length: 4, width: 2, radius: 5 }).spin(), + dialog = mergeDialog.dialog('widget'), + target = dialog.find('.ui-dialog-titlebar')[0], + buttons = dialog.find('.ui-dialog-buttonset button'); + + target.appendChild(spinner.el); + $(buttons).attr('disabled', 'disabled'); + } + }); + } + + else { + mergeDialog.dialog("close"); + $('
Twitter only allows a max of 500 members for each list. Your selected lists combined are bigger than that, so none of them were able to be added. Sorry!
') + .dialog({ + title: 'Merge Error', + dialogClass: 'alert-dialog', + resizable: false, + width: 260, + minHeight: false + }); + } + + }, + Cancel: function() { + mergeDialog.dialog("close"); + } + } + }); + + } +}); + +Listter.ListView = Em.View.extend({ + classNameBindings: ['list.isChecked'], + + removeList: function() { + list = this.get('list'); + + var confirmDialog = $('
Are you sure you want to delete the list ' + list.name + '? This action can\'t be undone.
') + .dialog({ + title: 'Confirmation', + resizable: false, + width: 260, + minHeight: false, + buttons: { + 'Delete List': function() { + $.ajax({ + url: '/lists/remove', + type: 'DELETE', + dataType: 'json', + data: { + list_id: list.get('id'), + authenticity_token: $('meta[name="csrf-token"]').attr("content") + }, + success: function(){ + Listter.listsController.removeObject(list); + confirmDialog.dialog("close"); + } + }); + }, + Cancel: function() { + confirmDialog.dialog("close"); + } + } + }); + } +}); + +$(document).ready(function(){ + + Listter.listsController.loadLists(); + +}); \ No newline at end of file diff --git a/app/assets/stylesheets/_application.css b/app/assets/stylesheets/_application.css new file mode 100644 index 0000000..8c8ff26 --- /dev/null +++ b/app/assets/stylesheets/_application.css @@ -0,0 +1,166 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the top of the + * compiled file, but it's generally better to create a new file per style scope. + * + *= require_self + *= require_tree . +*/ +body { + font: 16px Arial, sans-serif; } + +h1 { + font-size: 120px; + font-weight: normal; + margin: 0 0 20px; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5), 0 -1px 0 rgba(255, 255, 255, 0.5); + color: rgba(0, 0, 128, 0.4); + -webkit-transform: skew(-7deg); + -webkit-text-stroke: 5px white; } + +.content { + width: 360px; + margin: 40px auto; } + +.user-bar { + width: 340px; + float: left; + font-size: 14px; + line-height: 24px; + padding: 10px; + color: white; + background-color: rgba(0, 0, 0, 0.7); + margin-bottom: 20px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; } + +.user-bar img { + float: left; + vertical-align: middle; + margin-right: 10px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; } + +.user-bar a { + float: right; + color: white; + font-weight: bold; } + +.merge-button, +.signin-button { + display: block; + width: 100%; + padding: 10px; + margin-bottom: 30px; + font: bold 26px Arial, sans-serif; + color: white; + border: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.5); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(gold), to(orange)); + border: solid 1px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 -2px 2px gold inset; + -webkit-box-shadow: 0 -2px 2px gold inset; + box-shadow: 0 -2px 2px gold inset; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + -moz-transition: all 0.2s; + -webkit-transition: all 0.2s; + transition: all 0.2s; } + +.merge-button:active { + box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.3), inset 0 1px 0 1px rgba(0, 0, 0, 0.1), inset 0 1px rgba(0, 0, 0, 0.2); + text-shadow: 0 2px rgba(0, 0, 0, 0.5); } + +.merge-button:disabled { + color: #B3B3B3; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eeeeee), to(#dddddd)); + box-shadow: none; + text-shadow: none; } + +#lists-container { + margin-top: 1em; } + +.list { + border: solid 1px #EEE; + overflow: hidden; + margin-bottom: 10px; + line-height: 24px; + background: white; + width: 360px; + -moz-transition: all 0.2s; + -webkit-transition: all 0.2s; + transition: all 0.2s; + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; } + +.list.is-checked { + border-color: black; + margin-left: -5px; + width: 370px; + /* + @include transform; + @include transform-center; + */ + -moz-box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); } + +.list label { + font-weight: bold; + padding: 20px; + display: block; + width: 170px; + float: left; } + +.list label input[type="checkbox"] { + margin-right: 15px; + font-weight: bold; } + +.list-meta { + padding: 20px; + float: right; + text-align: right; + width: 100px; + background: #FAFAFA; } + +.list-members { + display: inline-block; + font-size: 12px; + background: navy; + color: white; + font-weight: bold; + width: 40px; + text-align: center; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; } + +/* !Modals */ +.ui-dialog { + background-color: white; + padding: 20px; + border: solid 1px #666; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; } + +.ui-dialog-titlebar { + font-weight: bold; } + +.ui-dialog-content { + margin: 1em 0; } + +.ui-dialog-titlebar-close { + float: right; + font-weight: normal; + text-decoration: none; + color: #666; } diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss new file mode 100644 index 0000000..dbb41d4 --- /dev/null +++ b/app/assets/stylesheets/application.css.scss @@ -0,0 +1,421 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the top of the + * compiled file, but it's generally better to create a new file per style scope. + * + *= require_self +*/ + +$content-width: 360px; + +@mixin rounded($radius: 5px) { + -moz-border-radius: $radius; + -webkit-border-radius: $radius; + border-radius: $radius; + } + +@mixin rounded-bottom($radius: 5px) { + -moz-border-radius-bottomleft: $radius; + -moz-border-radius-bottomright: $radius; + -webkit-border-bottom-left-radius: $radius; + -webkit-border-bottom-right-radius: $radius; + border-radius-bottomleft: $radius; + border-bottom-left-radius: $radius; + border-bottom-right-radius: $radius; + } + +@mixin transition($property: all, $duration: .2s) { + -moz-transition: $property $duration; + -webkit-transition: $property $duration; + transition: $property $duration; + } + +@mixin transform($scale: 1.01) { + -moz-transform: scale($scale); + -webkit-transform: scale($scale); + transform: scale($scale); + } + +@mixin transform-center { + -webkit-transform-origin: center center; + -moz-transform-origin: center center; + transform-origin: center center; + } + +@mixin box-shadow($x-offset: 0, $y-offset: 3px, $fade: 5px, $color: rgba(0, 0, 0, .2)) { + -moz-box-shadow: $x-offset $y-offset $fade $color; + -webkit-box-shadow: $x-offset $y-offset $fade $color; + box-shadow: $x-offset $y-offset $fade $color; + } + +@mixin box-shadow-inset($x-offset: 3px, $y-offset: 3px, $fade: 5px, $color: rgba(0, 0, 0, .2)) { + -moz-box-shadow: $x-offset $y-offset $fade $color inset; + -webkit-box-shadow: $x-offset $y-offset $fade $color inset; + box-shadow: $x-offset $y-offset $fade $color inset; + } + +@mixin box-shadow-none { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + } + +@mixin no-select { + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; + } + +/* !Globals */ + +body { + font: 16px Arial, sans-serif; + } + +p { + margin: 1em 0; + line-height: 1.4; + } + +h1 { + font-size: 114px; + font-weight: bold; + margin: 0 0 20px; + text-shadow: 8px 8px 0 rgba(255, 215, 0, .5); + color: rgba(0, 0, 128, .6); + -webkit-transform: skew(-7deg); + -webkit-text-stroke: 4px white; + } + +/* !Main Styles */ + +.content { + width: $content-width; + margin: 50px auto; + } + +.user-bar { + position: absolute; + top: 0; + left: 50%; + margin-left: -($content-width / 2); + width: $content-width; + font-size: 12px; + line-height: 18px; + padding: 8px 0; + margin-bottom: 20px; + border-bottom: solid 1px #EEE; + color: #666; + } + +.user-bar img { + float: left; + /* vertical-align: middle; */ + margin-right: 10px; + width: 18px; + height: 18px; + @include rounded(3px); + } + +.user-bar a { + float: right; + color: #666; + font-weight: bold; + } + +.merge-inline-help { + margin-bottom: 30px; + padding: 0 30px; + } + +.callout { + margin-bottom: 30px; + } + +.callout strong { /* keep TM from falling to next line */ + margin-right: -2px; + } + +.trademark { + font-size: 8px; + position: relative; + top: -8px; + } + +/* !Buttons */ + +button, +input[type="submit"] { + display: inline-block; + margin: 0 3px 0 0; + padding: 4px 8px; + font: bold 14px Arial, sans-serif; + border: solid 1px rgba(0, 0, 0, 0.3); + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + cursor: pointer; + color: #333333; + color: rgba(0, 0, 0, .7); + background-color: #EEE; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(white), to(#DDD)); + @include rounded(5px); + @include transition; + } + +button:hover, +input[type="submit"]:hover { + background-image: -webkit-gradient(linear, 0% 50%, 0% 100%, from(white), to(#DDD)); + } + +button:active, +input[type="submit"]:active { + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#DDD), to(white)); + @include box-shadow-inset(0, 1px, 2px, rgba(0, 0, 0, .5)); + } + +button:focus, +input[type="submit"]:focus { + outline: none; + } + +button:disabled, +button:disabled:hover, +input[type="submit"]:disabled, +input[type="submit"]:disabled:hover { + color: #B3B3B3; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#EEE), to(#DDD)); + box-shadow: none; + text-shadow: none; + } + +button:last-child, +input[type="submit"]:last-child { + margin: 0; + } + +.ui-button:last-child { + border: none; + background: white; + } + +.list button { + font-size: 13px; + } + +.primary-button, +input[type="submit"].primary-button { + display: block; + color: white; + width: 100%; + padding: 10px; + font-size: 26px; + @include rounded(10px); + background-color: orange; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(gold), to(orange)); + text-shadow: 0 1px rgba(0, 0, 0, 0.5); + @include box-shadow-inset(0, -4px, 6px, gold); + } + +.primary-button:hover, +input[type="submit"].primary-button:hover { + background-image: -webkit-gradient(linear, 0% 50%, 0% 100%, from(gold), to(orange)); + @include box-shadow-inset(0, -4px, 6px, rgba(255, 215, 0, .8)); + } + +.primary-button:active, +input[type="submit"].primary-button:active { + box-shadow: inset 0 0 10px rgba(0,0,0,0.3), inset 0 1px 0 1px rgba(0,0,0,0.1), inset 0 1px rgba(0,0,0,0.2); + text-shadow: 0 2px rgba(0, 0, 0, 0.5); + } + +/* !Lists */ + +#lists-container { + margin-top: 1em; + } + +.list { + border: solid 1px #DDD; + overflow: hidden; + margin-bottom: 10px; + line-height: 24px; + background: white; + width: 360px; + @include transition; + @include no-select; + } + +.list.is-checked { + border-color: black; + margin-left: -5px; + width: 370px; + @include box-shadow; + } + +.list label { + font-weight: bold; + padding: 20px; + display: block; + width: 170px; + float: left; + } + +.list label input[type="checkbox"] { + margin-right: 15px; + font-weight: bold; + } + +.list-meta { + padding: 20px; + float: right; + text-align: right; + width: 100px; + background: #EEE; + } + +.list-members { + display: inline-block; + font-size: 12px; + background: navy; + color: white; + font-weight: bold; + width: 40px; + text-align: center; + @include rounded; + } + +/* !Forms */ + +.field { + margin: 1.2em 0; + } + +.field label { + font-weight: bold; + font-size: 14px; + } + +.field select, +.field input[type="text"] { + margin-top: 6px; + border: solid 1px #999; + padding: 8px; + font: 16px Arial, sans-serif; + } + +.field input[type="text"] { + display: block; + width: 256px; + @include rounded(3px); + } + +.field select { + display: inline-block; + width: 275px; + height: 36px; } + +.field input[type="checkbox"] { + margin-right: 5px; + } + +.field select:focus, +.field input:focus { + outline: none; + border: solid 1px black; + } + +/* !Modals */ + +.ui-dialog { + background-color: white; + padding: 20px; + border: solid 1px #666; + @include rounded; + @include box-shadow(0, 5px, 25px, rgba(0, 0, 0, .8)); + } + +.ui-dialog-titlebar { + font-weight: bold; + color: #666; + } + +.ui-dialog-titlebar .spinner { + float: right; + margin-top: 11px; + margin-right: 11px; + } + +.ui-dialog-content { + margin: 1em 0; + line-height: 1.4; + } + +.ui-dialog-content:last-child { + margin-bottom: 0; + } + +.ui-dialog-titlebar-close { + display: none; + float: right; + font-weight: normal; + text-decoration: none; + color: #666; + } + +.alert-dialog .ui-dialog-titlebar-close { + display: block; + } + +.warning, +.error { + padding: 10px; + border: 1px solid #624D1F; + font-size: 12px; + @include rounded(5px); + } + +.warning { + background-color: #FFECC5; + color: #624D1F; + } + +.error { + background-color: #FFE3DF; + border-color: #72190D; + color: #72190D; + } + +/* !Inline Help */ + +.inline-help { + color: #666; + font-size: 12px; + margin-top: 8px; + line-height: 1.4; + } + +.inline-help a { + color: #666; + } + +/* !Flash Messaging */ + +#notice, +#warning { + padding: 5px; + color: white; + font-size: 12px; + @include rounded; + } + +#notice { + background-color: green; + } + +#warning { + background-color: red; + } \ No newline at end of file diff --git a/app/assets/stylesheets/lists.css.scss b/app/assets/stylesheets/lists.css.scss new file mode 100644 index 0000000..7e8a7d2 --- /dev/null +++ b/app/assets/stylesheets/lists.css.scss @@ -0,0 +1,4 @@ +// Place all the styles related to the Lists controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..851613e --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,23 @@ +class ApplicationController < ActionController::Base + protect_from_forgery + helper_method :current_user + + def login + # raise request.env["omniauth.auth"].to_yaml + auth = request.env["omniauth.auth"] + user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) + session[:user_id] = user.id + redirect_to root_url + end + + def logout + session[:user_id] = nil + redirect_to root_url + end + + private + + def current_user + @current_user ||= User.find(session[:user_id]) if session[:user_id] + end +end diff --git a/app/controllers/lists_controller.rb b/app/controllers/lists_controller.rb new file mode 100644 index 0000000..7286f20 --- /dev/null +++ b/app/controllers/lists_controller.rb @@ -0,0 +1,86 @@ +class ListsController < ApplicationController + def index + # just render the view - Ember.js takes it from there + end + + def remove + client = Twitter::Client.new( + :oauth_token => current_user.token, + :oauth_token_secret => current_user.secret + ) + + begin + client.list_destroy(params[:list_id].to_i) + rescue + render :text => "There was an error saving your changes on Twitter: #{$!.message}", :status => :bad_gateway and return + end + + render :json => { 'message' => 'List was deleted!', 'id' => params[:list_id] } + end + + def merge + target = params[:targetList] + lists_to_merge = params[:listsToMerge] + new_list_name = params[:newListName] + merge_to_new = params[:mergeToNewList] == 'true' + delete_on_merge = params[:deleteOnMerge] == 'true' + users_to_add = [] + + client = Twitter::Client.new( + :oauth_token => current_user.token, + :oauth_token_secret => current_user.secret + ) + + # users have the option of merging to a new or existing list - create a new one if needed + if(merge_to_new) + if(new_list_name != '') + begin + new_list = client.list_create(new_list_name) + target = new_list.id + rescue + render :text => 'Users can only have a max of 20 lists on Twitter. Looks like you have too many to create your new merged list. If you delete a list and try again it should work. Sorry about that!', :status => :bad_gateway and return + end + else + render :text => 'You forgot to enter a name for your new list. Please try again.', :status => :unprocessable_entity and return + end + end + + # add user IDs from all lists - must grab from twitter in batches + lists_to_merge.each do |list_id| + cursor = "-1" + begin + while cursor != 0 do + list_members = client.list_members(list_id.to_i, { :cursor => cursor}) + users_to_add += list_members.users.collect { |user| user.id } + cursor = list_members.next_cursor + end + rescue + render :text => "There was an error getting list members from Twitter: #{$!.message}", :status => :bad_gateway and return + end + end + + # can only add 100 users at a time + while users_to_add.length > 0 + begin + client.list_add_members(target.to_i, users_to_add.slice!(0, 100)) + rescue Twitter::Error::BadGateway + next # silently ignore 502 errors since Twitter gem seems to throw them even when successful + rescue + render :text => "There was an error saving your changes on Twitter: #{$!.message}", :status => :bad_gateway and return + end + end + + # get updated member count for target list + updated_member_count = client.list(target.to_i).member_count + + # delete lists after successful merge, if option is selected + if(delete_on_merge) + lists_to_merge.each do |list_id| + client.list_destroy(list_id.to_i) + end + end + + render :json => { 'message' => 'Lists merged!', 'newListId' => target, 'updatedMemberCount' => updated_member_count } + end + +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/helpers/lists_helper.rb b/app/helpers/lists_helper.rb new file mode 100644 index 0000000..bf2e0db --- /dev/null +++ b/app/helpers/lists_helper.rb @@ -0,0 +1,2 @@ +module ListsHelper +end diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..6997fcb --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,14 @@ +class User < ActiveRecord::Base + + def self.create_with_omniauth(auth) + create! do |user| + user.provider = auth["provider"] + user.uid = auth["uid"] + user.screen_name = auth["info"]["nickname"] + user.name = auth["info"]["name"] + user.token = auth["credentials"]["token"] + user.secret = auth["credentials"]["secret"] + end + end + +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000..56989e3 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,43 @@ + + + + Listter + <%= stylesheet_link_tag "application", :media => "all" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + + + +
+ <% if current_user %> +
+ <%= image_tag "https://api.twitter.com/1/users/profile_image?screen_name=#{current_user.screen_name}&size=mini", :size => '24x24', :alt => current_user.screen_name %> + Welcome, <%= current_user.name %>! <%= link_to "Log Out", logout_path %> +
+ <% end %> + + <% if notice %> +
<%= notice %>
+ <% end %> + + <% if alert %> +
<%= alert %>
+ <% end %> + +

Listter

+ + <% if current_user %> + +

Don't worry, you'll be able to confirm all changes first, and nothing will be deleted unless you say so.

+ <% else %> +

The Twitter list management tool that Twitter probably has better things to do than maintain. Merge, copy, and delete your Twitter lists like a sad information hoarder boss!

+ <%= button_to 'Sign in with Twitter', 'auth/twitter', :class => 'primary-button' %> + <% end %> + + <%= yield %> +
+ + + diff --git a/app/views/lists/_merge-dialog.html.erb b/app/views/lists/_merge-dialog.html.erb new file mode 100644 index 0000000..8394002 --- /dev/null +++ b/app/views/lists/_merge-dialog.html.erb @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/app/views/lists/index.html.erb b/app/views/lists/index.html.erb new file mode 100644 index 0000000..efa2db5 --- /dev/null +++ b/app/views/lists/index.html.erb @@ -0,0 +1,15 @@ +
+ +
+ +<%= render 'merge-dialog' %> \ No newline at end of file diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..f330889 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Listter::Application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000..568c0e1 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,59 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +if defined?(Bundler) + # If you precompile assets before deploying to production, use this line + Bundler.require(*Rails.groups(:assets => %w(development test))) + # If you want your assets lazily compiled in production, use this line + # Bundler.require(:default, :assets, Rails.env) +end + +module Listter + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + # config.autoload_paths += %W(#{config.root}/extras) + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + # Use SQL instead of Active Record's schema dumper when creating the database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Enforce whitelist mode for mass assignment. + # This will create an empty whitelist of attributes available for mass-assignment for all models + # in your app. As such, your models will need to explicitly whitelist or blacklist accessible + # parameters by using an attr_accessible or attr_protected declaration. + # config.active_record.whitelist_attributes = true + + # Enable the asset pipeline + config.assets.enabled = true + + # Version of your assets, change this if you want to expire all your assets + config.assets.version = '1.0' + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..4489e58 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,6 @@ +require 'rubygems' + +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000..51a4dd4 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +development: + adapter: sqlite3 + database: db/development.sqlite3 + pool: 5 + timeout: 5000 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: sqlite3 + database: db/test.sqlite3 + pool: 5 + timeout: 5000 + +production: + adapter: sqlite3 + database: db/production.sqlite3 + pool: 5 + timeout: 5000 diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..bd124df --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the rails application +require File.expand_path('../application', __FILE__) + +# Initialize the rails application +Listter::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000..6f55dad --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,37 @@ +Listter::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # Only use best-standards-support built into browsers + config.action_dispatch.best_standards_support = :builtin + + # Raise exception on mass assignment protection for Active Record models + config.active_record.mass_assignment_sanitizer = :strict + + # Log the query plan for queries taking more than this (works + # with SQLite, MySQL, and PostgreSQL) + config.active_record.auto_explain_threshold_in_seconds = 0.5 + + # Do not compress assets + config.assets.compress = false + + # Expands the lines which load the assets + config.assets.debug = true +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000..97abc20 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,67 @@ +Listter::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # Code is not reloaded between requests + config.cache_classes = true + + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable Rails's static asset server (Apache or nginx will already do this) + config.serve_static_assets = false + + # Compress JavaScripts and CSS + config.assets.compress = true + + # Don't fallback to assets pipeline if a precompiled asset is missed + config.assets.compile = false + + # Generate digests for assets URLs + config.assets.digest = true + + # Defaults to Rails.root.join("public/assets") + # config.assets.manifest = YOUR_PATH + + # Specifies the header that your server uses for sending files + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Prepend all log lines with the following tags + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) + # config.assets.precompile += %w( search.js ) + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify + + # Log the query plan for queries taking more than this (works + # with SQLite, MySQL, and PostgreSQL) + # config.active_record.auto_explain_threshold_in_seconds = 0.5 +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000..365ee73 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,37 @@ +Listter::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Configure static asset server for tests with Cache-Control for performance + config.serve_static_assets = true + config.static_cache_control = "public, max-age=3600" + + # Log error messages when you accidentally call methods on nil + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Raise exception on mass assignment protection for Active Record models + config.active_record.mass_assignment_sanitizer = :strict + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr +end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000..5d8d9be --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,15 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end +# +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000..72aca7e --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000..227be0d --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,3 @@ +Rails.application.config.middleware.use OmniAuth::Builder do + provider :twitter, 'Xf4chFu45f7HBTFpVqmeQ', '34xT21j3Ba1xvZ7AOCUnHepw06N6FjZXfjsNp4vjg' +end \ No newline at end of file diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb new file mode 100644 index 0000000..57de14a --- /dev/null +++ b/config/initializers/secret_token.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Listter::Application.config.secret_token = '81409e461d66ede933418f8a8acae2f5c37f46bfb66bdb5281db36132ce2a576c47672a58ca087b8bee650e3e065f60ad2bb4cfedd9afc85653e9af08de92bf3' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 0000000..cf4ecd3 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +Listter::Application.config.session_store :cookie_store, key: '_listter_session' + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rails generate session_migration") +# Listter::Application.config.session_store :active_record_store diff --git a/config/initializers/twitter.rb b/config/initializers/twitter.rb new file mode 100644 index 0000000..f88222e --- /dev/null +++ b/config/initializers/twitter.rb @@ -0,0 +1,4 @@ +Twitter.configure do |config| + config.consumer_key = 'Xf4chFu45f7HBTFpVqmeQ' + config.consumer_secret = '34xT21j3Ba1xvZ7AOCUnHepw06N6FjZXfjsNp4vjg' +end \ No newline at end of file diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..999df20 --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# Disable root element in JSON by default. +ActiveSupport.on_load(:active_record) do + self.include_root_in_json = false +end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..179c14c --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,5 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + hello: "Hello world" diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..a083bc0 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,66 @@ +Listter::Application.routes.draw do + root :to => 'lists#index' + + match 'auth/twitter/callback' => 'application#login' + match 'logout' => 'application#logout', :as => 'logout' + match 'lists/new' => 'lists#new' + match 'lists/remove' => 'lists#remove', :via => :delete + match 'lists/merge' => 'lists#merge', :via => :post + + # The priority is based upon order of creation: + # first created -> highest priority. + + # Sample of regular route: + # match 'products/:id' => 'catalog#view' + # Keep in mind you can assign values other than :controller and :action + + # Sample of named route: + # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase + # This route can be invoked with purchase_url(:id => product.id) + + # Sample resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Sample resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Sample resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Sample resource route with more complex sub-resources + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', :on => :collection + # end + # end + + # Sample resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end + + # You can have the root of your site routed with "root" + # just remember to delete public/index.html. + # root :to => 'welcome#index' + + # See how all your routes lay out with "rake routes" + + # This is a legacy wild controller route that's not recommended for RESTful applications. + # Note: This route will make all actions in every controller accessible via GET requests. + # match ':controller(/:action(/:id))(.:format)' +end diff --git a/db/migrate/20120326163018_create_users.rb b/db/migrate/20120326163018_create_users.rb new file mode 100644 index 0000000..42afbaf --- /dev/null +++ b/db/migrate/20120326163018_create_users.rb @@ -0,0 +1,14 @@ +class CreateUsers < ActiveRecord::Migration + def change + create_table :users do |t| + t.string :provider + t.string :uid + t.string :screen_name + t.string :name + t.string :token + t.string :secret + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..1d0ce07 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,27 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20120326163018) do + + create_table "users", :force => true do |t| + t.string "provider" + t.string "uid" + t.string "screen_name" + t.string "name" + t.string "token" + t.string "secret" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000..4edb1e8 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) +# Mayor.create(name: 'Emanuel', city: cities.first) diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP new file mode 100644 index 0000000..fe41f5c --- /dev/null +++ b/doc/README_FOR_APP @@ -0,0 +1,2 @@ +Use this README file to introduce your application and point to useful places in the API for learning more. +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. diff --git a/lib/assets/.gitkeep b/lib/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/log/.gitkeep b/log/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..9a48320 --- /dev/null +++ b/public/404.html @@ -0,0 +1,26 @@ + + + + The page you were looking for doesn't exist (404) + + + + + +
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000..83660ab --- /dev/null +++ b/public/422.html @@ -0,0 +1,26 @@ + + + + The change you wanted was rejected (422) + + + + + +
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000..f3648a0 --- /dev/null +++ b/public/500.html @@ -0,0 +1,25 @@ + + + + We're sorry, but something went wrong (500) + + + + + +
+

We're sorry, but something went wrong.

+
+ + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..085187f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/script/rails b/script/rails new file mode 100755 index 0000000..f8da2cf --- /dev/null +++ b/script/rails @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. + +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) +require 'rails/commands' diff --git a/test/fixtures/.gitkeep b/test/fixtures/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000..9c112e5 --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + provider: MyString + uid: MyString + name: MyString + +two: + provider: MyString + uid: MyString + name: MyString diff --git a/test/functional/.gitkeep b/test/functional/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/functional/lists_controller_test.rb b/test/functional/lists_controller_test.rb new file mode 100644 index 0000000..3350f44 --- /dev/null +++ b/test/functional/lists_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ListsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/integration/.gitkeep b/test/integration/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb new file mode 100644 index 0000000..3fea27b --- /dev/null +++ b/test/performance/browsing_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' +require 'rails/performance_test_help' + +class BrowsingTest < ActionDispatch::PerformanceTest + # Refer to the documentation for all available options + # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory] + # :output => 'tmp/performance', :formats => [:flat] } + + def test_homepage + get '/' + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..8bf1192 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,13 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. + # + # Note: You'll currently still have to declare fixtures explicitly in integration tests + # -- they do not yet inherit this setting + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/test/unit/.gitkeep b/test/unit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/helpers/lists_helper_test.rb b/test/unit/helpers/lists_helper_test.rb new file mode 100644 index 0000000..39df203 --- /dev/null +++ b/test/unit/helpers/lists_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ListsHelperTest < ActionView::TestCase +end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb new file mode 100644 index 0000000..82f61e0 --- /dev/null +++ b/test/unit/user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/vendor/assets/javascripts/.gitkeep b/vendor/assets/javascripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/assets/javascripts/ember-0.9.5.min.js b/vendor/assets/javascripts/ember-0.9.5.min.js new file mode 100644 index 0000000..c8e0263 --- /dev/null +++ b/vendor/assets/javascripts/ember-0.9.5.min.js @@ -0,0 +1,13 @@ +// ========================================================================== +// Project: Ember - JavaScript Application Framework +// Copyright: ©2011-2012 Tilde Inc. and contributors +// Portions ©2006-2011 Strobe Inc. +// Portions ©2008-2011 Apple Inc. All rights reserved. +// License: Licensed under MIT license (see license.js) +// ========================================================================== + +(function(a){var b={};window.Handlebars=b,b.VERSION="1.0.beta.2",b.helpers={},b.partials={},b.registerHelper=function(a,b,c){c&&(b.not=c),this.helpers[a]=b},b.registerPartial=function(a,b){this.partials[a]=b},b.registerHelper("helperMissing",function(a){if(arguments.length===2)return undefined;throw new Error("Could not find property '"+a+"'")}),b.registerHelper("blockHelperMissing",function(a,b){var c=b.inverse||function(){},d=b.fn,e="",f=Object.prototype.toString.call(a);f==="[object Function]"&&(a=a());if(a===!0)return d(this);if(a===!1||a==null)return c(this);if(f==="[object Array]"){if(a.length>0)for(var g=0,h=a.length;g0)for(var f=0,g=a.length;f2&&z.push("'"+this.terminals_[w]+"'");var A="";this.lexer.showPosition?A="Parse error on line "+(h+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+z.join(", "):A="Parse error on line "+(h+1)+": Unexpected "+(p==1?"end of input":"'"+(this.terminals_[p]||p)+"'"),this.parseError(A,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:m,expected:z})}if(j==3){if(p==l)throw new Error(A||"Parsing halted.");i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,p=o()}for(;;){if(k.toString()in f[r])break;if(r==0)throw new Error(A||"Parsing halted.");n(1),r=c[c.length-1]}q=p,p=k,r=c[c.length-1],s=f[r]&&f[r][k],j=3}if(s[0]instanceof Array&&s.length>1)throw new Error("Parse Error: multiple actions possible at state: "+r+", token: "+p);switch(s[0]){case 1:c.push(p),d.push(this.lexer.yytext),e.push(this.lexer.yylloc),c.push(s[1]),p=null,q?(p=q,q=null):(i=this.lexer.yyleng,g=this.lexer.yytext,h=this.lexer.yylineno,m=this.lexer.yylloc,j>0&&j--);break;case 2:x=this.productions_[s[1]][1],v.$=d[d.length-x],v._$={first_line:e[e.length-(x||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(x||1)].first_column,last_column:e[e.length-1].last_column},u=this.performAction.call(v,g,i,h,this.yy,s[1],d,e);if(typeof u!="undefined")return u;x&&(c=c.slice(0,-1*x*2),d=d.slice(0,-1*x),e=e.slice(0,-1*x)),c.push(this.productions_[s[1]][0]),d.push(v.$),e.push(v._$),y=f[c[c.length-2]][c[c.length-1]],c.push(y);break;case 3:return!0}}return!0}},b=function(){var a={EOF:1,parseError:function b(a,b){if(this.yy.parseError)this.yy.parseError(a,b);else throw new Error(a)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.match+=a,this.matched+=a;var b=a.match(/\n/);return b&&this.yylineno++,this._input=this._input.slice(1),a},unput:function(a){return this._input=a+this._input,this},more:function(){return this._more=!0,this},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=(new Array(a.length+1)).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d;this._more||(this.yytext="",this.match="");var e=this._currentRules();for(var f=0;f/,/^\{\{#/,/^\{\{\//,/^\{\{\^/,/^\{\{\s*else\b/,/^\{\{\{/,/^\{\{&/,/^\{\{![\s\S]*?\}\}/,/^\{\{/,/^=/,/^\.(?=[} ])/,/^\.\./,/^[/.]/,/^\s+/,/^\}\}\}/,/^\}\}/,/^"(\\["]|[^"])*"/,/^true(?=[}\s])/,/^false(?=[}\s])/,/^[0-9]+(?=[}\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\s/.])/,/^\[.*\]/,/^./,/^$/],a.conditions={mu:{rules:[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!1},INITIAL:{rules:[0,1,25],inclusive:!0}},a}();return a.lexer=b,a}();typeof require!="undefined"&&typeof a!="undefined"&&(a.parser=c,a.parse=function(){return c.parse.apply(c,arguments)},a.main=function d(b){if(!b[1])throw new Error("Usage: "+b[0]+" FILE");if(typeof process!="undefined")var c=require("fs").readFileSync(require("path").join(process.cwd(),b[1]),"utf8");else var d=require("file").path(require("file").cwd()),c=d.join(b[1]).read({charset:"utf-8"});return a.parser.parse(c)},typeof module!="undefined"&&require.main===module&&a.main(typeof process!="undefined"?process.argv.slice(1):require("system").args)),b.Parser=c,b.parse=function(a){return b.Parser.yy=b.AST,b.Parser.parse(a)},b.print=function(a){return(new b.PrintVisitor).accept(a)},b.logger={DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){}},b.log=function(a,c){b.logger.log(a,c)},function(){b.AST={},b.AST.ProgramNode=function(a,c){this.type="program",this.statements=a,c&&(this.inverse=new b.AST.ProgramNode(c))},b.AST.MustacheNode=function(a,b,c){this.type="mustache",this.id=a[0],this.params=a.slice(1),this.hash=b,this.escaped=!c},b.AST.PartialNode=function(a,b){this.type="partial",this.id=a,this.context=b};var a=function(a,c){if(a.original!==c.original)throw new b.Exception(a.original+" doesn't match "+c.original)};b.AST.BlockNode=function(b,c,d){a(b.id,d),this.type="block",this.mustache=b,this.program=c},b.AST.InverseNode=function(b,c,d){a(b.id,d),this.type="inverse",this.mustache=b,this.program=c},b.AST.ContentNode=function(a){this.type="content",this.string=a},b.AST.HashNode=function(a){this.type="hash",this.pairs=a},b.AST.IdNode=function(a){this.type="ID",this.original=a.join(".");var b=[],c=0;for(var d=0,e=a.length;d":">",'"':""","'":"'","`":"`"},c=/&(?!\w+;)|[<>"'`]/g,d=/[&<>"'`]/,e=function(b){return a[b]||"&"};b.Utils={escapeExpression:function(a){return a instanceof b.SafeString?a.toString():a==null||a===!1?"":d.test(a)?a.replace(c,e):a},isEmpty:function(a){return typeof a=="undefined"?!0:a===null?!0:a===!1?!0:Object.prototype.toString.call(a)==="[object Array]"&&a.length===0?!0:!1}}}(),b.Compiler=function(){},b.JavaScriptCompiler=function(){},function(a,c){a.OPCODE_MAP={appendContent:1,getContext:2,lookupWithHelpers:3,lookup:4,append:5,invokeMustache:6,appendEscaped:7,pushString:8,truthyOrFallback:9,functionOrFallback:10,invokeProgram:11,invokePartial:12,push:13,assignToHash:15,pushStringParam:16},a.MULTI_PARAM_OPCODES={appendContent:1,getContext:1,lookupWithHelpers:2,lookup:1,invokeMustache:3,pushString:1,truthyOrFallback:1,functionOrFallback:1,invokeProgram:3,invokePartial:1,push:1,assignToHash:1,pushStringParam:1},a.DISASSEMBLE_MAP={};for(var d in a.OPCODE_MAP){var e=a.OPCODE_MAP[d];a.DISASSEMBLE_MAP[e]=d}a.multiParamSize=function(b){return a.MULTI_PARAM_OPCODES[a.DISASSEMBLE_MAP[b]]},a.prototype={compiler:a,disassemble:function(){var b=this.opcodes,c,d,e=[],f,g,h;for(var i=0,j=b.length;ithis.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),"stack"+this.stackSlot},popStack:function(){return"stack"+this.stackSlot--},topStack:function(){return"stack"+this.stackSlot},quotedString:function(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r")+'"'}};var f="break case catch continue default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with null true false".split(" "),g=c.RESERVED_WORDS={};for(var h=0,i=f.length;h0&&b.charAt(e-1)!==".")return i(i(a,b.slice(0,e)),b.slice(e+1));e=0;while(a&&e0&&b.charAt(h-1)!=="."?(a&&c(a,!1).proto!==a?a=i(a,b.slice(0,h)):a=null,b=b.slice(h+1)):a===window&&(g=o(b),a=d(a,g),b=b.slice(g.length+1));if(!b||b.length===0)throw new Error("Invalid Path");return j[0]=a,j[1]=b,j}var b=Ember.platform.hasPropertyAccessors&&Ember.ENV.USE_ACCESSORS;Ember.USE_ACCESSORS=!!b;var c=Ember.meta,d,e;d=function(a,b){b===undefined&&"string"==typeof a&&(b=a,a=Ember);if(!a)return undefined;var c=a[b];return c===undefined&&"function"==typeof a.unknownProperty&&(c=a.unknownProperty(b)),c},e=function(a,b,c){return"object"!=typeof a||b in a?a[b]=c:"function"==typeof a.setUnknownProperty?a.setUnknownProperty(b,c):"function"==typeof a.unknownProperty?a.unknownProperty(b,c):a[b]=c,c};if(!b){var f=d,g=e;d=function(a,b){b===undefined&&"string"==typeof a&&(b=a,a=Ember);if(!a)return undefined;var d=c(a,!1).descs[b];return d?d.get(a,b):f(a,b)},e=function(a,b,d){var e=c(a,!1).descs[b];return e?e.set(a,b,d):g(a,b,d),d}}Ember.get=d,Ember.set=e;var j=[],k=/^([A-Z$]|([0-9][A-Z$]))/,l=/^([A-Z$]|([0-9][A-Z$])).*[\.\*]/,m=/^this[\.\*]/,n=/^([^\.\*]+)/;Ember.normalizePath=h,Ember.normalizeTuple=function(a,b){return p(a,h(b))},Ember.normalizeTuple.primitive=p,Ember.getPath=function(a,b,c){var e,f,g,j,l;if(b==="")return a;!b&&"string"==typeof a&&(b=a,a=null,e=!0),g=b.indexOf("*")>-1;if(a===null&&!g&&b.indexOf(".")<0)return d(window,b);b=h(b),f=m.test(b);if(!a||f||g){var n=p(a,b);a=n[0],b=n[1],n.length=0}return l=i(a,b),l===undefined&&!e&&!f&&a!==window&&k.test(b)&&c!==!1?Ember.getPath(window,b):l},Ember.setPath=function(a,b,c,d){var e;arguments.length===2&&"string"==typeof a&&(c=b,b=a,a=null),b=h(b);if(b.indexOf("*")>0){var f=p(a,b);a=f[0],b=f[1],f.length=0}if(b.indexOf(".")>0)e=b.slice(b.lastIndexOf(".")+1),b=b.slice(0,b.length-(e.length+1)),b!=="this"&&(a=Ember.getPath(a,b,!1),!a&&k.test(b)&&(a=Ember.getPath(window,b)));else{if(k.test(b))throw new Error("Invalid Path");e=b}if(!e||e.length===0||e==="*")throw new Error("Invalid Path");if(!a){if(d)return;throw new Error("Object in path "+b+" could not be found or was destroyed.")}return Ember.set(a,e,c)},Ember.trySetPath=function(a,b,c){return arguments.length===2&&"string"==typeof a&&(c=b,b=a,a=null),Ember.setPath(a,b,c,!0)},Ember.isGlobalPath=function(a){return!m.test(a)&&k.test(a)}}({}),function(a){Array.prototype.map||(Array.prototype.map=function(a){"use strict";if(this===void 0||this===null)throw new TypeError;var b=Object(this),c=b.length>>>0;if(typeof a!="function")throw new TypeError;var d=new Array(c),e=arguments[1];for(var f=0;f>>0;if(typeof a!="function")throw new TypeError;var d=arguments[1];for(var e=0;e2&&(g=Ember.getPath(Ember.isGlobalPath(f)?window:e,f)),h.unshift(e,f,g),c.apply(b,h)}}function s(a,b,c){var d=c[0],e=p(c[1]),f;b.length>2&&(f=Ember.getPath(d,e)),b.call(a,d,e,f)}var b=":change",c=":before",d=Ember.guidFor,e=Ember.normalizePath,f=0,g=Array.prototype.slice,h=function(a){this.set={},a&&(this.array=[])};h.prototype.add=function(a,b){var c=this.set,d=Ember.guidFor(a),e;c[d]||(c[d]={}),c[d][b]=!0,(e=this.array)&&e.push([a,b])},h.prototype.contains=function(a,b){var c=this.set,d=Ember.guidFor(a),e=c[d];return e&&e[b]},h.prototype.empty=function(){this.set={},this.array=[]},h.prototype.forEach=function(a){var b=this.array;this.empty(),b.forEach(function(b){a(b[0],b[1])})};var i=new h(!0),j=new h;Ember.beginPropertyChanges=function(){return f++,this},Ember.endPropertyChanges=function(){f--,f<=0&&l()},Ember.changeProperties=function(a){Ember.beginPropertyChanges();try{a()}finally{Ember.endPropertyChanges()}};var r=q([]);Ember.addObserver=function(a,b,c,d){b=e(b);var f;if(arguments.length>4){var h=g.call(arguments,4);f=q(h)}else f=r;return Ember.addListener(a,m(b),c,d,f),Ember.watch(a,b),this},Ember.observersFor=function(a,b){return Ember.listenersFor(a,m(b))},Ember.removeObserver=function(a,b,c,d){return b=e(b),Ember.unwatch(a,b),Ember.removeListener(a,m(b),c,d),this},Ember.addBeforeObserver=function(a,b,c,d){return b=e(b),Ember.addListener(a,n(b),c,d,s),Ember.watch(a,b),this},Ember.beforeObserversFor=function(a,b){return Ember.listenersFor(a,n(b))},Ember.removeBeforeObserver=function(a,b,c,d){return b=e(b),Ember.unwatch(a,b),Ember.removeListener(a,n(b),c,d),this},Ember.notifyObservers=function(a,b){k(a,m(b))},Ember.notifyBeforeObservers=function(a,b){var c,d,e=!1;if(f)if(!j.contains(a,b))j.add(a,b),e=!0;else return;k(a,n(b),e)}}({}),function(a){function o(a,b,c){c=c||e(a,!1).values;if(c){var d=c[b];if(d!==undefined)return d;if(a.unknownProperty)return a.unknownProperty(b)}}function p(a,b,c){var d=e(a),f;return f=d.watching[b]>0&&c!==d.values[b],f&&Ember.propertyWillChange(a,b),d.values[b]=c,f&&Ember.propertyDidChange(a,b),c}function r(a){var b=q[a];return b||(b=q[a]=function(){return o(this,a)}),b}function t(a){var b=s[a];return b||(b=s[a]=function(b){return p(this,a,b)}),b}function u(a,b){return b==="toString"?"function"!=typeof a.toString:!!a[b]}var b=Ember.USE_ACCESSORS,c=Ember.GUID_KEY,d=Ember.META_KEY,e=Ember.meta,f=Ember.platform.create,g=Ember.platform.defineProperty,h,i,j={writable:!0,configurable:!0,enumerable:!0,value:null},k=Ember.Descriptor=function(){},l=k.setup=function(a,b,c){j.value=c,g(a,b,j),j.value=null},m=Ember.Descriptor.prototype;m.set=function(a,b,c){return a[b]=c,c},m.get=function(a,b){return o(a,b,a)},m.setup=l,m.teardown=function(a,b){return a[b]},m.val=function(a,b){return a[b]},b||(Ember.Descriptor.MUST_USE_GETTER=function(){!(this instanceof Ember.Object)},Ember.Descriptor.MUST_USE_SETTER=function(){this instanceof Ember.Object&&!this.isDestroyed});var n={configurable:!0,enumerable:!0,set:Ember.Descriptor.MUST_USE_SETTER},q={},s={};i=new Ember.Descriptor,Ember.platform.hasPropertyAccessors?(i.get=o,i.set=p,b?i.setup=function(a,b,c){n.get=r(b),n.set=t(b),g(a,b,n),n.get=n.set=null,c!==undefined&&(e(a).values[b]=c)}:i.setup=function(a,b,c){n.get=r(b),g(a,b,n),n.get=null,c!==undefined&&(e(a).values[b]=c)},i.teardown=function(a,b){var c=e(a).values[b];return delete e(a).values[b],c}):i.set=function(a,b,c){var d=e(a),f;return f=d.watching[b]>0&&c!==a[b],f&&Ember.propertyWillChange(a,b),a[b]=c,f&&Ember.propertyDidChange(a,b),c},Ember.SIMPLE_PROPERTY=new Ember.Descriptor,h=Ember.SIMPLE_PROPERTY,h.unwatched=i.unwatched=h,h.watched=i.watched=i,Ember.defineProperty=function(a,b,c,d){var f=e(a,!1),i=f.descs,j=f.watching[b]>0,k=!0;return d===undefined?(k=!1,d=u(i,b)?i[b].teardown(a,b):a[b]):u(i,b)&&i[b].teardown(a,b),c||(c=h),c instanceof Ember.Descriptor?(f=e(a,!0),i=f.descs,c=(j?c.watched:c.unwatched)||c,i[b]=c,c.setup(a,b,d,j)):(i[b]&&(e(a).descs[b]=null),g(a,b,c)),k&&j&&Ember.overrideChains(a,b,f),this},Ember.create=function(a,b){var e=f(a,b);return c in e&&Ember.generateGuid(e,"ember"),d in e&&Ember.rewatch(e),e},Ember.createPrototype=function(a,b){var g=f(a,b);return e(g,!0).proto=g,c in g&&Ember.generateGuid(g,"ember"),d in g&&Ember.rewatch(g),g}}({}),function(a){function n(a){return a.match(l)[0]}function o(a){return a==="*"||!m.test(a)}function q(a,c,d,e,f){var g=b(c);e[g]||(e[g]={});if(e[g][d])return;e[g][d]=!0;var h=f.deps;h=h&&h[d];if(h)for(var i in h){if(p[i])continue;a(c,i)}}function t(a,b,c){var d=r,e=!d;e&&(d=r={}),q(H,a,b,d,c),e&&(r=null)}function u(a,b,c){var d=s,e=!d;e&&(d=s={}),q(I,a,b,d,c),e&&(s=null)}function v(a,d,e){if(!a||"object"!=typeof a)return;var f=c(a),g=f.chainWatchers;if(!g||g.__emberproto__!==a)g=f.chainWatchers={__emberproto__:a};g[d]||(g[d]={}),g[d][b(e)]=e,Ember.watch(a,d)}function w(a,d,e){if(!a||"object"!=typeof a)return;var f=c(a,!1),g=f.chainWatchers;if(!g||g.__emberproto__!==a)return;g[d]&&delete g[d][b(e)],Ember.unwatch(a,d)}function y(a){if(x.length===0)return;var b=x;x=[],b.forEach(function(a){a[0].add(a[1])}),a!==!1&&x.length>0&&setTimeout(y,1)}function z(a){return c(a,!1).proto===a}function C(a){var b=c(a),d=b.chains;return d?d.value()!==a&&(d=b.chains=d.copy(a)):d=b.chains=new A(null,null,a),d}function D(a,b,c,d,e){var f=b.chainWatchers;if(!f||f.__emberproto__!==a)return;f=f[c];if(!f)return;for(var g in f){if(!f.hasOwnProperty(g))continue;f[g][d](e)}}function E(a,b,c){D(a,c,b,"willChange")}function F(a,b,c){D(a,c,b,"didChange")}var b=Ember.guidFor,c=Ember.meta,d=Ember.get,e=Ember.set,f=Ember.normalizeTuple.primitive,g=Ember.normalizePath,h=Ember.SIMPLE_PROPERTY,i=Ember.GUID_KEY,j=Ember.META_KEY,k=Ember.notifyObservers,l=/^([^\.\*]+)/,m=/[\.\*]/,p={__emberproto__:!0},r,s,x=[],A=function(a,b,c,d){var e;this._parent=a,this._key=b,this._watching=c===undefined,this._value=c,this._separator=d||".",this._paths={},this._watching&&(this._object=a.value(),this._object&&v(this._object,this._key,this)),this._parent&&this._parent._key==="@each"&&this.value()},B=A.prototype;B.value=function(){if(this._value===undefined&&this._watching){var a=this._parent.value();this._value=a&&!z(a)?d(a,this._key):undefined}return this._value},B.destroy=function(){if(this._watching){var a=this._object;a&&w(a,this._key,this),this._watching=!1}},B.copy=function(a){var b=new A(null,null,a,this._separator),c=this._paths,d;for(d in c)if(c[d]>0)b.add(d);else continue;return b},B.add=function(a){var b,c,d,e,g,h;h=this._paths,h[a]=(h[a]||0)+1,b=this.value(),c=f(b,a);if(c[0]&&c[0]===b)a=c[1],d=n(a),a=a.slice(d.length+1);else{if(!c[0]){x.push([this,a]),c.length=0;return}e=c[0],d=a.slice(0,0-(c[1].length+1)),g=a.slice(d.length,d.length+1),a=c[1]}c.length=0,this.chain(d,a,e,g)},B.remove=function(a){var b,c,d,e,g;g=this._paths,g[a]>0&&g[a]--,b=this.value(),c=f(b,a),c[0]===b?(a=c[1],d=n(a),a=a.slice(d.length+1)):(e=c[0],d=a.slice(0,0-(c[1].length+1)),a=c[1]),c.length=0,this.unchain(d,a)},B.count=0,B.chain=function(a,b,c,d){var e=this._chains,f;e||(e=this._chains={}),f=e[a],f||(f=e[a]=new A(this,a,c,d)),f.count++,b&&b.length>0&&(a=n(b),b=b.slice(a.length+1),f.chain(a,b))},B.unchain=function(a,b){var c=this._chains,d=c[a];b&&b.length>1&&(a=n(b),b=b.slice(a.length+1),d.unchain(a,b)),d.count--,d.count<=0&&(delete c[d._key],d.destroy())},B.willChange=function(){var a=this._chains;if(a)for(var b in a){if(!a.hasOwnProperty(b))continue;a[b].willChange()}this._parent&&this._parent.chainWillChange(this,this._key,1)},B.chainWillChange=function(a,b,c){this._key&&(b=this._key+this._separator+b),this._parent?this._parent.chainWillChange(this,b,c+1):(c>1&&Ember.propertyWillChange(this.value(),b),b="this."+b,this._paths[b]>0&&Ember.propertyWillChange(this.value(),b))},B.chainDidChange=function(a,b,c){this._key&&(b=this._key+this._separator+b),this._parent?this._parent.chainDidChange(this,b,c+1):(c>1&&Ember.propertyDidChange(this.value(),b),b="this."+b,this._paths[b]>0&&Ember.propertyDidChange(this.value(),b))},B.didChange=function(a){if(this._watching){var b=this._parent.value();b!==this._object&&(w(this._object,this._key,this),this._object=b,v(b,this._key,this)),this._value=undefined,this._parent&&this._parent._key==="@each"&&this.value()}var c=this._chains;if(c)for(var d in c){if(!c.hasOwnProperty(d))continue;c[d].didChange(a)}if(a)return;this._parent&&this._parent.chainDidChange(this,this._key,1)},Ember.overrideChains=function(a,b,c){D(a,c,b,"didChange",!0)};var G=Ember.SIMPLE_PROPERTY.watched;Ember.watch=function(a,b){if(b==="length"&&Ember.typeOf(a)==="array")return this;var d=c(a),e=d.watching,f;return b=g(b),e[b]?e[b]=(e[b]||0)+1:(e[b]=1,o(b)?(f=d.descs[b],f=f?f.watched:G,f&&Ember.defineProperty(a,b,f)):C(a).add(b)),this},Ember.isWatching=function(a,b){return!!c(a).watching[b]},Ember.watch.flushPending=y,Ember.unwatch=function(a,b){if(b==="length"&&Ember.typeOf(a)==="array")return this;var d=c(a).watching,e,f;return b=g(b),d[b]===1?(d[b]=0,o(b)?(e=c(a).descs[b],e=e?e.unwatched:h,e&&Ember.defineProperty(a,b,e)):C(a).remove(b)):d[b]>1&&d[b]--,this},Ember.rewatch=function(a){var b=c(a,!1),d=b.chains,e=b.bindings,f,g;i in a&&!a.hasOwnProperty(i)&&Ember.generateGuid(a,"ember"),d&&d.value()!==a&&C(a);if(e&&b.proto!==a)for(f in e)g=!p[f]&&a[f],g&&g instanceof Ember.Binding&&g.fromDidChange(a);return this};var H=Ember.propertyWillChange=function(a,b){var d=c(a,!1),e=d.proto,f=d.descs[b];if(e===a)return;f&&f.willChange&&f.willChange(a,b),t(a,b,d),E(a,b,d),Ember.notifyBeforeObservers(a,b)},I=Ember.propertyDidChange=function(a,b){var d=c(a,!1),e=d.proto,f=d.descs[b];if(e===a)return;f&&f.didChange&&f.didChange(a,b),u(a,b,d),F(a,b,d),Ember.notifyObservers(a,b)},J=[];Ember.destroy=function(a){var b=a[j],c,d,e,f;if(b){a[j]=null,c=b.chains;if(c){J.push(c);while(J.length>0){c=J.pop(),d=c._chains;if(d)for(e in d)d.hasOwnProperty(e)&&J.push(d[e]);c._watching&&(f=c._object,f&&w(f,c._key,c))}}}}}({}),function(a){function c(a,c,d,e){c===undefined&&(c=a,a=undefined),"string"==typeof c&&(c=a[c]),d&&e>0&&(d=d.length>e?b.call(d,e):null);if("function"!=typeof Ember.onerror)return c.apply(a||this,d||[]);try{return c.apply(a||this,d||[])}catch(f){Ember.onerror(f)}}function i(){h=null,g.currentRunLoop&&g.end()}function l(){var a=+(new Date),b=-1;for(var d in j){if(!j.hasOwnProperty(d))continue;var e=j[d];if(e&&e.expires)if(a>=e.expires)delete j[d],c(e.target,e.method,e.args,2);else if(b<0||e.expires0&&setTimeout(l,b- +(new Date))}function m(a,b){b[this.tguid]&&delete b[this.tguid][this.mguid],j[a]&&c(this.target,this.method,this.args,2),delete j[a]}function o(){n=null;for(var a in j){if(!j.hasOwnProperty(a))continue;var b=j[a];b.next&&(delete j[a],c(b.target,b.method,b.args,2))}}var b=Array.prototype.slice,d,e=function(){},f=function(a){var b;return this instanceof f?b=this:b=new e,b._prev=a||null,b.onceTimers={},b};e.prototype=f.prototype,f.prototype={end:function(){this.flush()},prev:function(){return this._prev},schedule:function(a,c,d){var e=this._queues,f;e||(e=this._queues={}),f=e[a],f||(f=e[a]=[]);var g=arguments.length>3?b.call(arguments,3):null;return f.push({target:c,method:d,args:g}),this},flush:function(a){function j(a){c(a.target,a.method,a.args)}var b=this._queues,e,f,g,h,i;if(!b)return this;Ember.watch.flushPending();if(a)while(this._queues&&(h=this._queues[a]))this._queues[a]=null,i=Ember.LOG_BINDINGS&&a==="sync",i&&Ember.Logger.log("Begin: Flush Sync Queue"),a==="sync"&&Ember.beginPropertyChanges(),h.forEach(j),a==="sync"&&Ember.endPropertyChanges(),i&&Ember.Logger.log("End: Flush Sync Queue");else{e=Ember.run.queues,g=e.length;do{this._queues=null;for(f=0;f1?b:a[0]:a}function k(a,b,c,d){var e=a._typeTransform;e&&(b=e(b,a._placeholder));var f=a._transforms,g=f?f.length:0,h;for(h=0;h("+this._from+" -> "+this._to+")"+a},connect:function(a){var b=this._oneWay,c=this._operand;return Ember.addObserver(a,this._from,this,this.fromDidChange),c&&Ember.addObserver(a,c,this,this.fromDidChange),b||Ember.addObserver(a,this._to,this,this.toDidChange),Ember.meta(a,!1).proto!==a&&this._scheduleSync(a,"fwd"),this._readyToSync=!0,this},disconnect:function(a){var b=this._oneWay,c=this._operand;return Ember.removeObserver(a,this._from,this,this.fromDidChange),c&&Ember.removeObserver(a,c,this,this.fromDidChange),b||Ember.removeObserver(a,this._to,this,this.toDidChange),this._readyToSync=!1,this},fromDidChange:function(a){this._scheduleSync(a,"fwd")},toDidChange:function(a){this._scheduleSync(a,"back")},_scheduleSync:function(a,b){var c=i(a),d=this[c];d||(Ember.run.schedule("sync",this,this._sync,a),this[c]=b),d==="back"&&b==="fwd"&&(this[c]="fwd")},_sync:function(a){var b=Ember.LOG_BINDINGS;if(a.isDestroyed||!this._readyToSync)return;var c=i(a),d=this[c],e=this._from,f=this._to;delete this[c];var g=n(a,this),h=o(a,this);if(h===g)return;d==="fwd"?(b&&Ember.Logger.log(" ",this.toString(),h,"->",g,a),Ember.trySetPath(Ember.isGlobalPath(f)?window:a,f,g)):d==="back"&&(b&&Ember.Logger.log(" ",this.toString(),h,"<-",g,a),Ember.trySetPath(Ember.isGlobalPath(e)?window:a,e,h))}},t(s,{from:function(){var a=this,b=new a;return b.from.apply(b,arguments)},to:function(){var a=this,b=new a;return b.to.apply(b,arguments)},oneWay:function(a,b){var c=this,d=new c(null,a);return d.oneWay(b)},single:function(a){var b=this,c=new b(null,a);return c.single()},multiple:function(a){var b=this,c=new b(null,a);return c.multiple()},transform:function(a){var b=this,c=new b;return c.transform(a)},notEmpty:function(a,b){var c=this,d=new c(null,a);return d.notEmpty(b)},bool:function(a){var b=this,c=new b(null,a);return c.bool()},not:function(a){var b=this,c=new b(null,a);return c.not()},and:function(a,b){var c=this,d=(new c(null,a)).oneWay();return d._operand=b,d._operation=p,d},or:function(a,b){var c=this,d=(new c(null,a)).oneWay();return d._operand=b,d._operation=q,d}}),Ember.Binding=s,Ember.bind=function(a,b,c){return(new Ember.Binding(b,c)).connect(a)},Ember.oneWay=function(a,b,c){return(new Ember.Binding(b,c)).oneWay().connect(a)}}({}),function(a){function h(a,c){var d=b(a),e,g;return e=d.deps,e?e.__emberproto__!==a&&(e=d.deps=f(e),e.__emberproto__=a):e=d.deps={__emberproto__:a},g=e[c],g?g.__emberproto__!==a&&(g=e[c]=f(g),g.__emberproto__=a):g=e[c]={__emberproto__:a},g}function i(a,b,c){var d=h(a,c);d[b]=(d[b]||0)+1,Ember.watch(a,c)}function j(a,b,c){var d=h(a,c);d[b]=(d[b]||0)-1,Ember.unwatch(a,c)}function k(a,b,c){var d=a._dependentKeys,e=d?d.length:0;for(var f=0;f0,j,k,l;return k=d._suspended,d._suspended=this,i=i&&h.lastSetValues[a]!==c(g),i&&(h.lastSetValues[a]=c(g),Ember.propertyWillChange(this,a)),e&&delete h.cache[a],j=f.call(this,a,g),e&&(h.cache[a]=j),i&&Ember.propertyDidChange(this,a),d._suspended=k,j}}var b=Ember.meta,c=Ember.guidFor,d=Ember.USE_ACCESSORS,e=Array.prototype.slice,f=Ember.platform.create,g=Ember.platform.defineProperty;Ember.ComputedProperty=l,l.prototype=new Ember.Descriptor;var m={configurable:!0,enumerable:!0,get:function(){return undefined},set:Ember.Descriptor.MUST_USE_SETTER},p=l.prototype;p.cacheable=function(a){return this._cacheable=a!==!1,this},p.property=function(){return this._dependentKeys=e.call(arguments),this},p.meta=function(a){return this._meta=a,this},p.setup=function(a,b,c){m.get=n(b,this),m.set=o(b,this),g(a,b,m),m.get=m.set=null,k(this,a,b)},p.teardown=function(a,c){var d=this._dependentKeys,e=d?d.length:0;for(var f=0;f0,i,j,k;return j=this._suspended,this._suspended=a,h=h&&g.lastSetValues[d]!==c(e),h&&(g.lastSetValues[d]=c(e),Ember.propertyWillChange(a,d)),f&&delete g.cache[d],i=this.func.call(a,d,e),f&&(g.cache[d]=i),h&&Ember.propertyDidChange(a,d),this._suspended=j,i},p.val=function(a,c){return b(a,!1).values[c]},Ember.platform.hasPropertyAccessors?d||(p.setup=function(a,b){g(a,b,m),k(this,a,b)}):p.setup=function(a,b,c){a[b]=undefined,k(this,a,b)},Ember.computed=function(a){return new l(a)}}({}),function(a){function g(a,b,c,e){var g=d(c);return f(a,["listeners",b,g],e)}function h(a,b){var d=c(a,!1).listeners;return d?d[b]||!1:!1}function j(a,b){for(var c in a){if(i[c])continue;var d=a[c];for(var e in d){if(i[e])continue;var f=d[e];if(!f)continue;var g=f.method,h=f.target;h||(h=b[0]),"string"==typeof g&&(g=h[g]);var j=f.xform;j?j(h,g,b):g.apply(h,b)}}}function k(a,b,c,e,f){!e&&"function"==typeof c&&(e=c,c=null);var h=g(a,b,c,!0),i=d(e),j;return h[i]?h[i].xform=f:h[i]={target:c,method:e,xform:f},"function"==typeof a.didAddListener&&a.didAddListener(b,c,e),j}function l(a,b,c,e){!e&&"function"==typeof c&&(e=c,c=null);var f=g(a,b,c,!0),h=d(e);f&&f[h]&&(f[h]=null),a&&"function"==typeof a.didRemoveListener&&a.didRemoveListener(b,c,e)}function m(a){var b=c(a,!1).listeners,d=[];if(b)for(var e in b)!i[e]&&b[e]&&d.push(e);return d}function n(a,b){a!==Ember&&"function"==typeof a.sendEvent&&a.sendEvent.apply(a,e.call(arguments,1));var c=h(a,b);return c?(j(c,arguments),!0):!1}function o(a,b){var c=h(a,b);if(!c)return!1;for(var d in c){if(i[d]||!c[d])continue;var e=c[d];for(var g in e){if(i[g]||!e[g])continue;return!0}}var j=f(a,["listeners"],!0);return j[b]=null,!1}function p(a,b){var c=h(a,b),d=[];if(!c)return d;var e;for(var f in c){if(i[f]||!c[f])continue;var g=c[f];for(var j in g){if(i[j]||!g[j])continue;e=g[j],d.push([e.target,e.method])}}return d}var b=Ember.platform.create,c=Ember.meta,d=Ember.guidFor,e=Array.prototype.slice,f=Ember.metaPath,i={__ember_source__:!0};Ember.addListener=k,Ember.removeListener=l,Ember.sendEvent=n,Ember.hasListeners=o,Ember.watchedEvents=m,Ember.listenersFor=p}({}),function(a){function m(a,b){var c=Ember.meta(a,b!==!1),d=c.mixins;return b===!1?d||j:(d?d.__emberproto__!==a&&(d=c.mixins=l(d),d.__emberproto__=a):d=c.mixins={__emberproto__:a},d)}function n(a,c){return c&&c.length>0&&(a.mixins=h.call(c,function(a){if(a instanceof b)return a;var c=new b;return c.properties=a,c})),a}function p(a){return"function"!=typeof a||a.isMethod===!1?!1:o.indexOf(a)<0}function q(a,c,e,f,g){function s(a){delete e[a],delete f[a]}var h=a.length,i,j,k,l,m,n,o,r;for(i=0;i=0||n==="concatenatedProperties"){var v=f[n]||g[n];m=v?v.concat(m):Ember.makeArray(m)}e[n]=Ember.SIMPLE_PROPERTY,f[n]=m}}l.hasOwnProperty("toString")&&(g.toString=l.toString)}else j.mixins&&(q(j.mixins,c,e,f,g),j._without&&j._without.forEach(s))}}function s(a){var b=Ember.meta(a),c=b.required;if(!c||c.__emberproto__!==a)c=b.required=c?l(c):{__ember_count__:0},c.__emberproto__=a;return c}function t(a){return"function"==typeof a&&a.__ember_observes__}function u(a){return"function"==typeof a&&a.__ember_observesBefore__}function v(a,b,f){var g={},h={},i=Ember.meta(a),j=i.required,l,n,o,p,v,w=Ember._mixinBindings;q(b,m(a),g,h,a),c.detect(a)&&(n=h.willApplyProperty||a.willApplyProperty,o=h.didApplyProperty||a.didApplyProperty);for(l in g){if(!g.hasOwnProperty(l))continue;v=g[l],p=h[l];if(v===d){if(!(l in a)){if(!f)throw new Error("Required property not defined: "+l);j=s(a),j.__ember_count__++,j[l]=!0}}else{while(v instanceof e){var x=v.methodName;g[x]?(p=h[x],v=g[x]):i.descs[x]?(v=i.descs[x],p=v.val(a,x)):(p=a[x],v=Ember.SIMPLE_PROPERTY)}n&&n.call(a,l);var y=t(p),z=y&&t(a[l]),A=u(p),B=A&&u(a[l]),C,D;if(z){C=z.length;for(D=0;D0){var E=[];for(l in j){if(k[l])continue;E.push(l)}throw new Error("Required properties not defined: "+E.join(","))}return a}function x(a,b,c){var d=Ember.guidFor(a);if(c[d])return!1;c[d]=!0;if(a===b)return!0;var e=a.mixins,f=e?e.length:0;while(--f>=0)if(x(e[f],b,c))return!0;return!1}function y(a,b,c){if(c[Ember.guidFor(b)])return;c[Ember.guidFor(b)]=!0;if(b.properties){var d=b.properties;for(var e in d)d.hasOwnProperty(e)&&(a[e]=!0)}else b.mixins&&b.mixins.forEach(function(b){y(a,b,c)})}function B(a,b,c){var d=a.length;for(var e in b){if(!b.hasOwnProperty||!b.hasOwnProperty(e))continue;var g=b[e];a[d]=e;if(g&&g.toString===f)g[z]=a.join(".");else if(g&&A(g,"isNamespace")){if(c[Ember.guidFor(g)])continue;c[Ember.guidFor(g)]=!0,B(a,g,c)}}a.length=d}function C(){var a=Ember.Namespace,b;if(a.PROCESSED)return;for(var c in window){if(c==="globalStorage"&&window.StorageList&&window.globalStorage instanceof window.StorageList)continue;if(c==="parent"||c==="top"||c==="frameElement"||c==="content")continue;if(window.hasOwnProperty&&!window.hasOwnProperty(c))continue;b=window[c],b&&A(b,"isNamespace")&&(b[z]=c)}}var b,c,d,e,f,g,h=Array.prototype.map,i=Array.prototype.slice,j={},k={__emberproto__:!0,__ember_count__:!0},l=Ember.platform.create,o=[Boolean,Object,Number,Array,Date,String],r=Ember.defineProperty;Ember._mixinBindings=function(a,b,c,d){return c},Ember.mixin=function(a){var b=i.call(arguments,1);return v(a,b,!1)},b=function(){return n(this,arguments)},b._apply=v,b.applyPartial=function(a){var b=i.call(arguments,1);return v(a,b,!0)},b.create=function(){f.processed=!1;var a=this;return n(new a,arguments)},b.prototype.reopen=function(){var a,c;this.properties&&(a=b.create(),a.properties=this.properties,delete this.properties,this.mixins=[a]);var d=arguments.length,e=this.mixins,f;for(f=0;f1&&(b=d.call(arguments,1)),this.forEach(function(d,e){var f=d&&d[a];"function"==typeof f&&(c[e]=b?f.apply(d,b):f.call(d))},this),c},toArray:function(){var a=[];return this.forEach(function(b,c){a[c]=b}),a},compact:function(){return this.without(null)},without:function(a){if(!this.contains(a))return this;var b=[];return this.forEach(function(c){c!==a&&(b[b.length]=c)}),b},uniq:function(){var a=[];return this.forEach(function(b){a.indexOf(b)<0&&a.push(b)}),a},"[]":Ember.computed(function(a,b){return this}).property().cacheable(),addEnumerableObserver:function(a,c){var d=c&&c.willChange||"enumerableWillChange",e=c&&c.didChange||"enumerableDidChange",f=b(this,"hasEnumerableObservers");return f||Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.addListener(this,"@enumerable:before",a,d,i),Ember.addListener(this,"@enumerable:change",a,e,i),f||Ember.propertyDidChange(this,"hasEnumerableObservers"),this},removeEnumerableObserver:function(a,c){var d=c&&c.willChange||"enumerableWillChange",e=c&&c.didChange||"enumerableDidChange",f=b(this,"hasEnumerableObservers");return f&&Ember.propertyWillChange(this,"hasEnumerableObservers"),Ember.removeListener(this,"@enumerable:before",a,d),Ember.removeListener(this,"@enumerable:change",a,e),f&&Ember.propertyDidChange(this,"hasEnumerableObservers"),this},hasEnumerableObservers:Ember.computed(function(){return Ember.hasListeners(this,"@enumerable:change")||Ember.hasListeners(this,"@enumerable:before")}).property().cacheable(),enumerableContentWillChange:function(a,c){var d,e,f;return"number"==typeof a?d=a:a?d=b(a,"length"):d=a=-1,"number"==typeof c?e=c:c?e=b(c,"length"):e=c=-1,f=e<0||d<0||e-d!==0,a===-1&&(a=null),c===-1&&(c=null),f&&Ember.propertyWillChange(this,"length"),Ember.sendEvent(this,"@enumerable:before",a,c),this},enumerableContentDidChange:function(a,c){var d=this.propertyDidChange,e,f,g;return"number"==typeof a?e=a:a?e=b(a,"length"):e=a=-1,"number"==typeof c?f=c:c?f=b(c,"length"):f=c=-1,g=f<0||e<0||f-e!==0,a===-1&&(a=null),c===-1&&(c=null),Ember.sendEvent(this,"@enumerable:change",a,c),g&&Ember.propertyDidChange(this,"length"),this}})}({}),function(a){function e(a){return a===null||a===undefined}function f(a,b,c){b.call(a,c[0],c[2],c[3],c[4])}var b=Ember.get,c=Ember.set,d=Ember.meta;Ember.Array=Ember.Mixin.create(Ember.Enumerable,{isSCArray:!0,length:Ember.required(),objectAt:function(a){return a<0||a>=b(this,"length")?undefined:b(this,a)},nextObject:function(a){return this.objectAt(a)},"[]":Ember.computed(function(a,c){return c!==undefined&&this.replace(0,b(this,"length"),c),this}).property().cacheable(),contains:function(a){return this.indexOf(a)>=0},slice:function(a,c){var d=[],f=b(this,"length");e(a)&&(a=0);if(e(c)||c>f)c=f;while(a=e)c=e-1;c<0&&(c+=e);for(d=c;d>=0;d--)if(this.objectAt(d)===a)return d;return-1},addArrayObserver:function(a,c){var d=c&&c.willChange||"arrayWillChange",e=c&&c.didChange||"arrayDidChange",g=b(this,"hasArrayObservers");return g||Ember.propertyWillChange(this,"hasArrayObservers"),Ember.addListener(this,"@array:before",a,d,f),Ember.addListener(this,"@array:change",a,e,f),g||Ember.propertyDidChange(this,"hasArrayObservers"),this},removeArrayObserver:function(a,c){var d=c&&c.willChange||"arrayWillChange",e=c&&c.didChange||"arrayDidChange",g=b(this,"hasArrayObservers");return g&&Ember.propertyWillChange(this,"hasArrayObservers"),Ember.removeListener(this,"@array:before",a,d,f),Ember.removeListener(this,"@array:change",a,e,f),g&&Ember.propertyDidChange(this,"hasArrayObservers"),this},hasArrayObservers:Ember.computed(function(){return Ember.hasListeners(this,"@array:change")||Ember.hasListeners(this,"@array:before")}).property().cacheable(),arrayContentWillChange:function(a,c,d){a===undefined?(a=0,c=d=-1):(c||(c=0),d||(d=0)),Ember.sendEvent(this,"@array:before",a,c,d);var e,f;if(a>=0&&c>=0&&b(this,"hasEnumerableObservers")){e=[],f=a+c;for(var g=a;g=0&&d>=0&&b(this,"hasEnumerableObservers")){e=[],f=a+d;for(var g=a;gd(this,"length"))throw new Error(b);return this.replace(a,0,[c]),this},removeAt:function(a,e){var f=0;if("number"==typeof a){if(a<0||a>=d(this,"length"))throw new Error(b);e===undefined&&(e=1),this.replace(a,e,c)}return this},pushObject:function(a){return this.insertAt(d(this,"length"),a),a},pushObjects:function(a){return this.replace(d(this,"length"),0,a),this},popObject:function(){var a=d(this,"length");if(a===0)return null;var b=this.objectAt(a-1);return this.removeAt(a-1,1),b},shiftObject:function(){if(d(this,"length")===0)return null;var a=this.objectAt(0);return this.removeAt(0),a},unshiftObject:function(a){return this.insertAt(0,a),a},unshiftObjects:function(a){return this.beginPropertyChanges(),a.forEach(function(a){this.unshiftObject(a)},this),this.endPropertyChanges(),this},removeObject:function(a){var b=d(this,"length")||0;while(--b>=0){var c=this.objectAt(b);c===a&&this.removeAt(b)}return this},addObject:function(a){return this.contains(a)||this.pushObject(a),this}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Observable=Ember.Mixin.create({isObserverable:!0,get:function(a){return b(this,a)},getProperties:function(){var a={};for(var c=0;c"}}),i.__super__=null;var j=Ember.Mixin.create({ClassMixin:Ember.required(),PrototypeMixin:Ember.required(),isClass:!0,isMethod:!1,extend:function(){var a=h(),b;a.ClassMixin=Ember.Mixin.create(this.ClassMixin),a.PrototypeMixin=Ember.Mixin.create(this.PrototypeMixin),a.ClassMixin.ownerConstructor=a,a.PrototypeMixin.ownerConstructor=a;var c=a.PrototypeMixin;return c.reopen.apply(c,arguments),a.superclass=this,a.__super__=this.prototype,b=a.prototype=f(this.prototype),b.constructor=a,Ember.generateGuid(b,"ember"),g(b).proto=b,Ember.rewatch(b),a.subclasses=Ember.Set?new Ember.Set:null,this.subclasses&&this.subclasses.add(a),a.ClassMixin.apply(a),a},create:function(){var a=this;return arguments.length>0&&this._initMixins(arguments),new a},reopen:function(){var a=this.PrototypeMixin;return a.reopen.apply(a,arguments),this._prototypeMixinDidChange(),this},reopenClass:function(){var a=this.ClassMixin;return a.reopen.apply(a,arguments),Ember.Mixin._apply(this,arguments,!1),this},detect:function(a){if("function"!=typeof a)return!1;while(a){if(a===this)return!0;a=a.superclass}return!1},detectInstance:function(a){return this.PrototypeMixin.detect(a)},metaForProperty:function(a){var b=g(e(this,"proto"),!1).descs[a];return b._meta||{}}});i.ClassMixin=j,j.apply(i),Ember.CoreObject=i}({}),function(a){function e(a,b,c,d){var f,g,h;if("object"!=typeof a||a===null)return a;if(b&&(g=c.indexOf(a))>=0)return d[g];if(Ember.typeOf(a)==="array"){f=a.slice();if(b){g=f.length;while(--g>=0)f[g]=e(f[g],b,c,d)}}else if(Ember.Copyable&&Ember.Copyable.detect(a))f=a.copy(b,c,d);else{f={};for(h in a){if(!a.hasOwnProperty(h))continue;f[h]=b?e(a[h],b,c,d):a[h]}}return b&&(c.push(a),d.push(f)),f}YES=!0,NO=!1,typeof console=="undefined"&&(window.console={},console.log=console.info=console.warn=console.error=function(){}),Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES!==!1;var b={},c="Boolean Number String Function Array Date RegExp Object".split(" ");c.forEach(function(a){b["[object "+a+"]"]=a.toLowerCase()});var d=Object.prototype.toString;Ember.typeOf=function(a){var c;return c=a==null?String(a):b[d.call(a)]||"object",c==="function"?Ember.Object&&Ember.Object.detect(a)&&(c="class"):c==="object"&&(a instanceof Error?c="error":Ember.Object&&a instanceof Ember.Object?c="instance":c="object"),c},Ember.none=function(a){return a===null||a===undefined},Ember.empty=function(a){return a===null||a===undefined||a.length===0&&typeof a!="function"},Ember.compare=function(a,b){if(a===b)return 0;var c=Ember.typeOf(a),d=Ember.typeOf(b),e=Ember.Comparable;if(e){if(c==="instance"&&e.detect(a.constructor))return a.constructor.compare(a,b);if(d==="instance"&&e.detect(b.constructor))return 1-b.constructor.compare(b,a)}var f=Ember.ORDER_DEFINITION_MAPPING;if(!f){var g=Ember.ORDER_DEFINITION;f=Ember.ORDER_DEFINITION_MAPPING={};var h,i;for(h=0,i=g.length;hk)return 1;switch(c){case"boolean":case"number":if(ab)return 1;return 0;case"string":var l=a.localeCompare(b);if(l<0)return-1;if(l>0)return 1;return 0;case"array":var m=a.length,n=b.length,o=Math.min(m,n),p=0,q=0,r=arguments.callee;while(p===0&&qn)return 1;return 0;case"instance":if(Ember.Comparable&&Ember.Comparable.detect(a))return a.compare(a,b);return 0;default:return 0}},Ember.copy=function(a,b){return"object"!=typeof a||a===null?a:Ember.Copyable&&Ember.Copyable.detect(a)?a.copy(b):e(a,b,b?[]:null,b?[]:null)},Ember.inspect=function(a){var b,c=[];for(var d in a)if(a.hasOwnProperty(d)){b=a[d];if(b==="toString")continue;Ember.typeOf(b)==="function"&&(b="function() { ... }"),c.push(d+": "+b)}return"{"+c.join(" , ")+"}"},Ember.isEqual=function(a,b){return a&&"function"==typeof a.isEqual?a.isEqual(b):a===b},Ember.ORDER_DEFINITION=Ember.ENV.ORDER_DEFINITION||["undefined","null","boolean","number","string","array","object","instance","function","class"],Ember.keys=Object.keys,Ember.keys||(Ember.keys=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}),Ember.Error=function(){var a=Error.prototype.constructor.apply(this,arguments);for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);this.message=a.message},Ember.Error.prototype=Ember.create(Error.prototype)}({}),function(a){var b=/[ _]/g,c={},d=/([a-z])([A-Z])/g,e=/(\-|_|\s)+(.)?/g,f=/([a-z\d])([A-Z]+)/g,g=/\-|\s+/g;Ember.STRINGS={},Ember.String={fmt:function(a,b){var c=0;return a.replace(/%@([0-9]+)?/g,function(a,d){return d=d?parseInt(d,0)-1:c++,a=b[d],(a===null?"(null)":a===undefined?"":a).toString()})},loc:function(a,b){return a=Ember.STRINGS[a]||a,Ember.String.fmt(a,b)},w:function(a){return a.split(/\s+/)},decamelize:function(a){return a.replace(d,"$1_$2").toLowerCase()},dasherize:function(a){var d=c,e=d[a];return e?e:(e=Ember.String.decamelize(a).replace(b,"-"),d[a]=e,e)},camelize:function(a){return a.replace(e,function(a,b,c){return c?c.toUpperCase():""})},underscore:function(a){return a.replace(f,"$1_$2").replace(g,"_").toLowerCase()}}}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Copyable=Ember.Mixin.create({copy:Ember.required(Function),frozenCopy:function(){if(Ember.Freezable&&Ember.Freezable.detect(this))return b(this,"isFrozen")?this:this.copy().freeze();throw new Error(Ember.String.fmt("%@ does not support freezing",[this]))}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Freezable=Ember.Mixin.create({isFrozen:!1,freeze:function(){return b(this,"isFrozen")?this:(c(this,"isFrozen",!0),this)}}),Ember.FROZEN_ERROR="Frozen object cannot be modified."}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.guidFor,e=Ember.none;Ember.Set=Ember.CoreObject.extend(Ember.MutableEnumerable,Ember.Copyable,Ember.Freezable,{length:0,clear:function(){if(this.isFrozen)throw new Error(Ember.FROZEN_ERROR);var a=b(this,"length");return this.enumerableContentWillChange(a,0),c(this,"length",0),this.enumerableContentDidChange(a,0),this},isEqual:function(a){if(!Ember.Enumerable.detect(a))return!1;var c=b(this,"length");if(b(a,"length")!==c)return!1;while(--c>=0)if(!a.contains(this[c]))return!1;return!0},add:Ember.alias("addObject"),remove:Ember.alias("removeObject"),pop:function(){if(b(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);var a=this.length>0?this[this.length-1]:null;return this.remove(a),a},push:Ember.alias("addObject"),shift:Ember.alias("pop"),unshift:Ember.alias("push"),addEach:Ember.alias("addObjects"),removeEach:Ember.alias("removeObjects"),init:function(a){this._super(),a&&this.addObjects(a)},nextObject:function(a){return this[a]},firstObject:Ember.computed(function(){return this.length>0?this[0]:undefined}).property("[]").cacheable(),lastObject:Ember.computed(function(){return this.length>0?this[this.length-1]:undefined}).property("[]").cacheable(),addObject:function(a){if(b(this,"isFrozen"))throw new Error(Ember.FROZEN_ERROR);if(e(a))return this;var f=d(a),g=this[f],h=b(this,"length"),i;return g>=0&&g=0&&g=0},copy:function(){var a=this.constructor,e=new a,f=b(this,"length");c(e,"length",f);while(--f>=0)e[f]=this[f],e[d(this[f])]=f;return e},toString:function(){var a=this.length,b,c=[];for(b=0;b".fmt(c.join(","))},isSet:!0});var f=Ember.Set.create;Ember.Set.create=function(a){return a&&Ember.Enumerable.detect(a)?new Ember.Set(a):f.apply(this,arguments)}}({}),function(a){Ember.CoreObject.subclasses=new Ember.Set,Ember.Object=Ember.CoreObject.extend(Ember.Observable)}({}),function(a){var b=Ember.get,c=Ember.set;Ember.ArrayProxy=Ember.Object.extend(Ember.MutableArray,{content:null,objectAtContent:function(a){return b(this,"content").objectAt(a)},replaceContent:function(a,c,d){b(this,"content").replace(a,c,d)},contentWillChange:Ember.beforeObserver(function(){var a=b(this,"content"),c=a?b(a,"length"):0;this.arrayWillChange(a,0,c,undefined),a&&a.removeArrayObserver(this)},"content"),contentDidChange:Ember.observer(function(){var a=b(this,"content"),c=a?b(a,"length"):0;a&&a.addArrayObserver(this),this.arrayDidChange(a,0,undefined,c)},"content"),objectAt:function(a){return b(this,"content")&&this.objectAtContent(a)},length:Ember.computed(function(){var a=b(this,"content");return a?b(a,"length"):0}).property("content.length").cacheable(),replace:function(a,c,d){return b(this,"content")&&this.replaceContent(a,c,d),this},arrayWillChange:function(a,b,c,d){this.arrayContentWillChange(b,c,d)},arrayDidChange:function(a,b,c,d){this.arrayContentDidChange(b,c,d)},init:function(){this._super(),this.contentDidChange()}})}({}),function(a){Ember.ArrayController=Ember.ArrayProxy.extend()}({}),function(a){}({}),function(a){var b=Ember.String.fmt,c=Ember.String.w,d=Ember.String.loc,e=Ember.String.camelize,f=Ember.String.decamelize,g=Ember.String.dasherize,h=Ember.String.underscore;Ember.EXTEND_PROTOTYPES&&(String.prototype.fmt=function(){return b(this,arguments)},String.prototype.w=function(){return c(this)},String.prototype.loc=function(){return d(this,arguments)},String.prototype.camelize=function(){return e(this)},String.prototype.decamelize=function(){return f(this)},String.prototype.dasherize=function(){return g(this)},String.prototype.underscore=function(){return h(this)})}({}),function(a){var b=Array.prototype.slice;Ember.EXTEND_PROTOTYPES&&(Function.prototype.property=function(){var a=Ember.computed(this);return a.property.apply(a,arguments)},Function.prototype.observes=function(){return this.__ember_observes__=b.call(arguments),this},Function.prototype.observesBefore=function(){return this.__ember_observesBefore__=b.call(arguments),this})}({}),function(a){var b=Ember.IS_BINDING=/^.+Binding$/;Ember._mixinBindings=function(a,c,d,e){if(b.test(c)){d instanceof Ember.Binding?d.to(c.slice(0,-7)):d=new Ember.Binding(c.slice(0,-7),d),d.connect(a);var f=e.bindings;f?f.__emberproto__!==a&&(f=e.bindings=Ember.create(e.bindings),f.__emberproto__=a):f=e.bindings={__emberproto__:a},f[c]=!0}return d}}({}),function(a){}({}),function(a){}({}),function(a){Ember.Comparable=Ember.Mixin.create({isComparable:!0,compare:Ember.required(Function)})}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.getPath;Ember.TargetActionSupport=Ember.Mixin.create({target:null,action:null,targetObject:Ember.computed(function(){var a=b(this,"target");if(Ember.typeOf(a)==="string"){var c=d(this,a,!1);return c===undefined&&(c=d(window,a)),c}return a}).property("target").cacheable(),triggerAction:function(){var a=b(this,"action"),c=b(this,"targetObject");if(c&&a){var d;return typeof c.send=="function"?d=c.send(a,this):(typeof a=="string"&&(a=c[a]),d=a.call(c,this)),d!==!1&&(d=!0),d}return!1}})}({}),function(a){}({}),function(a){Ember.Namespace=Ember.Object.extend({isNamespace:!0,init:function(){Ember.Namespace.NAMESPACES.push(this),Ember.Namespace.PROCESSED=!1},toString:function(){return Ember.identifyNamespaces(),this[Ember.GUID_KEY+"_name"]},destroy:function(){var a=Ember.Namespace.NAMESPACES;window[this.toString()]=undefined,a.splice(a.indexOf(this),1),this._super()}}),Ember.Namespace.NAMESPACES=[Ember],Ember.Namespace.PROCESSED=!1}({}),function(a){Ember.Application=Ember.Namespace.extend()}({}),function(a){function g(a,b,c,e,f){var g=c._objects,h;g||(g=c._objects={});while(--f>=e){var i=a.objectAt(f);i&&(Ember.addBeforeObserver(i,b,c,"contentKeyWillChange"),Ember.addObserver(i,b,c,"contentKeyDidChange"),h=d(i),g[h]||(g[h]=[]),g[h].push(f))}}function h(a,b,c,e,f){var g=c._objects;g||(g=c._objects={});var h,i;while(--f>=e){var j=a.objectAt(f);j&&(Ember.removeBeforeObserver(j,b,c,"contentKeyWillChange"),Ember.removeObserver(j,b,c,"contentKeyDidChange"),i=d(j),h=g[i],h[h.indexOf(f)]=null)}}var b=Ember.set,c=Ember.get,d=Ember.guidFor,e=Ember.Object.extend(Ember.Array,{init:function(a,b,c){this._super(),this._keyName=b,this._owner=c,this._content=a},objectAt:function(a){var b=this._content.objectAt(a);return b&&c(b,this._keyName)},length:Ember.computed(function(){var a=this._content;return a?c(a,"length"):0}).property("[]").cacheable()}),f=/^.+:(before|change)$/;Ember.EachProxy=Ember.Object.extend({init:function(a){this._super(),this._content=a,a.addArrayObserver(this),Ember.watchedEvents(this).forEach(function(a){this.didAddListener(a)},this)},unknownProperty:function(a,b){var c;return c=new e(this._content,a,this),(new Ember.Descriptor).setup(this,a,c),this.beginObservingContentKey(a),c},arrayWillChange:function(a,b,c,d){var e=this._keys,f,g,i;i=c>0?b+c:-1,Ember.beginPropertyChanges(this);for(f in e){if(!e.hasOwnProperty(f))continue;i>0&&h(a,f,this,b,i),Ember.propertyWillChange(this,f)}Ember.propertyWillChange(this._content,"@each"),Ember.endPropertyChanges(this)},arrayDidChange:function(a,b,c,d){var e=this._keys,f,h,i;i=d>0?b+d:-1,Ember.beginPropertyChanges(this);for(f in e){if(!e.hasOwnProperty(f))continue;i>0&&g(a,f,this,b,i),Ember.propertyDidChange(this,f)}Ember.propertyDidChange(this._content,"@each"),Ember.endPropertyChanges(this)},didAddListener:function(a){f.test(a)&&this.beginObservingContentKey(a.slice(0,-7))},didRemoveListener:function(a){f.test(a)&&this.stopObservingContentKey(a.slice(0,-7))},beginObservingContentKey:function(a){var b=this._keys;b||(b=this._keys={});if(!b[a]){b[a]=1;var d=this._content,e=c(d,"length");g(d,a,this,0,e)}else b[a]++},stopObservingContentKey:function(a){var b=this._keys;if(b&&b[a]>0&&--b[a]<=0){var d=this._content,e=c(d,"length");h(d,a,this,0,e)}},contentKeyWillChange:function(a,b){Ember.propertyWillChange(this,b)},contentKeyDidChange:function(a,b){Ember.propertyDidChange(this,b)}})}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.Mixin.create(Ember.MutableArray,Ember.Observable,Ember.Copyable,{get:function(a){return a==="length"?this.length:"number"==typeof a?this[a]:this._super(a)},objectAt:function(a){return this[a]},replace:function(a,c,d){if(this.isFrozen)throw Ember.FROZEN_ERROR;var e=d?b(d,"length"):0;this.arrayContentWillChange(a,c,e);if(!d||d.length===0)this.splice(a,c);else{var f=[a,c].concat(d);this.splice.apply(this,f)}return this.arrayContentDidChange(a,c,e),this},unknownProperty:function(a,b){var c;return b!==undefined&&c===undefined&&(c=this[a]=b),c},indexOf:function(a,b){var c,d=this.length;b===undefined?b=0:b=b<0?Math.ceil(b):Math.floor(b),b<0&&(b+=d);for(c=b;c=0;c--)if(this[c]===a)return c;return-1},copy:function(){return this.slice()}}),e=["length"];d.keys().forEach(function(a){Array.prototype[a]&&e.push(a)}),e.length>0&&(d=d.without.apply(d,e)),Ember.NativeArray=d,Ember.A=function(a){return a===undefined&&(a=[]),Ember.NativeArray.apply(a)},Ember.NativeArray.activate=function(){d.apply(Array.prototype),Ember.A=function(a){return a||[]}},Ember.EXTEND_PROTOTYPES&&Ember.NativeArray.activate()}({}),function(a){}({}),function(a){}({}),function(a){var b=Ember.get,c=Ember.set;Ember.RenderBuffer=function(a){return Ember._RenderBuffer.create({elementTag:a})},Ember._RenderBuffer=Ember.Object.extend({elementClasses:null,elementId:null,elementAttributes:null,elementTag:null,elementStyle:null,parentBuffer:null,init:function(){this._super(),c(this,"elementClasses",Ember.A()),c(this,"elementAttributes",{}),c(this,"elementStyle",{}),c(this,"childBuffers",[]),c(this,"elements",{})},push:function(a){return b(this,"childBuffers").push(String(a)),this},addClass:function(a){return b(this,"elementClasses").addObject(a),this},id:function(a){return c(this,"elementId",a),this},attr:function(a,c){var d=b(this,"elementAttributes");return arguments.length===1?d[a]:(d[a]=c,this)},removeAttr:function(a){var c=b(this,"elementAttributes");return delete c[a],this},style:function(a,c){return b(this,"elementStyle")[a]=c,this},newBuffer:function(a,b,c,d){var e=Ember._RenderBuffer.create({parentBuffer:b,elementTag:a});return d&&e.setProperties(d),c&&c.call(this,e),e},replaceWithBuffer:function(a){var c=b(this,"parentBuffer");if(!c)return;var d=b(c,"childBuffers"),e=d.indexOf(this);a?d.splice(e,1,a):d.splice(e,1)},begin:function(a){return this.newBuffer(a,this,function(a){b(this,"childBuffers").push(a)})},prepend:function(a){return this.newBuffer(a,this,function(a){b(this,"childBuffers").splice(0,0,a)})},replaceWith:function(a){var c=b(this,"parentBuffer");return this.newBuffer(a,c,function(a){this.replaceWithBuffer(a)})},insertAfter:function(a){var c=b(this,"parentBuffer");return this.newBuffer(a,c,function(a){var d=b(c,"childBuffers"),e=d.indexOf(this);d.splice(e+1,0,a)})},end:function(){var a=b(this,"parentBuffer");return a||this},remove:function(){this.replaceWithBuffer(null)},element:function(){return Ember.$(this.string())[0]},string:function(){var a=b(this,"elementId"),c=b(this,"elementClasses"),d=b(this,"elementAttributes"),e=b(this,"elementStyle"),f=b(this,"elementTag"),g="",h=[],i;if(f){var j=["<"+f];a&&j.push('id="'+a+'"'),c.length&&j.push('class="'+c.join(" ")+'"');if(!jQuery.isEmptyObject(e)){for(i in e)e.hasOwnProperty(i)&&h.push(i+":"+e[i]+";");j.push('style="'+h.join("")+'"')}for(i in d)d.hasOwnProperty(i)&&j.push(i+'="'+d[i]+'"');j=j.join(" ")+">"}var k=b(this,"childBuffers");return k.forEach(function(a){var b=typeof a=="string";g+=b?a:a.string()}),f?j+g+"":g}})}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.String.fmt;Ember.EventDispatcher=Ember.Object.extend({rootElement:"body",setup:function(a){var c,d={touchstart:"touchStart",touchmove:"touchMove",touchend:"touchEnd",touchcancel:"touchCancel",keydown:"keyDown",keyup:"keyUp",keypress:"keyPress",mousedown:"mouseDown",mouseup:"mouseUp",click:"click",dblclick:"doubleClick",mousemove:"mouseMove",focusin:"focusIn",focusout:"focusOut",mouseenter:"mouseEnter",mouseleave:"mouseLeave",submit:"submit",change:"change",dragstart:"dragStart",drag:"drag",dragenter:"dragEnter",dragleave:"dragLeave",dragover:"dragOver",drop:"drop",dragend:"dragEnd"};jQuery.extend(d,a||{});var e=Ember.$(b(this,"rootElement"));e.addClass("ember-application");for(c in d)d.hasOwnProperty(c)&&this.setupHandler(e,c,d[c])},setupHandler:function(a,b,c){var d=this;a.delegate(".ember-view",b+".ember",function(a,b){var e=Ember.View.views[this.id],f=!0,g=null;return g=d._findNearestEventManager(e,c),g&&g!==b?f=d._dispatchEvent(g,a,c,e):e?f=d._bubbleEvent(e,a,c):a.stopPropagation(),f})},_findNearestEventManager:function(a,c){var d=null;while(a){d=b(a,"eventManager");if(d&&d[c])break;a=b(a,"parentView")}return d},_dispatchEvent:function(a,b,c,d){var e=!0;return handler=a[c],Ember.typeOf(handler)==="function"?(e=handler.call(a,b,d),b.stopPropagation()):e=this._bubbleEvent(d,b,c),e},_bubbleEvent:function(a,b,c){return Ember.run(function(){return a.handleEvent(c,b)})},destroy:function(){var a=b(this,"rootElement");return Ember.$(a).undelegate(".ember").removeClass("ember-application"),this._super()}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Application=Ember.Namespace.extend({rootElement:"body",eventDispatcher:null,customEvents:null,init:function(){var a,d=b(this,"rootElement");this._super(),a=Ember.EventDispatcher.create({rootElement:d}),c(this,"eventDispatcher",a);if(Ember.$.isReady)this.didBecomeReady();else{var e=this;Ember.$(document).ready(function(){e.didBecomeReady()})}this._super()},didBecomeReady:function(){var a=b(this,"eventDispatcher"),c=b(this,"customEvents");a.setup(c),this.ready()},ready:Ember.K,destroy:function(){return b(this,"eventDispatcher").destroy(),this._super()}})}({}),function(a){var b=Ember.run.queues;b.splice(jQuery.inArray("actions",b)+1,0,"render")}({}),function(a){}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.addObserver,e=Ember.getPath,f=Ember.meta,g=Ember.String.fmt,h=Array.prototype.slice,i=Ember.computed(function(){var a=b(this,"_childViews"),c=Ember.A();return a.forEach(function(a){a.isVirtual?c.pushObjects(b(a,"childViews")):c.push(a)}),c}).property("_childViews.@each").cacheable();Ember.TEMPLATES={},Ember.View=Ember.Object.extend({concatenatedProperties:["classNames","classNameBindings","attributeBindings"],isView:YES,templateName:null,layoutName:null,templates:Ember.TEMPLATES,template:Ember.computed(function(a,c){if(c!==undefined)return c;var d=b(this,"templateName"),e=this.templateForName(d,"template");return e||b(this,"defaultTemplate")}).property("templateName").cacheable(),layout:Ember.computed(function(a,c){if(arguments.length===2)return c;var d=b(this,"layoutName"),e=this.templateForName(d,"layout");return e||b(this,"defaultLayout")}).property("layoutName").cacheable(),templateForName:function(a,c){if(!a)return;var d=b(this,"templates"),e=b(d,a);if(!e)throw new Ember.Error(g('%@ - Unable to find %@ "%@".',[this,c,a]));return e},templateContext:Ember.computed(function(a,b){return b!==undefined?b:this}).cacheable(),_parentView:null,parentView:Ember.computed(function(){var a=b(this,"_parentView");return a&&a.isVirtual?b(a,"parentView"):a}).property("_parentView"),concreteView:Ember.computed(function(){return this.isVirtual?b(this,"parentView"):this}).property("_parentView"),isVisible:null,childViews:i,_childViews:Ember.A(),nearestInstanceOf:function(a){var c=b(this,"parentView");while(c){if(c instanceof a)return c;c=b(c,"parentView")}},nearestWithProperty +:function(a){var c=b(this,"parentView");while(c){if(a in c)return c;c=b(c,"parentView")}},nearestChildOf:function(a){var c=b(this,"parentView");while(c){if(b(c,"parentView")instanceof a)return c;c=b(c,"parentView")}},collectionView:Ember.computed(function(){return this.nearestInstanceOf(Ember.CollectionView)}).cacheable(),itemView:Ember.computed(function(){return this.nearestChildOf(Ember.CollectionView)}).cacheable(),contentView:Ember.computed(function(){return this.nearestWithProperty("content")}).cacheable(),_parentViewDidChange:Ember.observer(function(){this.invokeRecursively(function(a){a.propertyDidChange("collectionView"),a.propertyDidChange("itemView"),a.propertyDidChange("contentView")})},"_parentView"),render:function(a){var c=b(this,"layout")||b(this,"template");if(c){var d=b(this,"templateContext"),e={view:this,buffer:a,isRenderData:!0},f=c(d,{data:e});f!==undefined&&a.push(f)}},invokeForState:function(a){var c=this,d=c.states,e=b(this,"state"),f;while(d){f=d[e];while(f){var g=f[a];if(g){var i=h.call(arguments,1);return i.unshift(this),g.apply(this,i)}f=f.parentState}d=d.parent}},rerender:function(){return this.invokeForState("rerender")},clearRenderedChildren:function(){var a=f(this)["Ember.View"],c=a.lengthBeforeRender,d=a.lengthAfterRender,e=b(this,"_childViews");for(var g=d-1;g>=c;g--)e[g]&&e[g].destroy()},_applyClassNameBindings:function(){var a=b(this,"classNameBindings"),c=b(this,"classNames"),e,f,g;if(!a)return;a.forEach(function(a){var b,h,i=function(){f=this._classStringForProperty(a),e=this.$(),b&&(e.removeClass(b),c.removeObject(b)),f?(e.addClass(f),b=f):b=null};g=this._classStringForProperty(a),g&&(c.push(g),b=g),h=a.split(":")[0],d(this,h,i)},this)},_applyAttributeBindings:function(a){var c=b(this,"attributeBindings"),e,f,g;if(!c)return;c.forEach(function(c){var g=function(){f=this.$(),e=b(this,c),Ember.View.applyAttributeBindings(f,c,e)};d(this,c,g),e=b(this,c),Ember.View.applyAttributeBindings(a,c,e)},this)},_classStringForProperty:function(a){var b=a.split(":"),a=b[0],c=b[1],d=Ember.getPath(this,a,!1);d===undefined&&Ember.isGlobalPath(a)&&(d=Ember.getPath(window,a));if(d===YES){if(c)return c;var e=a.split(".");return Ember.String.dasherize(e[e.length-1])}return d!==NO&&d!==undefined&&d!==null?d:null},element:Ember.computed(function(a,b){return b!==undefined?this.invokeForState("setElement",b):this.invokeForState("getElement")}).property("_parentView").cacheable(),$:function(a){return this.invokeForState("$",a)},mutateChildViews:function(a){var c=b(this,"_childViews"),d=b(c,"length"),e;while(--d>=0)e=c[d],a.call(this,e,d);return this},forEachChildView:function(a){var c=b(this,"_childViews");if(!c)return this;var d=b(c,"length"),e,f;for(f=0;f=0;h--)c[h].removedFromDOM=!0,c[h].destroy();return delete Ember.View.views[b(this,"elementId")],this},createChildView:function(a,d){if(Ember.View.detect(a)){a=a.create(d||{},{_parentView:this});var e=d&&d.viewName||a.viewName;e&&c(b(this,"concreteView"),e,a)}else c(a,"_parentView",this);return a},becameVisible:Ember.K,becameHidden:Ember.K,_isVisibleDidChange:Ember.observer(function(){var a=b(this,"isVisible");this.$().toggle(a);if(this._isAncestorHidden())return;a?this._notifyBecameVisible():this._notifyBecameHidden()},"isVisible"),_notifyBecameVisible:function(){this.becameVisible(),this.forEachChildView(function(a){var c=b(a,"isVisible");(c||c===null)&&a._notifyBecameVisible()})},_notifyBecameHidden:function(){this.becameHidden(),this.forEachChildView(function(a){var c=b(a,"isVisible");(c||c===null)&&a._notifyBecameHidden()})},_isAncestorHidden:function(){var a=b(this,"parentView");while(a){if(b(a,"isVisible")===!1)return!0;a=b(a,"parentView")}return!1},clearBuffer:function(){this.invokeRecursively(function(a){f(a)["Ember.View"].buffer=null})},transitionTo:function(a,b){c(this,"state",a),b!==!1&&this.forEachChildView(function(b){b.transitionTo(a)})},handleEvent:function(a,b){return this.invokeForState("handleEvent",a,b)}}),Ember.View.reopen({states:Ember.View.states,domManagerClass:Ember.Object.extend({view:this,prepend:function(a){var c=b(this,"view");a._insertElementLater(function(){var b=c.$();b.prepend(a.$())})},after:function(a){var c=b(this,"view");a._insertElementLater(function(){var b=c.$();b.after(a.$())})},replace:function(){var a=b(this,"view"),d=b(a,"element");c(a,"element",null),a._insertElementLater(function(){Ember.$(d).replaceWith(b(a,"element"))})},remove:function(){var a=b(this,"view"),d=b(a,"element");c(a,"element",null),Ember.$(d).remove()}})}),Ember.View.views={},Ember.View.childViewsProperty=i,Ember.View.applyAttributeBindings=function(a,b,c){var d=Ember.typeOf(c),e=a.attr(b);(d==="string"||d==="number"&&!isNaN(c))&&c!==e?a.attr(b,c):c&&d==="boolean"?a.attr(b,b):c||a.removeAttr(b)}}({}),function(a){var b=Ember.get,c=Ember.set;Ember.View.states={_default:{appendChild:function(){throw"You can't use appendChild outside of the rendering process"},$:function(){return Ember.$()},getElement:function(){return null},handleEvent:function(){return!0}}},Ember.View.reopen({states:Ember.View.states})}({}),function(a){Ember.View.states.preRender={parentState:Ember.View.states._default,insertElement:function(a,b){a.createElement(),a._notifyWillInsertElement(!0),b.call(a),a.transitionTo("inDOM"),a._notifyDidInsertElement()},$:function(a){return a._willInsertElementAccessUnsupported&&console.error("Getting element from willInsertElement is unreliable and no longer supported."),Ember.$()},getElement:function(a){return a._willInsertElementAccessUnsupported&&console.error("Getting element from willInsertElement is unreliable and no longer supported."),null},setElement:function(a,b){return a.beginPropertyChanges(),a.invalidateRecursively("element"),b!==null&&a.transitionTo("hasElement"),a.endPropertyChanges(),b}}}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.meta;Ember.View.states.inBuffer={parentState:Ember.View.states._default,$:function(a,b){return a.rerender(),Ember.$()},rerender:function(a){var b=d(a)["Ember.View"].buffer;a.clearRenderedChildren(),a.renderToBuffer(b,"replaceWith")},appendChild:function(a,c,e){var f=d(a)["Ember.View"].buffer;return c=this.createChildView(c,e),b(a,"_childViews").pushObject(c),c.renderToBuffer(f),c},destroyElement:function(a){return a.clearBuffer(),a._notifyWillDestroyElement(),a.transitionTo("preRender"),a},insertElement:function(){throw"You can't insert an element that has already been rendered"},setElement:function(a,b){return a.invalidateRecursively("element"),b===null?a.transitionTo("preRender"):(a.clearBuffer(),a.transitionTo("hasElement")),b}}}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.meta;Ember.View.states.hasElement={parentState:Ember.View.states._default,$:function(a,c){var d=b(a,"element");return c?Ember.$(c,d):Ember.$(d)},getElement:function(a){var c=b(a,"parentView");return c&&(c=b(c,"element")),c?a.findElementInParentElement(c):Ember.$("#"+b(a,"elementId"))[0]},setElement:function(a,b){if(b===null)a.invalidateRecursively("element"),a.transitionTo("preRender");else throw"You cannot set an element to a non-null value when the element is already in the DOM.";return b},rerender:function(a){return a.clearRenderedChildren(),b(a,"domManager").replace(),a},destroyElement:function(a){return a.invokeRecursively(function(a){this.willDestroyElement()}),b(a,"domManager").remove(),a},handleEvent:function(a,b,c){var d=a[b];return Ember.typeOf(d)==="function"?d.call(a,c):!0}},Ember.View.states.inDOM={parentState:Ember.View.states.hasElement,insertElement:function(){throw"You can't insert an element into the DOM that has already been inserted"}}}({}),function(a){var b="You can't call %@ on a destroyed view",c=Ember.String.fmt;Ember.View.states.destroyed={parentState:Ember.View.states._default,appendChild:function(){throw c(b,["appendChild"])},rerender:function(){throw c(b,["rerender"])},destroyElement:function(){throw c(b,["destroyElement"])},setElement:function(){throw c(b,["set('element', ...)"])},insertElement:Ember.K}}({}),function(a){}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.meta,e=Ember.computed(function(){return b(this,"_childViews")}).property("_childViews").cacheable();Ember.ContainerView=Ember.View.extend({init:function(){var a=b(this,"childViews");Ember.defineProperty(this,"childViews",e),this._super();var d=b(this,"_childViews");a.forEach(function(a,e){var f;"string"==typeof a?(f=b(this,a),f=this.createChildView(f),c(this,a,f)):f=this.createChildView(a),d[e]=f},this),b(this,"childViews").addArrayObserver(this,{willChange:"childViewsWillChange",didChange:"childViewsDidChange"})},render:function(a){this.forEachChildView(function(b){b.renderToBuffer(a)})},destroy:function(){b(this,"childViews").removeArrayObserver(this,{willChange:"childViewsWillChange",didChange:"childViewsDidChange"}),this._super()},childViewsWillChange:function(a,b,c){if(c===0)return;var d=a.slice(b,b+c);this.setParentView(d,null),this.invokeForState("childViewsWillChange",a,b,c)},childViewsDidChange:function(a,c,d,e){var f=b(a,"length");if(e===0)return;var g=a.slice(c,c+e);this.setParentView(g,this),this.invokeForState("childViewsDidChange",a,c,e)},setParentView:function(a,b){a.forEach(function(a){c(a,"_parentView",b)})},_scheduleInsertion:function(a,b){b?b.get("domManager").after(a):this.get("domManager").prepend(a)}}),Ember.ContainerView.states={parent:Ember.View.states,inBuffer:{childViewsDidChange:function(a,b,c,e){var f=d(a)["Ember.View"].buffer,g,h,i,j;c===0?(j=b[c],g=c+1,j.renderToBuffer(f,"prepend")):(j=b[c-1],g=c);for(var k=g;k=c;h--)f[h].destroy()},arrayDidChange:function(a,d,e,f){var g=b(this,"itemViewClass"),h=b(this,"childViews"),i=[],j,k,l,m,n;"string"==typeof g&&(g=Ember.getPath(g)),m=a?b(a,"length"):0;if(m)for(l=d;l0){d=g[g.length-1];while(g.length>0&&g[0]===f[0])g.shift(),f.shift()}c.routes[a]={exitStates:f,enterStates:g,futureState:d}}this.enterState(f,g,d)},getState:function(a){var c=b(this,a),d=b(this,"parentState");if(c)return c;if(d)return d.getState(a)},asyncEach:function(a,b,c){var d=!1,e=this;if(!a.length){c&&c.call(this);return}var f=a[0],g=a.slice(1),h={async:function(){d=!0},resume:function(){e.asyncEach(g,b,c)}};b.call(this,f,h),d||h.resume()},enterState:function(a,d,e){var f=this.enableLogging,g=this;a.reverse(),this.asyncEach(a,function(a,b){a.exit(g,b)},function(){this.asyncEach(d,function(a,c){f&&console.log("STATEMANAGER: Entering "+b(a,"path")),a.enter(g,c)},function(){var a=e,d,h;h=b(a,"initialState"),h||(h="start");while(a=b(b(a,"states"),h))d=a,f&&console.log("STATEMANAGER: Entering "+b(a,"path")),a.enter(g),h=b(a,"initialState"),h||(h="start");c(this,"currentState",d||e)})})}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.ViewState=Ember.State.extend({isViewState:!0,enter:function(a){var d=b(this,"view"),e,f;d&&(Ember.View.detect(d)&&(d=d.create(),c(this,"view",d)),e=a.get("rootView"),e?(f=b(e,"childViews"),f.pushObject(d)):(e=a.get("rootElement")||"body",d.appendTo(e)))},exit:function(a){var c=b(this,"view");c&&(b(c,"parentView")?c.removeFromParent():c.remove())}})}({}),function(a){}({}),function(a){(function(a){var b=function(){},c=0,d=a.document,e="createRange"in d&&typeof Range!="undefined"&&Range.prototype.createContextualFragment,f=function(){var a=d.createElement("div");return a.innerHTML="
",a.firstChild.innerHTML="",a.firstChild.innerHTML===""}(),g=function(a){var d;this instanceof g?d=this:d=new b,d.innerHTML=a;var e="metamorph-"+c++;return d.start=e+"-start",d.end=e+"-end",d};b.prototype=g.prototype;var h,i,j,k,l,m,n,o,p;k=function(){return this.startTag()+this.innerHTML+this.endTag()},o=function(){return""},p=function(){return""};if(e)h=function(a,b){var c=d.createRange(),e=d.getElementById(a.start),f=d.getElementById(a.end);return b?(c.setStartBefore(e),c.setEndAfter(f)):(c.setStartAfter(e),c.setEndBefore(f)),c},i=function(a,b){var c=h(this,b);c.deleteContents();var d=c.createContextualFragment(a);c.insertNode(d)},j=function(){var a=h(this,!0);a.deleteContents()},l=function(a){var b=d.createRange();b.setStart(a),b.collapse(!1);var c=b.createContextualFragment(this.outerHTML());a.appendChild(c)},m=function(a){var b=d.createRange(),c=d.getElementById(this.end);b.setStartAfter(c),b.setEndAfter(c);var e=b.createContextualFragment(a);b.insertNode(e)},n=function(a){var b=d.createRange(),c=d.getElementById(this.start);b.setStartAfter(c),b.setEndAfter(c);var e=b.createContextualFragment(a);b.insertNode(e)};else{var q={select:[1,""],fieldset:[1,"
","
"],table:[1,"","
"],tbody:[2,"","
"],tr:[3,"","
"],colgroup:[2,"","
"],map:[1,"",""],_default:[0,"",""]},r=function(a,b){var c=q[a.tagName.toLowerCase()]||q._default,e=c[0],g=c[1],h=c[2];f&&(b="­"+b);var i=d.createElement("div");i.innerHTML=g+b+h;for(var j=0;j<=e;j++)i=i.firstChild;if(f){var k=i;while(k.nodeType===1&&!k.nodeName&&k.childNodes.length===1)k=k.firstChild;k.nodeType===3&&k.nodeValue.charAt(0)==="­"&&(k.nodeValue=k.nodeValue.slice(1))}return i},s=function(a){while(a.parentNode.tagName==="")a=a.parentNode;return a},t=function(a,b){a.parentNode!==b.parentNode&&b.parentNode.insertBefore(a,b.parentNode.firstChild)};i=function(a,b){var c=s(d.getElementById(this.start)),e=d.getElementById(this.end),f=e.parentNode,g,h,i;t(c,e),g=c.nextSibling;while(g){h=g.nextSibling,i=g===e;if(i)if(b)e=g.nextSibling;else break;g.parentNode.removeChild(g);if(i)break;g=h}g=r(c.parentNode,a);while(g)h=g.nextSibling,f.insertBefore(g,e),g=h},j=function(){var a=s(d.getElementById(this.start)),b=d.getElementById(this.end);this.html(""),a.parentNode.removeChild(a),b.parentNode.removeChild(b)},l=function(a){var b=r(a,this.outerHTML());while(b)nextSibling=b.nextSibling,a.appendChild(b),b=nextSibling},m=function(a){var b=d.getElementById(this.end),c=b.nextSibling,e=b.parentNode,f,g;g=r(e,a);while(g)f=g.nextSibling,e.insertBefore(g,c),g=f},n=function(a){var b=d.getElementById(this.start),c=b.parentNode,e,f;f=r(c,a);var g=b.nextSibling;while(f)e=f.nextSibling,c.insertBefore(f,g),f=e}}g.prototype.html=function(a){this.checkRemoved();if(a===undefined)return this.innerHTML;i.call(this,a),this.innerHTML=a},g.prototype.replaceWith=function(a){this.checkRemoved(),i.call(this,a,!0)},g.prototype.remove=j,g.prototype.outerHTML=k,g.prototype.appendTo=l,g.prototype.after=m,g.prototype.prepend=n,g.prototype.startTag=o,g.prototype.endTag=p,g.prototype.isRemoved=function(){var a=d.getElementById(this.start),b=d.getElementById(this.end);return!a||!b},g.prototype.checkRemoved=function(){if(this.isRemoved())throw new Error("Cannot perform operations on a Metamorph that is not in the DOM.")},a.Metamorph=g})(this)}({}),function(a){Ember.Handlebars=Ember.create(Handlebars),Ember.Handlebars.helpers=Ember.create(Handlebars.helpers),Ember.Handlebars.Compiler=function(){},Ember.Handlebars.Compiler.prototype=Ember.create(Handlebars.Compiler.prototype),Ember.Handlebars.Compiler.prototype.compiler=Ember.Handlebars.Compiler,Ember.Handlebars.JavaScriptCompiler=function(){},Ember.Handlebars.JavaScriptCompiler.prototype=Ember.create(Handlebars.JavaScriptCompiler.prototype),Ember.Handlebars.JavaScriptCompiler.prototype.compiler=Ember.Handlebars.JavaScriptCompiler,Ember.Handlebars.JavaScriptCompiler.prototype.namespace="Ember.Handlebars",Ember.Handlebars.JavaScriptCompiler.prototype.initializeBuffer=function(){return"''"},Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer=function(a){return"data.buffer.push("+a+");"},Ember.Handlebars.Compiler.prototype.mustache=function(a){if(a.params.length||a.hash)return Handlebars.Compiler.prototype.mustache.call(this,a);var b=new Handlebars.AST.IdNode(["_triageMustache"]);return a.escaped&&(a.hash=a.hash||new Handlebars.AST.HashNode([]),a.hash.pairs.push(["escaped",new Handlebars.AST.StringNode("true")])),a=new Handlebars.AST.MustacheNode([b].concat([a.id]),a.hash,!a.escaped),Handlebars.Compiler.prototype.mustache.call(this,a)},Ember.Handlebars.precompile=function(a){var b=Handlebars.parse(a),c={data:!0,stringParams:!0},d=(new Ember.Handlebars.Compiler).compile(b,c);return(new Ember.Handlebars.JavaScriptCompiler).compile(d,c,undefined,!0)},Ember.Handlebars.compile=function(a){var b=Handlebars.parse(a),c={data:!0,stringParams:!0},d=(new Ember.Handlebars.Compiler).compile(b,c),e=(new Ember.Handlebars.JavaScriptCompiler).compile(d,c,undefined,!0);return Handlebars.template(e)},Ember.Handlebars.getPath=function(a,b){var c=Ember.getPath(a,b,!1);return c===undefined&&a!==window&&Ember.isGlobalPath(b)&&(c=Ember.getPath(window,b)),c},Ember.Handlebars.registerHelper("helperMissing",function(a,b){var c,d="";throw c="%@ Handlebars error: Could not find property '%@' on object %@.",b.data&&(d=b.data.view),new Ember.Error(Ember.String.fmt(c,[d,a,this]))})}({}),function(a){var b=Ember.set,c=Ember.get;Ember.Checkbox=Ember.View.extend({title:null,value:!1,disabled:!1,classNames:["ember-checkbox"],defaultTemplate:Ember.Handlebars.compile(''),change:function(){Ember.run.once(this,this._updateElementValue)},_updateElementValue:function(){var a=this.$("input:checkbox");b(this,"value",a.prop("checked"))}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.TextSupport=Ember.Mixin.create({value:"",attributeBindings:["placeholder","disabled"],placeholder:null,disabled:!1,insertNewline:Ember.K,cancel:Ember.K,focusOut:function(a){this._elementValueDidChange()},change:function(a){this._elementValueDidChange()},keyUp:function(a){this.interpretKeyEvents(a)},interpretKeyEvents:function(a){var b=Ember.TextSupport.KEY_EVENTS,c=b[a.keyCode];this._elementValueDidChange();if(c)return this[c](a)},_elementValueDidChange:function(){c(this,"value",this.$().val())}}),Ember.TextSupport.KEY_EVENTS={13:"insertNewline",27:"cancel"}}({}),function(a){var b=Ember.get,c=Ember.set;Ember.TextField=Ember.View.extend(Ember.TextSupport,{classNames:["ember-text-field"],tagName:"input",attributeBindings:["type","value"],type:"text"})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Button=Ember.View.extend(Ember.TargetActionSupport,{classNames:["ember-button"],classNameBindings:["isActive"],tagName:"button",propagateEvents:!1,attributeBindings:["type","disabled","href"],type:Ember.computed(function(a,b){var c=this.get("tagName");b!==undefined&&(this._type=b);if(this._type!==undefined)return this._type;if(c==="input"||c==="button")return"button"}).property("tagName").cacheable(),disabled:!1,href:Ember.computed(function(){return this.get("tagName")==="a"?"#":null}).property("tagName").cacheable(),mouseDown:function(){return b(this,"disabled")||(c(this,"isActive",!0),this._mouseDown=!0,this._mouseEntered=!0),b(this,"propagateEvents")},mouseLeave:function(){this._mouseDown&&(c(this,"isActive",!1),this._mouseEntered=!1)},mouseEnter:function(){this._mouseDown&&(c(this,"isActive",!0),this._mouseEntered=!0)},mouseUp:function(a){return b(this,"isActive")&&(this.triggerAction(),c(this,"isActive",!1)),this._mouseDown=!1,this._mouseEntered=!1,b(this,"propagateEvents")},keyDown:function(a){(a.keyCode===13||a.keyCode===32)&&this.mouseDown()},keyUp:function(a){(a.keyCode===13||a.keyCode===32)&&this.mouseUp()},touchStart:function(a){return this.mouseDown(a)},touchEnd:function(a){return this.mouseUp(a)}})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.TextArea=Ember.View.extend(Ember.TextSupport,{classNames:["ember-text-area"],tagName:"textarea",didInsertElement:function(){this._updateElementValue()},_updateElementValue:Ember.observer(function(){this.$().val(b(this,"value"))},"value")})}({}),function(a){Ember.TabContainerView=Ember.View.extend()}({}),function(a){var b=Ember.get,c=Ember.getPath;Ember.TabPaneView=Ember.View.extend({tabsContainer:Ember.computed(function(){return this.nearestInstanceOf(Ember.TabContainerView)}).property(),isVisible:Ember.computed(function(){return b(this,"viewName")===c(this,"tabsContainer.currentView")}).property("tabsContainer.currentView")})}({}),function(a){var b=Ember.get,c=Ember.setPath;Ember.TabView=Ember.View.extend({tabsContainer:Ember.computed(function(){return this.nearestInstanceOf(Ember.TabContainerView)}).property(),mouseUp:function(){c(this,"tabsContainer.currentView",b(this,"value"))}})}({}),function(a){}({}),function(a){var b=Ember.set,c=Ember.get,d=Ember.getPath;Ember.Select=Ember.View.extend({tagName:"select",template:Ember.Handlebars.compile('{{#if prompt}}{{/if}}{{#each content}}{{view Ember.SelectOption contentBinding="this"}}{{/each}}'),content:null,selection:null,prompt:null,optionLabelPath:"content",optionValuePath:"content",didInsertElement:function(){var a=c(this,"selection");a&&this.selectionDidChange(),this.change()},change:function(){var a=this.$()[0].selectedIndex,d=c(this,"content"),e=c(this,"prompt");if(!d)return;if(e&&a===0){b(this,"selection",null);return}e&&(a-=1),b(this,"selection",d.objectAt(a))},selectionDidChange:Ember.observer(function(){var a=this.$()[0],b=c(this,"content"),d=c(this,"selection"),e=b.indexOf(d),f=c(this,"prompt");f&&(e+=1),a&&(a.selectedIndex=e)},"selection")}),Ember.SelectOption=Ember.View.extend({tagName:"option",template:Ember.Handlebars.compile("{{label}}"),attributeBindings:["value"],init:function(){this.labelPathDidChange(),this.valuePathDidChange(),this._super()},labelPathDidChange:Ember.observer(function(){var a=d(this,"parentView.optionLabelPath");if(!a)return;Ember.defineProperty(this,"label",Ember.computed(function(){return d(this,a)}).property(a).cacheable())},"parentView.optionLabelPath"),valuePathDidChange:Ember.observer(function(){var a=d(this,"parentView.optionValuePath");if(!a)return;Ember.defineProperty(this,"value",Ember.computed(function(){return d(this,a)}).property(a).cacheable())},"parentView.optionValuePath")})}({}),function(a){}({}),function(a){var b=Ember.set,c=Ember.get,d=Ember.getPath;Ember.Metamorph=Ember.Mixin.create({isVirtual:!0,tagName:"",init:function(){this._super(),b(this,"morph",Metamorph())},beforeRender:function(a){var b=c(this,"morph");a.push(b.startTag())},afterRender:function(a){var b=c(this,"morph");a.push(b.endTag())},createElement:function(){var a=this.renderToBuffer();b(this,"outerHTML",a.string()),this.clearBuffer()},domManagerClass:Ember.Object.extend({remove:function(a){var b=d(this,"view.morph");if(b.isRemoved())return;d(this,"view.morph").remove()},prepend:function(a){var b=c(this,"view");a._insertElementLater(function(){var d=c(b,"morph");d.prepend(c(a,"outerHTML")),a.set("outerHTML",null)})},after:function(a){var b=c(this,"view");a._insertElementLater(function(){var d=c(b,"morph");d.after(c(a,"outerHTML")),a.set("outerHTML",null)})},replace:function(){var a=c(this,"view"),b=d(this,"view.morph");a.transitionTo("preRender"),a.clearRenderedChildren();var e=a.renderToBuffer();Ember.run.schedule("render",this,function(){if(c(a,"isDestroyed"))return;a.invalidateRecursively("element"),a._notifyWillInsertElement(),b.replaceWith(e.string()),a.transitionTo("inDOM"),a._notifyDidInsertElement()})}})})}({}),function(a){var b=Ember.get,c=Ember.set,d=Ember.Handlebars.getPath;Ember._BindableSpanView=Ember.View.extend(Ember.Metamorph,{shouldDisplayFunc:null,preserveContext:!1,displayTemplate:null,inverseTemplate:null,property:null,normalizedValue:Ember.computed(function(){var a=b(this,"property"),c=b(this,"previousContext"),e=b(this,"valueNormalizerFunc"),f;return a===""?f=c:f=d(c,a),e?e(f):f}).property("property","previousContext","valueNormalizerFunc"),rerenderIfNeeded:function(){!b(this,"isDestroyed")&&b(this,"normalizedValue")!==this._lastNormalizedValue&&this.rerender()},render:function(a){var d=b(this,"isEscaped"),e=b(this,"shouldDisplayFunc"),f=b(this,"preserveContext"),g=b(this,"previousContext"),h=b(this,"inverseTemplate"),i=b(this,"displayTemplate"),j=b(this,"normalizedValue");this._lastNormalizedValue=j;if(e(j)){c(this,"template",i);if(f)c(this,"templateContext",g);else if(i)c(this,"templateContext",j);else{j==null?j="":j=String(j),d&&(j=Handlebars.Utils.escapeExpression(j)),a.push(j);return}}else h?(c(this,"template",h),f?c(this,"templateContext",g):c(this,"templateContext",j)):c(this,"template",function(){return""});return this._super(a)}})}({}),function(a){var b=Ember +.get,c=Ember.Handlebars.getPath,d=Ember.set,e=Ember.String.fmt,f=Ember.Handlebars,g=f.helpers,g=f.helpers;(function(){var a=function(a,b,d,e,f){var g=b.data,h=b.fn,i=b.inverse,j=g.view,k=this;if("object"==typeof this){var l=j.createChildView(Ember._BindableSpanView,{preserveContext:d,shouldDisplayFunc:e,valueNormalizerFunc:f,displayTemplate:h,inverseTemplate:i,property:a,previousContext:k,isEscaped:b.hash.escaped});j.appendChild(l);var m=function(){Ember.run.once(l,"rerenderIfNeeded")};a!==""&&Ember.addObserver(k,a,m)}else g.buffer.push(c(this,a))};f.registerHelper("_triageMustache",function(a,b){return g[a]?g[a].call(this,b):g.bind.apply(this,arguments)}),f.registerHelper("bind",function(b,c){var d=c.contexts&&c.contexts[0]||this;return a.call(d,b,c,!1,function(a){return!Ember.none(a)})}),f.registerHelper("boundIf",function(c,d){var e=d.contexts&&d.contexts[0]||this,f=function(a){return Ember.typeOf(a)==="array"?b(a,"length")!==0:!!a};return a.call(e,c,d,!0,f,f)})})(),f.registerHelper("with",function(a,b){return g.bind.call(b.contexts[0],a,b)}),f.registerHelper("if",function(a,b){return g.boundIf.call(b.contexts[0],a,b)}),f.registerHelper("unless",function(a,b){var c=b.fn,d=b.inverse;return b.fn=d,b.inverse=c,g.boundIf.call(b.contexts[0],a,b)}),f.registerHelper("bindAttr",function(a){var b=a.hash,d=a.data.view,e=[],g=this,h=++jQuery.uuid,i=b["class"];if(i!==null&&i!==undefined){var j=f.bindClasses(this,i,d,h);e.push('class="'+j.join(" ")+'"'),delete b["class"]}var k=Ember.keys(b);return k.forEach(function(a){var f=b[a],i=c(g,f),j,k;j=function(){var b=c(g,f),e=d.$("[data-bindAttr-"+h+"='"+h+"']");if(e.length===0){Ember.removeObserver(g,f,k);return}Ember.View.applyAttributeBindings(e,a,b)},k=function(){Ember.run.once(j)},Ember.addObserver(g,f,k);var l=typeof i;l==="string"||l==="number"&&!isNaN(i)?e.push(a+'="'+i+'"'):i&&l==="boolean"&&e.push(a+'="'+a+'"')},this),e.push("data-bindAttr-"+h+'="'+h+'"'),new f.SafeString(e.join(" "))}),f.bindClasses=function(a,b,d,e){var f=[],g,h,i,j=function(b){var d=b.split(":"),e=d[1];b=d[0];var f=c(a,b);if(f===YES){if(e)return e;var g=b.split(".");return Ember.String.dasherize(g[g.length-1])}return f!==NO&&f!==undefined&&f!==null?f:null};return b.split(" ").forEach(function(b){var c,k,l;k=function(){g=j(b),i=e?d.$("[data-bindAttr-"+e+"='"+e+"']"):d.$(),i.length===0?Ember.removeObserver(a,b,l):(c&&i.removeClass(c),g?(i.addClass(g),c=g):c=null)},l=function(){Ember.run.once(k)},property=b.split(":")[0],Ember.addObserver(a,property,l),h=j(b),h&&(f.push(h),c=h)}),f}}({}),function(a){var b=Ember.get,c=Ember.set,d=/^parentView\./;Ember.Handlebars.ViewHelper=Ember.Object.create({viewClassFromHTMLOptions:function(a,b,c){var d={},e=b["class"],f=!1;b.id&&(d.elementId=b.id,f=!0),e&&(e=e.split(" "),d.classNames=e,f=!0),b.classBinding&&(d.classNameBindings=b.classBinding.split(" "),f=!0),f&&(b=jQuery.extend({},b),delete b.id,delete b["class"],delete b.classBinding);var g;for(var h in b){if(!b.hasOwnProperty(h))continue;Ember.IS_BINDING.test(h)&&(g=b[h],Ember.isGlobalPath(g)||(g==="this"?b[h]="bindingContext":b[h]="bindingContext."+g))}return d.bindingContext=c,a.extend(b,d)},helper:function(a,b,c){var d=c.inverse,e=c.data,f=e.view,g=c.fn,h=c.hash,i;"string"==typeof b?i=Ember.Handlebars.getPath(a,b):i=b,i=this.viewClassFromHTMLOptions(i,h,a);var j=e.view,k={};g&&(k.template=g),j.appendChild(i,k)}}),Ember.Handlebars.registerHelper("view",function(a,b){return a&&a.data&&a.data.isRenderData&&(b=a,a="Ember.View"),Ember.Handlebars.ViewHelper.helper(this,a,b)})}({}),function(a){var b=Ember.get,c=Ember.Handlebars.getPath,d=Ember.String.fmt;Ember.Handlebars.registerHelper("collection",function(a,d){a&&a.data&&a.data.isRenderData&&(d=a,a=undefined);var e=d.fn,f=d.data,g=d.inverse,h;h=a?c(this,a):Ember.CollectionView;var i=d.hash,j={},k,l,m=i.itemViewClass,n=b(h,"proto");delete i.itemViewClass,l=m?c(n,m):n.itemViewClass;for(var o in i)i.hasOwnProperty(o)&&(k=o.match(/^item(.)(.*)$/),k&&(j[k[1].toLowerCase()+k[2]]=i[o],delete i[o]));var p=i.tagName||b(h,"proto").tagName;e&&(j.template=e,delete d.fn);if(g&&g!==Handlebars.VM.noop){var q=Ember.View;i.emptyViewClass&&(q=Ember.View.detect(q)?i.emptyViewClass:c(this,i.emptyViewClass)),i.emptyView=q.extend({template:g,tagName:j.tagName})}return i.preserveContext&&(j.templateContext=Ember.computed(function(){return b(this,"content")}).property("content"),delete i.preserveContext),i.itemViewClass=Ember.Handlebars.ViewHelper.viewClassFromHTMLOptions(l,j),Ember.Handlebars.helpers.view.call(this,h,d)})}({}),function(a){var b=Ember.Handlebars.getPath;Ember.Handlebars.registerHelper("unbound",function(a,c){var d=c.contexts&&c.contexts[0]||this;return b(d,a)})}({}),function(a){var b=Ember.getPath;Ember.Handlebars.registerHelper("log",function(a,c){var d=c.contexts&&c.contexts[0]||this;Ember.Logger.log(b(d,a))}),Ember.Handlebars.registerHelper("debugger",function(){debugger})}({}),function(a){Ember.Handlebars.EachView=Ember.CollectionView.extend(Ember.Metamorph,{itemViewClass:Ember.View.extend(Ember.Metamorph)}),Ember.Handlebars.registerHelper("each",function(a,b){return b.hash.contentBinding=a,b.hash.preserveContext=!0,b.hash.itemTagName="",b.hash.emptyViewClass=Ember.View.extend(Ember.Metamorph),Ember.Handlebars.helpers.collection.call(this,"Ember.Handlebars.EachView",b)})}({}),function(a){Ember.Handlebars.registerHelper("template",function(a,b){var c=Ember.TEMPLATES[a];Ember.TEMPLATES[a](this,{data:b.data})})}({}),function(a){var b=Ember.Handlebars,c=Ember.Handlebars.getPath,d=b.ActionHelper={};d.registerAction=function(a,b,c,d,e){function h(b){if(Ember.$(b.target).closest("[data-ember-action]").attr("data-ember-action")===f)return b.preventDefault(),"function"==typeof c.send?c.send(a,{view:d,event:b,context:e}):c[a].call(c,d,b,e)}var f=(++jQuery.uuid).toString(),g=d[b];return g?d[b]=function(a){var b=h.call(d,a);return b!==!1?g.call(d,a):b}:d[b]=h,d.reopen({rerender:function(){return g?d[b]=g:d[b]=null,this._super()}}),f},b.registerHelper("action",function(a,e){var f=e.hash||{},g=e.hash.on||"click",h=e.data.view,i,j;h.isVirtual&&(h=h.get("parentView")),i=e.hash.target?c(this,e.hash.target):h,j=e.contexts[0];var k=d.registerAction(a,g,i,h,j);return new b.SafeString('data-ember-action="'+k+'"')})}({}),function(a){var b=Ember.get,c=Ember.set;Ember.Handlebars.registerHelper("yield",function(a){var c=a.data.view,d;while(c&&!b(c,"layout"))c=b(c,"parentView");d=b(c,"template"),d(this,a)})}({}),function(a){}({}),function(a){Ember.Handlebars.bootstrap=function(a){var b='script[type="text/x-handlebars"], script[type="text/x-raw-handlebars"]';Ember.ENV.LEGACY_HANDLEBARS_TAGS&&(b+=', script[type="text/html"]'),Ember.$(b,a).each(function(){var a=Ember.$(this),b=a.attr("type");if(b==="text/html"&&!Ember.ENV.LEGACY_HANDLEBARS_TAGS)return;var c=a.attr("type")==="text/x-raw-handlebars"?Ember.$.proxy(Handlebars.compile,Handlebars):Ember.$.proxy(Ember.Handlebars.compile,Ember.Handlebars),d=a.attr("data-template-name")||a.attr("id"),e=c(a.html()),f,g,h;if(d)Ember.TEMPLATES[d]=e,a.remove();else{if(a.parents("head").length!==0)throw new Ember.Error("Template found in without a name specified. Please provide a data-template-name attribute.\n"+a.html());g=a.attr("data-view"),f=g?Ember.getPath(g):Ember.View,h=a.attr("data-tag-name"),f=f.create({template:e,tagName:h?h:undefined}),f._insertElementLater(function(){a.replaceWith(this.$()),a=null})}})},Ember.$(document).ready(function(){Ember.Handlebars.bootstrap(Ember.$(document))})}({}),function(a){}({}),function(a){}({}) diff --git a/vendor/assets/javascripts/spin.min.js b/vendor/assets/javascripts/spin.min.js new file mode 100644 index 0000000..c38b40e --- /dev/null +++ b/vendor/assets/javascripts/spin.min.js @@ -0,0 +1,2 @@ +//fgnass.github.com/spin.js#v1.2.5 +(function(a,b,c){function g(a,c){var d=b.createElement(a||"div"),e;for(e in c)d[e]=c[e];return d}function h(a){for(var b=1,c=arguments.length;b>1):c.left+e)+"px",top:(c.top=="auto"?i.y-h.y+(a.offsetHeight>>1):c.top+e)+"px"})),d.setAttribute("aria-role","progressbar"),b.lines(d,b.opts);if(!f){var j=0,k=c.fps,m=k/c.speed,o=(1-c.opacity)/(m*c.trail/100),p=m/c.lines;!function q(){j++;for(var a=c.lines;a;a--){var e=Math.max(1-(j+a*p)%m*o,c.opacity);b.opacity(d,c.lines-a,e,c)}b.timeout=b.el&&setTimeout(q,~~(1e3/k))}()}return b},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=c),this},lines:function(a,b){function e(a,d){return l(g(),{position:"absolute",width:b.length+b.width+"px",height:b.width+"px",background:a,boxShadow:d,transformOrigin:"left",transform:"rotate("+~~(360/b.lines*c+b.rotate)+"deg) translate("+b.radius+"px"+",0)",borderRadius:(b.width>>1)+"px"})}var c=0,d;for(;c',b)}var b=l(g("group"),{behavior:"url(#default#VML)"});!k(b,"transform")&&b.adj?(i.addRule(".spin-vml","behavior:url(#default#VML)"),p.prototype.lines=function(b,c){function f(){return l(a("group",{coordsize:e+" "+e,coordorigin:-d+" "+ -d}),{width:e,height:e})}function k(b,e,g){h(i,h(l(f(),{rotation:360/c.lines*b+"deg",left:~~e}),h(l(a("roundrect",{arcsize:1}),{width:d,height:c.width,left:c.radius,top:-c.width>>1,filter:g}),a("fill",{color:c.color,opacity:c.opacity}),a("stroke",{opacity:0}))))}var d=c.length+c.width,e=2*d,g=-(c.width+c.length)*2+"px",i=l(f(),{position:"absolute",top:g,left:g}),j;if(c.shadow)for(j=1;j<=c.lines;j++)k(j,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(j=1;j<=c.lines;j++)k(j);return h(b,i)},p.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+dN1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png b/vendor/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png b/vendor/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png b/vendor/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png b/vendor/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/vendor/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Zv1V~E7mPmYTG^FX}c% zlGE{DS1Q;~I7-6ze&TN@+F-xsI6sd%SwK#*O5K|pDRZqEy< zJg0Nd8F@!OxqElm`~U#piM22@u@8B<moyKE%ct`B(jysxK+1m?G)UyIFs1t0}L zemGR&?jGaM1YQblj?v&@0iXS#fi-VbR9zLEnHLP?xQ|=%Ihrc7^yPWR!tW$yH!zrw z#I2}_!JnT^(qk)VgJr`NGdPtT^dmQIZc%=6nTAyJDXk+^3}wUOilJuwq>s=T_!9V) zr1)DT6VQ2~rgd@!Jlrte3}}m~j}juCS`J4(d-5+e-3@EzzTJNCE2z)w(kJ90z*QE) zBtnV@4mM>jTrZZ*$01SnGov0&=A-JrX5Ge%Pce1Vj}=5YQqBD^W@n4KmFxxpFK`uH zP;(xKV+6VJ2|g+?_Lct7`uElL<&jzGS8Gfva2+=8A@#V+xsAj9|Dkg)vL5yhX@~B= zN2KZSAUD%QH`x>H+@Ou(D1~Pyv#0nc&$!1kI?IO01yw3jD0@80qvc?T*Nr8?-%rC8 z@5$|WY?Hqp`ixmEkzeJTz_`_wsSRi1%Zivd`#+T{Aib6-rf$}M8sz6v zb6ERbr-SniO2wbOv!M4)nb}6UVzoVZEh5kQWh_5x4rYy3c!871NeaM(_p=4(kbS6U#x<*k8Wg^KHs2ttCz<+pBxQ$Z zQMv;kVm5_fF_vH`Mzrq$Y&6u?j6~ftIV0Yg)Nw7JysIN_ z-_n*K_v1c&D}-1{NbBwS2h#m1y0a5RiEcYil+58$8IDh49bPnzE7R8In6P%V{2IZU z7#clr=V4yyrRe@oXNqbqo^^LvlLE?%8XaI&N(Np90-psU}7kqmbWk zZ;YBwJNnNs$~d!mx9oMGyT( znaBoj0d}gpQ^aRr?6nW)$4god*`@Uh2e+YpS@0(Mw{|z|6ko3NbTvDiCu3YO+)egL z>uW(^ahKFj>iJ-JF!^KhKQyPTznJa;xyHYwxJgr16&Wid_9)-%*mEwo{B_|M9t@S1 zf@T@q?b2Qgl!~_(Roe;fdK)y|XG0;ls;ZbT)w-aOVttk#daQcY7$cpY496H*`m@+L zeP#$&yRbBjFWv}B)|5-1v=(66M_;V1SWv6MHnO}}1=vby&9l+gaP?|pXwp0AFDe#L z&MRJ^*qX6wgxhA_`*o=LGZ>G_NTX%AKHPz4bO^R72ZYK}ale3lffDgM8H!Wrw{B7A z{?c_|dh2J*y8b04c37OmqUw;#;G<* z@nz@dV`;7&^$)e!B}cd5tl0{g(Q>5_7H^@bEJi7;fQ4B$NGZerH#Ae1#8WDTH`iB&) zC6Et3BYY#mcJxh&)b2C^{aLq~psFN)Q1SucCaBaBUr%5PYX{~-q{KGEh)*;n;?75k z=hq%i^I}rd;z-#YyI`8-OfMpWz5kgJE3I!3ean6=UZi!BxG7i(YBk? z02HM7wS0)Wni{dWbQMRtd-A)_Az!t>F;IwWf~!*)-Az4}yryNkz&9)w>ElA80Oc`6 zHo#9H!Y3*Qx9n@Jn)!w6G^hb;e_n8zpIyXCN`JFkPc)^Q?2MsLNFhMgrcZI-<#1ne zjH;KFf?4eAT9mQZ}ZfHLGA#d%s;SZK4p0FwZT2S^{ zQ2BG1xJsbK6?yrHTjJi|5C0u=!|r!?*4FL%y%3q#(d+e>b_2I9!*iI!30}42Ia0bq zUf`Z?LGSEvtz8s``Tg5o_CP(FbR0X$FlE0yCnB7suDPmI2=yOg^*2#cY9o`X z;NY-3VBHZjnVcGS){GZ98{e+lq~O$u6pEcgd0CrnIsWffN1MbCZDH<7c^hv+Z0Ucf0{w zSzi^qKuUHD9Dgp0EAGg@@$zr32dQx>N=ws`MESEsmzgT2&L;?MSTo&ky&!-JR3g~1 zPGTt515X)wr+Bx(G9lWd;@Y3^Vl}50Wb&6-Tiy;HPS0drF`rC}qYq22K4)G#AoD0X zYw$E+Bz@Zr^50MAwu@$?%f9$r4WHH?*2|67&FXFhXBrVFGmg)6?h3^-1?t;UzH0*I zNVf9wQLNLnG2@q>6CGm>&y|lC`iCFfYd}9i%+xkl^5oBJ?<;aneCfcHqJh7Yl5uLS z9Fx-(kMdcNyZejXh22N{mCw_rX1O!cOE&3>e(ZH81PR95wQC37En4O{w;{3q9n1t&;p)D%&Z%Nw$gSPa!nz8Slh7=ko2am)XARwOWw zpsz0~K!s{(dM$NB=(A=kkp>T(*yU6<_dwIx>cH4+LWl282hXa6-EUq>R3t?G2623< z*RwTN%-fgBmD{fu*ejNn)1@KG?Sg*8z3hYtkQJQjB6 zQ|x>wA=o$=O)+nLmgTXW3_6diA;b4EY{*i*R%6dO2EMg z@6g?M3rpbnfB@hOdUeb96=~I?OIA3@BWAGmTwiQ{x5Cqq<8c10L!P zd@Qk^BseTX%$Q7^s}5n%HB|)gKx}H$d8Sb$bBnq9-AglT2dGR2(+I;_fL|R4p$odJ zllfb0NqI)7=^z~qAm1V{(PkpxXsQ#4*NH9yYZ`Vf@)?#ueGgtCmGGY|9U#v|hRdg- zQ%0#cGIfXCd{Y)JB~qykO;KPvHu|5Ck&(Hn%DF~cct@}j+87xhs2ew;fLm5#2+mb| z8{9e*YI(u|gt|{x1G+U=DA3y)9s2w7@cvQ($ZJIA)x$e~5_3LKFV~ASci8W}jF&VeJoPDUy(BB>ExJpck;%;!`0AAo zAcHgcnT8%OX&UW_n|%{2B|<6Wp2MMGvd5`T2KKv;ltt_~H+w00x6+SlAD`{K4!9zx z*1?EpQ%Lwiik){3n{-+YNrT;fH_niD_Ng9|58@m8RsKFVF!6pk@qxa{BH-&8tsim0 zdAQ(GyC^9ane7_KW*#^vMIoeQdpJqmPp%%px3GIftbwESu#+vPyI*YTuJ6+4`z{s? zpkv~0x4c_PFH`-tqafw5)>4AuQ78SkZ!$8}INLK;Egr;2tS18hEO5=t;QDmZ-qu?I zG+=DN`nR72Xto{{bJp||`k}-2G;5#xg8E~xgz22)^_Z;=K|4@(E&5J)SY2of=olcw z5)@L)_Ntcm!*5nEy0M9v0`S33;pO4TN;>4(Z+19p_0>u#e-vE zXCU(6gAvu~I7Cw(xd%0e59MNLw^U37ZDbsBrj%eDCexw8a3G`nTcXVNL6{B7Hj@i& zbVB{;ApEtHk76q08DJ48dSxd$C(;$K6=FpU<~l9pVoT9arW^Vu{%Bcn4`eIpkOVC| z$)AKYG_`ypM{0@BUb3^9lqi_c?ONH|4UJMJWDowMVjacycX7}9g={O7swOB+{;+?; zjBo!9?+nd)ie#x5IbFW-zBOo0c4q@9wGVt5;pNt`=-~Zgcw#*`m($6ibxtZ`H=e=} zF#GZ~5$%AUn};8U#tRem0J(JTR}d4vR(dgK2ML~lZsPhayJ2h1%sD4FVst| zKF)+@`iNzLRjg4=K8@**0=5cE>%?FDc({I^+g9USk<8$&^qD~@%W0i4b|yMG*p4`N zh}I!ltTRI8Ex$+@V{02Br%xq#O?UlhO{r8WsaZnZCZq0MK9%AXU%MDLT;3=0A9(BV z9VxxxJd7jo$hw3q;3o?yBLmA=azBUrd9>-<_ANs0n3?-Ic*6&ytb@H~?0E(*d>T5n z-HiH2jsDf6uWhID%#n>SzOqrFCPDfUcu5QPd?<(=w6pv1BE#nsxS{n!UnC9qAha1< z;3cpZ9A-e$+Y)%b;w@!!YRA9p%Kf9IHGGg^{+p`mh;q8i7}&e@V3EQaMsItEMS&=X plT@$;k0WcB_jb;cn%_Idz4HO$QU*abf4}+wi?e96N>fbq{{i|W0@(ln literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-icons_2e83ff_256x240.png b/vendor/assets/stylesheets/images/ui-icons_2e83ff_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-icons_454545_256x240.png b/vendor/assets/stylesheets/images/ui-icons_454545_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/vendor/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png b/vendor/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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