From 0023cf6cebaed2ee6c4ab6559d8656ad2d824d3c Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Mon, 27 Mar 2023 10:59:43 -0400 Subject: [PATCH 1/9] upgrades ruby to 2.7.2 and rails to 5.2.6 --- .ruby-version | 2 +- Gemfile | 2 +- Gemfile.lock | 150 +++++++++++++++++++++++++++----------------------- 3 files changed, 84 insertions(+), 70 deletions(-) diff --git a/.ruby-version b/.ruby-version index ec1cf33c3..1f7da99d4 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.3 +2.7.7 diff --git a/Gemfile b/Gemfile index ca39f3910..f136d4b40 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '5.2' +gem 'rails', '5.2.6' # Use rubyzip to handle Zipped content files from Drupal gem 'rubyzip' diff --git a/Gemfile.lock b/Gemfile.lock index 4b6d10306..db6168a9c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,25 +8,25 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (5.2.0) - actionpack (= 5.2.0) + actioncable (5.2.6) + actionpack (= 5.2.6) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.0) - actionpack (= 5.2.0) - actionview (= 5.2.0) - activejob (= 5.2.0) + actionmailer (5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.0) - actionview (= 5.2.0) - activesupport (= 5.2.0) - rack (~> 2.0) + actionpack (5.2.6) + actionview (= 5.2.6) + activesupport (= 5.2.6) + rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.0) - activesupport (= 5.2.0) + actionview (5.2.6) + activesupport (= 5.2.6) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -55,20 +55,20 @@ GEM nom-xml (>= 0.5.1) om (~> 3.1) rdf-rdfxml (~> 2.0) - activejob (5.2.0) - activesupport (= 5.2.0) + activejob (5.2.6) + activesupport (= 5.2.6) globalid (>= 0.3.6) - activemodel (5.2.0) - activesupport (= 5.2.0) - activerecord (5.2.0) - activemodel (= 5.2.0) - activesupport (= 5.2.0) + activemodel (5.2.6) + activesupport (= 5.2.6) + activerecord (5.2.6) + activemodel (= 5.2.6) + activesupport (= 5.2.6) arel (>= 9.0) - activestorage (5.2.0) - actionpack (= 5.2.0) - activerecord (= 5.2.0) - marcel (~> 0.3.1) - activesupport (5.2.0) + activestorage (5.2.6) + actionpack (= 5.2.6) + activerecord (= 5.2.6) + marcel (~> 1.0.0) + activesupport (5.2.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -155,12 +155,13 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.1.6) + concurrent-ruby (1.2.2) config (2.2.1) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) crass (1.0.6) daemons (1.3.1) + date (3.3.3) deep_merge (1.2.1) deprecation (1.0.0) activesupport @@ -224,7 +225,7 @@ GEM sxp (~> 1.1) edtf (3.0.5) activesupport (>= 3.0, < 7.0) - erubi (1.9.0) + erubi (1.12.0) erubis (2.7.0) et-orbi (1.2.4) tzinfo @@ -251,8 +252,8 @@ GEM raabro (~> 1.1) git (1.7.0) rchardet (~> 1.8) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (1.1.0) + activesupport (>= 5.0) haml (5.1.2) temple (>= 0.8.0) tilt @@ -297,7 +298,7 @@ GEM hydra-access-controls (= 10.7.0) hydra-core (= 10.7.0) rails (>= 3.2.6) - i18n (1.8.2) + i18n (1.12.0) concurrent-ruby (~> 1.0) iso-639 (0.3.5) jbuilder (2.10.0) @@ -349,22 +350,23 @@ GEM libv8 (3.16.14.19) link_header (0.0.8) logger (1.4.2) - loofah (2.5.0) + loofah (2.19.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) - mail (2.7.1) + mail (2.8.1) mini_mime (>= 0.1.1) - marcel (0.3.3) - mimemagic (~> 0.3.2) + net-imap + net-pop + net-smtp + marcel (1.0.2) method_source (1.0.0) mime-types (3.3.1) mime-types-data (~> 3.2015) mime-types-data (3.2020.0425) - mimemagic (0.3.5) mini_magick (4.10.1) - mini_mime (1.0.2) - mini_portile2 (2.4.0) - minitest (5.14.0) + mini_mime (1.1.2) + mini_portile2 (2.8.1) + minitest (5.18.0) mods (2.4.1) edtf iso-639 @@ -382,13 +384,23 @@ GEM namae (1.0.1) nest (3.2.0) redic + net-imap (0.3.4) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout net-scp (3.0.0) net-ssh (>= 2.6.5, < 7.0.0) + net-smtp (0.3.3) + net-protocol net-ssh (6.0.2) netrc (0.11.0) - nio4r (2.5.2) - nokogiri (1.10.9) - mini_portile2 (~> 2.4.0) + nio4r (2.5.8) + nokogiri (1.14.2) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) nom-xml (1.1.0) activesupport (>= 3.2.18) i18n @@ -410,38 +422,39 @@ GEM method_source (~> 1.0) public_suffix (4.0.4) raabro (1.1.6) - rack (2.2.2) + racc (1.6.2) + rack (2.2.6.4) rack-protection (2.0.8.1) rack - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (5.2.0) - actioncable (= 5.2.0) - actionmailer (= 5.2.0) - actionpack (= 5.2.0) - actionview (= 5.2.0) - activejob (= 5.2.0) - activemodel (= 5.2.0) - activerecord (= 5.2.0) - activestorage (= 5.2.0) - activesupport (= 5.2.0) + rack-test (2.1.0) + rack (>= 1.3) + rails (5.2.6) + actioncable (= 5.2.6) + actionmailer (= 5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) + activemodel (= 5.2.6) + activerecord (= 5.2.6) + activestorage (= 5.2.6) + activesupport (= 5.2.6) bundler (>= 1.3.0) - railties (= 5.2.0) + railties (= 5.2.6) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.3.0) - loofah (~> 2.3) + rails-html-sanitizer (1.5.0) + loofah (~> 2.19, >= 2.19.1) rails_config (0.99.0) config (>= 1.0.0.beta1) - railties (5.2.0) - actionpack (= 5.2.0) - activesupport (= 5.2.0) + railties (5.2.6) + actionpack (= 5.2.6) + activesupport (= 5.2.6) method_source rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rake (13.0.1) + thor (>= 0.19.0, < 2.0) + rake (13.0.6) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) @@ -562,9 +575,9 @@ GEM sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) sshkit (1.21.0) net-scp (>= 1.1.2) @@ -583,6 +596,7 @@ GEM thor (0.20.3) thread_safe (0.3.6) tilt (2.0.10) + timeout (0.3.2) turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) @@ -590,7 +604,7 @@ GEM actionpack (>= 3.1) jquery-rails railties (>= 3.1) - tzinfo (1.2.7) + tzinfo (1.2.11) thread_safe (~> 0.1) uglifier (4.2.0) execjs (>= 0.3.0, < 3) @@ -601,9 +615,9 @@ GEM rack (>= 1.0.0) warden (1.2.8) rack (>= 2.0.6) - websocket-driver (0.7.1) + websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.4) + websocket-extensions (0.1.5) xml-simple (1.1.5) PLATFORMS @@ -650,7 +664,7 @@ DEPENDENCIES parseconfig passenger (= 6.0.4) pry - rails (= 5.2) + rails (= 5.2.6) rails_config resque rest-client From 502ed1d048c1fbe61628f10ddb11fee67b0340db Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Mon, 27 Mar 2023 11:12:15 -0400 Subject: [PATCH 2/9] modifies config file using the rails update task --- bin/bundle | 2 +- bin/rails | 2 +- bin/setup | 36 +++++ bin/update | 31 ++++ bin/yarn | 11 ++ config/application.rb | 58 +------ config/boot.rb | 6 +- config/cable.yml | 10 ++ config/environment.rb | 10 +- config/environments/development.rb | 69 ++++----- config/environments/production.rb | 81 +++++----- config/environments/test.rb | 29 ++-- .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 ++ .../initializers/content_security_policy.rb | 25 +++ config/initializers/cookies_serializer.rb | 5 + config/initializers/mime_types.rb | 1 - .../new_framework_defaults_5_2.rb | 38 +++++ config/initializers/wrap_parameters.rb | 4 +- config/locales/en.yml | 10 ++ config/routes.rb | 144 +----------------- config/storage.yml | 36 ++++- 22 files changed, 324 insertions(+), 306 deletions(-) create mode 100755 bin/setup create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config/cable.yml create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/new_framework_defaults_5_2.rb diff --git a/bin/bundle b/bin/bundle index 66e9889e8..f19acf5b5 100755 --- a/bin/bundle +++ b/bin/bundle @@ -1,3 +1,3 @@ #!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails index 728cd85aa..073966023 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,4 @@ #!/usr/bin/env ruby -APP_PATH = File.expand_path('../../config/application', __FILE__) +APP_PATH = File.expand_path('../config/application', __dir__) require_relative '../config/boot' require 'rails/commands' diff --git a/bin/setup b/bin/setup new file mode 100755 index 000000000..94fd4d797 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/update b/bin/update new file mode 100755 index 000000000..58bfaed51 --- /dev/null +++ b/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 000000000..460dd565b --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config/application.rb b/config/application.rb index d513e695e..77d6edca8 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,63 +1,19 @@ -require File.expand_path('../boot', __FILE__) +require_relative 'boot' -require 'rake' require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. -# Bundler.require(*Rails.groups) - -if defined?(Bundler) - # If you precompile assets before deploying to production, use this line - Bundler.require(*Rails.groups(:assets => %w(development staging test))) - # If you want your assets lazily compiled in production, use this line - # Bundler.require(:default, :assets, Rails.env) -end +Bundler.require(*Rails.groups) module TapasRails class Application < Rails::Application - - config.generators do |g| - g.test_framework :rspec, :spec => true - end - - config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')] - config.autoload_paths += Dir[Rails.root.join('app', 'validators', '**/')] - config.autoload_paths += Dir[Rails.root.join('app', 'actions', '**/')] - config.autoload_paths += Dir["#{config.root}/lib/**/"] - - # Dir.glob("#{config.root}/lib/**/[^spec]**/").each do |dir| - # puts dir - # config.autoload_paths << dir - # end - - - config.secret_key_base = ENV["SECRET_KEY_BASE"] - - # Pid to use for the Collection that stores TEI files - # that reference non-existant collections. - config.phantom_collection_pid = "tap:phantom" - - # Pid to use for the Project that is the graph root for - # the tapas repository. Note that this doesn't map to any - # project object that exists in the drupal head. - config.tap_root = "tap:1" - config.encoding = "utf-8" - - # Enable pid generation on object instantiation - # config.cerberus_core.auto_generate_pid = true + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.0 # 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. - - # 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 - config.filter_parameters << :token + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. end end diff --git a/config/boot.rb b/config/boot.rb index 5e5f0c1fa..b9e460cef 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,4 +1,4 @@ -# Set up gems listed in the Gemfile. -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) -require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..3f4ed69e8 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: tapas_rails_production diff --git a/config/environment.rb b/config/environment.rb index 030f43073..426333bb4 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,11 +1,5 @@ # Load the Rails application. -require File.expand_path('../application', __FILE__) - -Encoding.default_external = Encoding::UTF_8 -Encoding.default_internal = Encoding::UTF_8 +require_relative 'application' # Initialize the Rails application. -TapasRails::Application.initialize! - -# ActionView complains in tests if we don't copy this config over -TapasRails::Application.default_url_options = TapasRails::Application.config.action_mailer.default_url_options +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 47947ffd8..1311e3e4e 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,68 +1,61 @@ -TapasRails::Application.configure do +Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - Rails.application.routes.default_url_options[:host] = 'localhost:3000' + # 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 - config.reload_classes_only_on_change = false # Do not eager load code on boot. config.eager_load = false - config.log_level = :debug + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? + config.action_controller.perform_caching = true - config.fedora_home = "#{Rails.root.to_s}/jetty/fedora/default/data/datastreamStore/" + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false + config.cache_store = :null_store + end + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false - config.action_mailer.default_url_options = { host: "localhost:3000" } - config.action_mailer.delivery_method = :smtp - # Use mailcatcher (https://mailcatcher.me/) to test emails locally - # NOTE: Please do not put mailcatcher in the Gemfile, as it will cause conflicts - config.action_mailer.smtp_settings = { address: "localhost", port: 1025 } + config.action_mailer.perform_caching = false # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log - # Raise an error on page load if there are pending migrations + # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load - config.active_storage.service = :amazon + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. config.assets.debug = true - config.assets.compress = false - - # Parse ~/.gitconfig in an attempt to load the email address of the currently - # developing developer. Return a nonsense default otherwise - conf_path = "#{Dir.home}/.gitconfig" - if File.exists?(conf_path) - gitconfig = ParseConfig.new(conf_path) - - if gitconfig['user'] - email = gitconfig['user']['email'] || "changeme@example.com" - else - email = "changeme@example.com" - end - end - config.middleware.use ExceptionNotification::Rack, - :email => { - :email_prefix => "[Tapas Rails Notifier DEV]", - :sender_address => %{"notifier" }, - :exception_recipients => email - } + # Suppress logger output for asset requests. + config.assets.quiet = true - config.file_watcher = ActiveSupport::FileUpdateChecker + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true - config.reload_classes_only_on_change = false - config.log_level = :info + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker end diff --git a/config/environments/production.rb b/config/environments/production.rb index 6bb319989..39bc000b1 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,87 +1,94 @@ -TapasRails::Application.configure do - Rails.application.routes.default_url_options[:host] = 'railsapi.tapas.neu.edu' +Rails.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 # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both thread web servers + # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true - config.fedora_home = "/opt/fedora/data/datastreamStore/" - # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true - config.action_mailer.default_url_options = { :host => "tapas.neu.edu"} - - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. - # config.action_dispatch.rack_cache = true + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true - config.active_storage.service = :amazon - - # Disable Rails's static asset server (Apache or nginx will already do this). - config.serve_static_assets = false + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts and CSS. - config.assets.js_compressor = Uglifier.new(harmony: true) + config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false - # Generate digests for assets URLs. - config.assets.digest = true + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - # Version of your assets, change this if you want to expire all your assets. - config.assets.version = '1.0' + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' # 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 + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Set to :debug to see everything in the log. - config.log_level = :info + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + 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) + config.log_tags = [ :request_id ] # 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" + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "tapas_rails_#{Rails.env}" - # Precompile additional assets. - # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. - # config.assets.precompile += %w( search.js ) + config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation can not be found). + # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify - # Disable automatic flushing of the log to improve performance. - # config.autoflush_log = false - # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false end diff --git a/config/environments/test.rb b/config/environments/test.rb index 667c9d975..0a38fd3ce 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,7 +1,6 @@ -TapasRails::Application.configure do +Rails.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 @@ -12,11 +11,12 @@ # just for the purpose of running a single test. If you are using a tool that # preloads Rails for running tests, you may have to set it to true. config.eager_load = false - config.log_level = :debug - # Configure static asset server for tests with Cache-Control for performance. - config.serve_static_assets = true - config.static_cache_control = "public, max-age=3600" + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } # Show full error reports and disable caching. config.consider_all_requests_local = true @@ -28,22 +28,19 @@ # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + + config.action_mailer.perform_caching = 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 - config.action_mailer.default_url_options = { host: "tapasdev.neu.edu" } - config.action_mailer.raise_delivery_errors = false # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - config.active_storage.service = :test - - config.middleware.use ExceptionNotification::Rack, - :email => { - :email_prefix => "[Tapas Rails Notifier TEST]", - :sender_address => %{"notifier" }, - :exception_recipients => %w{nobody@nowhere.com} - } + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 000000000..4b828e80c --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 000000000..d3bcaa5ec --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 000000000..1389e86a3 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :marshal diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 72aca7e44..dc1899682 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -2,4 +2,3 @@ # 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/new_framework_defaults_5_2.rb b/config/initializers/new_framework_defaults_5_2.rb new file mode 100644 index 000000000..c383d072b --- /dev/null +++ b/config/initializers/new_framework_defaults_5_2.rb @@ -0,0 +1,38 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 5.2 upgrade. +# +# Once upgraded flip defaults one by one to migrate to the new default. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Make Active Record use stable #cache_key alongside new #cache_version method. +# This is needed for recyclable cache keys. +# Rails.application.config.active_record.cache_versioning = true + +# Use AES-256-GCM authenticated encryption for encrypted cookies. +# Also, embed cookie expiry in signed or encrypted cookies for increased security. +# +# This option is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 5.2. +# +# Existing cookies will be converted on read then written with the new scheme. +# Rails.application.config.action_dispatch.use_authenticated_cookie_encryption = true + +# Use AES-256-GCM authenticated encryption as default cipher for encrypting messages +# instead of AES-256-CBC, when use_authenticated_message_encryption is set to true. +# Rails.application.config.active_support.use_authenticated_message_encryption = true + +# Add default protection from forgery to ActionController::Base instead of in +# ApplicationController. +# Rails.application.config.action_controller.default_protect_from_forgery = true + +# Store boolean values are in sqlite3 databases as 1 and 0 instead of 't' and +# 'f' after migrating old data. +# Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true + +# Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header. +# Rails.application.config.active_support.use_sha1_digests = true + +# Make `form_with` generate id attributes for any generated HTML tags. +# Rails.application.config.action_view.form_with_generates_ids = true diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb index 33725e95f..bbfc3961b 100644 --- a/config/initializers/wrap_parameters.rb +++ b/config/initializers/wrap_parameters.rb @@ -5,10 +5,10 @@ # 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] if respond_to?(:wrap_parameters) + wrap_parameters format: [:json] end # To enable root element in JSON for ActiveRecord objects. # ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true +# self.include_root_in_json = true # end diff --git a/config/locales/en.yml b/config/locales/en.yml index 065395716..decc5a857 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -16,6 +16,16 @@ # # This would use the information in config/locales/es.yml. # +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# # To learn more, please read the Rails Internationalization guide # available at http://guides.rubyonrails.org/i18n.html. diff --git a/config/routes.rb b/config/routes.rb index 73fc607c0..787824f88 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,143 +1,3 @@ -TapasRails::Application.routes.draw do - # At some point we'll want all this, but I'm going to disable these routes - # until we're ready to migrate to 100% Hydra-Head usage for tapas. - - - root :to => "view_packages#index" - - # blacklight_for :catalog - devise_for :users, controllers: { invitations: 'users/invitations' } - - # The priority is based upon order of creation: first created -> highest priority. - # See how all your routes lay out with "rake routes". - - # You can have the root of your site routed with "root" - # root 'welcome#index' - - # Show resque admin in development environment - resque_web_constraint = lambda do |request| - Rails.env == "development" - end - - # constraints resque_web_constraint do - mount Resque::Server, at: "/resque" - # end - - get 'browse' => 'catalog#browse' - - # Communities - resources :communities - get 'communities/:did' => 'communities#show' - get 'communities/:did/edit' => 'communities#edit' - post "communities/:did" => "communities#upsert" - get 'communities' => 'communities#index' - #get '/catalog/:id' => 'communities#show' - delete "communities/:did" => "communities#destroy" - - # Collections - resources :collections - get 'collections/:did' => 'collections#show' - post "collections/:did" => "collections#upsert" - get 'collections/:did/edit' => 'collections#edit' - get 'collections' => 'collections#index' - - - # delete "collections/:did" => "collections#destroy" - - # CoreFiles - resources :core_files - get 'core_files/:did/edit' => 'core_files#edit' - get 'core_files' => 'core_files#index' - - get 'files/:did/mods' => 'core_files#mods' - get 'files/:did/tei' => 'core_files#tei' - get 'files/:did' => 'core_files#api_show' - get 'core_files/:did' => 'core_files#show' - put 'core_files/:did/reading_interfaces' => 'core_files#rebuild_reading_interfaces' - post 'core_files/:id' => 'core_files#update' - post 'files/:did' => 'core_files#upsert' - # delete "files/:did" => "core_files#destroy" - - get 'files/:did/html/:view_package' => 'core_files#view_package_html' - - resources :downloads, :only => 'show' - - namespace :api do - get 'communities/:did' => 'communities#api_show' - get 'collections/:did' => 'collections#api_show' - get 'core_files/:did' => 'core_files#api_show' - end - resources :view_packages - get 'admin/view_packages/update' => 'view_packages#run_job', as: 'update_view_packages' - get 'api/view_packages' => 'view_packages#api_index' - - get '/admin' => 'admin#index' - resources :pages - resources :news_items, path: "/news" - resources :institutions, path: "/institutions" - - get 'my_tapas' => 'users#my_tapas' - get 'my_projects' => 'users#my_projects' - get 'my_collections' => 'users#my_collections' - get 'my_records' => 'users#my_records' - get 'admin/users/new' => 'users#admin_new', as: 'admin_new_user' - get 'admin/users/:id' => 'users#admin_show' - post 'admin/users' => 'users#admin_create', as: 'admin_create_user' - get 'users/:id' => 'users#profile' - get 'mail_users' => 'users#mail_all_users', as: 'mail_users' - post 'mail_users' => 'users#mail_all_users' - resources :users, :only => ['index', 'edit', 'create', 'update', 'destroy'] - resources :menu_links, path: "/menu" - post 'update_menu_order' => 'menu_links#update_menu_order' - - match '/:id' => 'pages#show', via: 'get' #must go at end since it matches on everything - - # Example of regular route: - # get 'products/:id' => 'catalog#view' - - # Example of named route that can be invoked with purchase_url(id: product.id) - # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase - - # Example resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Example resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Example resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Example resource route with more complex sub-resources: - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', on: :collection - # end - # end - - # Example resource route with concerns: - # concern :toggleable do - # post 'toggle' - # end - # resources :posts, concerns: :toggleable - # resources :photos, concerns: :toggleable - - # Example resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/config/storage.yml b/config/storage.yml index 2b11f19ce..d32f76e8f 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -2,9 +2,33 @@ test: service: Disk root: <%= Rails.root.join("tmp/storage") %> -amazon: - service: S3 - access_key_id: <%= ENV['AWS_S3_ACCESS_KEY_ID'] %> - bucket: <%= ENV['AWS_S3_BUCKET'] %> - region: 'us-east-1' - secret_access_key: <%= ENV['AWS_S3_SECRET_ACCESS_KEY'] %> +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] From bb73ae47e45adb022059e2e0ccce8f4edd043bdc Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Tue, 28 Mar 2023 11:25:34 -0400 Subject: [PATCH 3/9] configuration modifications from running the update Rake task --- bin/bundle | 8 +- bin/rails | 9 +- config/application.rb | 44 +++++- config/boot.rb | 8 ++ config/environment.rb | 18 ++- config/environments/development.rb | 133 ++++++++++++++----- config/environments/production.rb | 177 +++++++++++++++++++------ config/environments/test.rb | 77 +++++++++-- config/initializers/mime_types.rb | 3 + config/initializers/wrap_parameters.rb | 7 +- config/routes.rb | 143 +++++++++++++++++++- config/storage.yml | 28 +++- 12 files changed, 549 insertions(+), 106 deletions(-) diff --git a/bin/bundle b/bin/bundle index f19acf5b5..484d5f591 100755 --- a/bin/bundle +++ b/bin/bundle @@ -1,3 +1,9 @@ +# pre-upgrade - 03272023 by CCH + #!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) load Gem.bin_path('bundler', 'bundle') + +# #!/usr/bin/env ruby +# ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +# load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails index 073966023..4796aaaa8 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,11 @@ +# pre-upgrade - 03272023 by CCH + #!/usr/bin/env ruby -APP_PATH = File.expand_path('../config/application', __dir__) +APP_PATH = File.expand_path('../../config/application', __FILE__) require_relative '../config/boot' require 'rails/commands' + +#!/usr/bin/env ruby +# APP_PATH = File.expand_path('../config/application', __dir__) +# require_relative '../config/boot' +# require 'rails/commands' diff --git a/config/application.rb b/config/application.rb index 77d6edca8..7d3a25a15 100644 --- a/config/application.rb +++ b/config/application.rb @@ -11,9 +11,47 @@ class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.0 + config.generators do |g| + g.test_framework :rspec, :spec => true + end + + config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'validators', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'actions', '**/')] + config.autoload_paths += Dir["#{config.root}/lib/**/"] + + # Dir.glob("#{config.root}/lib/**/[^spec]**/").each do |dir| + # puts dir + # config.autoload_paths << dir + # end + + + config.secret_key_base = ENV["SECRET_KEY_BASE"] + + # Pid to use for the Collection that stores TEI files + # that reference non-existant collections. + config.phantom_collection_pid = "tap:phantom" + + # Pid to use for the Project that is the graph root for + # the tapas repository. Note that this doesn't map to any + # project object that exists in the drupal head. + config.tap_root = "tap:1" + config.encoding = "utf-8" + + # Enable pid generation on object instantiation + # config.cerberus_core.auto_generate_pid = true + # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # 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 + config.filter_parameters << :token end end diff --git a/config/boot.rb b/config/boot.rb index b9e460cef..f1ce6a8df 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -2,3 +2,11 @@ require 'bundler/setup' # Set up gems listed in the Gemfile. require 'bootsnap/setup' # Speed up boot time by caching expensive operations. + + +# pre-upgrade - 03272023 by CCH +# +# # Set up gems listed in the Gemfile. +# ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +# +# require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) diff --git a/config/environment.rb b/config/environment.rb index 426333bb4..6e2fc24c8 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,19 @@ +# # Load the Rails application. +# require_relative 'application' +# +# # Initialize the Rails application. +# Rails.application.initialize! + +# pre-upgrade - 03272023 by CCH +# # Load the Rails application. -require_relative 'application' +require File.expand_path('../application', __FILE__) + +Encoding.default_external = Encoding::UTF_8 +Encoding.default_internal = Encoding::UTF_8 # Initialize the Rails application. -Rails.application.initialize! +TapasRails::Application.initialize! + +# ActionView complains in tests if we don't copy this config over +TapasRails::Application.default_url_options = TapasRails::Application.config.action_mailer.default_url_options diff --git a/config/environments/development.rb b/config/environments/development.rb index 1311e3e4e..f1c0e55d1 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,61 +1,132 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. +# pre-upgrade - 03272023 by CCH +TapasRails::Application.configure do + # Settings specified here will take precedence over those in config/application.rb. + Rails.application.routes.default_url_options[:host] = 'localhost:3000' # 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 + config.reload_classes_only_on_change = false # Do not eager load code on boot. config.eager_load = false - # Show full error reports. - config.consider_all_requests_local = true + config.log_level = :debug - # Enable/disable caching. By default caching is disabled. - # Run rails dev:cache to toggle caching. - if Rails.root.join('tmp', 'caching-dev.txt').exist? - config.action_controller.perform_caching = true + config.fedora_home = "#{Rails.root.to_s}/jetty/fedora/default/data/datastreamStore/" - config.cache_store = :memory_store - config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{2.days.to_i}" - } - else - config.action_controller.perform_caching = false - - config.cache_store = :null_store - end - - # Store uploaded files on the local file system (see config/storage.yml for options) - config.active_storage.service = :local + # 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 + config.action_mailer.default_url_options = { host: "localhost:3000" } + config.action_mailer.delivery_method = :smtp - config.action_mailer.perform_caching = false + # Use mailcatcher (https://mailcatcher.me/) to test emails locally + # NOTE: Please do not put mailcatcher in the Gemfile, as it will cause conflicts + config.action_mailer.smtp_settings = { address: "localhost", port: 1025 } # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log - # Raise an error on page load if there are pending migrations. + # Raise an error on page load if there are pending migrations config.active_record.migration_error = :page_load - # Highlight code that triggered database queries in logs. - config.active_record.verbose_query_logs = true + config.active_storage.service = :amazon # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. config.assets.debug = true + config.assets.compress = false + + # Parse ~/.gitconfig in an attempt to load the email address of the currently + # developing developer. Return a nonsense default otherwise + conf_path = "#{Dir.home}/.gitconfig" + if File.exists?(conf_path) + gitconfig = ParseConfig.new(conf_path) + + if gitconfig['user'] + email = gitconfig['user']['email'] || "changeme@example.com" + else + email = "changeme@example.com" + end + end - # Suppress logger output for asset requests. - config.assets.quiet = true + config.middleware.use ExceptionNotification::Rack, + :email => { + :email_prefix => "[Tapas Rails Notifier DEV]", + :sender_address => %{"notifier" }, + :exception_recipients => email + } - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + config.file_watcher = ActiveSupport::FileUpdateChecker - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - config.file_watcher = ActiveSupport::EventedFileUpdateChecker + config.reload_classes_only_on_change = false + config.log_level = :info end + +# Rails.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 +# +# # Do not eager load code on boot. +# config.eager_load = false +# +# # Show full error reports. +# config.consider_all_requests_local = true +# +# # Enable/disable caching. By default caching is disabled. +# # Run rails dev:cache to toggle caching. +# if Rails.root.join('tmp', 'caching-dev.txt').exist? +# config.action_controller.perform_caching = true +# +# config.cache_store = :memory_store +# config.public_file_server.headers = { +# 'Cache-Control' => "public, max-age=#{2.days.to_i}" +# } +# else +# config.action_controller.perform_caching = false +# +# config.cache_store = :null_store +# end +# +# # Store uploaded files on the local file system (see config/storage.yml for options) +# config.active_storage.service = :local +# +# # Don't care if the mailer can't send. +# config.action_mailer.raise_delivery_errors = false +# +# config.action_mailer.perform_caching = false +# +# # Print deprecation notices to the Rails logger. +# config.active_support.deprecation = :log +# +# # Raise an error on page load if there are pending migrations. +# config.active_record.migration_error = :page_load +# +# # Highlight code that triggered database queries in logs. +# config.active_record.verbose_query_logs = true +# +# # Debug mode disables concatenation and preprocessing of assets. +# # This option may cause significant delays in view rendering with a large +# # number of complex assets. +# config.assets.debug = true +# +# # Suppress logger output for asset requests. +# config.assets.quiet = true +# +# # Raises error for missing translations +# # config.action_view.raise_on_missing_translations = true +# +# # Use an evented file watcher to asynchronously detect changes in source code, +# # routes, locales, etc. This feature depends on the listen gem. +# config.file_watcher = ActiveSupport::EventedFileUpdateChecker +# end diff --git a/config/environments/production.rb b/config/environments/production.rb index 39bc000b1..1b56eb346 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,94 +1,183 @@ -Rails.application.configure do +# pre-upgrade - 03272023 by CCH + +TapasRails::Application.configure do + Rails.application.routes.default_url_options[:host] = 'railsapi.tapas.neu.edu' # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. config.cache_classes = true # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers + # your application in memory, allowing both thread web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true + config.fedora_home = "/opt/fedora/data/datastreamStore/" + # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). - # config.require_master_key = true + config.action_mailer.default_url_options = { :host => "tapas.neu.edu"} + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. + # config.action_dispatch.rack_cache = true + + config.active_storage.service = :amazon - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + # Disable Rails's static asset server (Apache or nginx will already do this). + config.serve_static_assets = false # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier + config.assets.js_compressor = Uglifier.new(harmony: true) # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + # Generate digests for assets URLs. + config.assets.digest = true - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' + # Version of your assets, change this if you want to expire all your assets. + config.assets.version = '1.0' # 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 - - # Store uploaded files on the local file system (see config/storage.yml for options) - config.active_storage.service = :local - - # Mount Action Cable outside main process or domain - # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + # 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 - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug + # Set to :debug to see everything in the log. + config.log_level = :info # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] + # 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 - # Use a real queuing backend for Active Job (and separate queues per environment) - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "tapas_rails_#{Rails.env}" + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = "http://assets.example.com" - config.action_mailer.perform_caching = false + # Precompile additional assets. + # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. + # config.assets.precompile += %w( search.js ) # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). + # 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 + # Disable automatic flushing of the log to improve performance. + # config.autoflush_log = false + # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false end +# Rails.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 +# +# # Eager load code on boot. This eager loads most of Rails and +# # your application in memory, allowing both threaded web servers +# # and those relying on copy on write to perform better. +# # Rake tasks automatically ignore this option for performance. +# config.eager_load = true +# +# # Full error reports are disabled and caching is turned on. +# config.consider_all_requests_local = false +# config.action_controller.perform_caching = true +# +# # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] +# # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). +# # config.require_master_key = true +# +# # Disable serving static files from the `/public` folder by default since +# # Apache or NGINX already handles this. +# config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? +# +# # Compress JavaScripts and CSS. +# config.assets.js_compressor = :uglifier +# # config.assets.css_compressor = :sass +# +# # Do not fallback to assets pipeline if a precompiled asset is missed. +# config.assets.compile = false +# +# # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb +# +# # Enable serving of images, stylesheets, and JavaScripts from an asset server. +# # config.action_controller.asset_host = 'http://assets.example.com' +# +# # 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 +# +# # Store uploaded files on the local file system (see config/storage.yml for options) +# config.active_storage.service = :local +# +# # Mount Action Cable outside main process or domain +# # config.action_cable.mount_path = nil +# # config.action_cable.url = 'wss://example.com/cable' +# # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] +# +# # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. +# # config.force_ssl = true +# +# # Use the lowest log level to ensure availability of diagnostic information +# # when problems arise. +# config.log_level = :debug +# +# # Prepend all log lines with the following tags. +# config.log_tags = [ :request_id ] +# +# # Use a different cache store in production. +# # config.cache_store = :mem_cache_store +# +# # Use a real queuing backend for Active Job (and separate queues per environment) +# # config.active_job.queue_adapter = :resque +# # config.active_job.queue_name_prefix = "tapas_rails_#{Rails.env}" +# +# config.action_mailer.perform_caching = false +# +# # Ignore bad email addresses and do not raise email delivery errors. +# # Set this to true and configure the email server for immediate delivery to raise delivery errors. +# # config.action_mailer.raise_delivery_errors = false +# +# # Enable locale fallbacks for I18n (makes lookups for any locale fall back to +# # the I18n.default_locale when a translation cannot be found). +# config.i18n.fallbacks = true +# +# # Send deprecation notices to registered listeners. +# config.active_support.deprecation = :notify +# +# # Use default logging formatter so that PID and timestamp are not suppressed. +# config.log_formatter = ::Logger::Formatter.new +# +# # Use a different logger for distributed setups. +# # require 'syslog/logger' +# # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') +# +# if ENV["RAILS_LOG_TO_STDOUT"].present? +# logger = ActiveSupport::Logger.new(STDOUT) +# logger.formatter = config.log_formatter +# config.logger = ActiveSupport::TaggedLogging.new(logger) +# end +# +# # Do not dump schema after migrations. +# config.active_record.dump_schema_after_migration = false +# end diff --git a/config/environments/test.rb b/config/environments/test.rb index 0a38fd3ce..f9ab64dbf 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,6 +1,9 @@ -Rails.application.configure do +# pre-upgrade - 03272023 by CCH + +TapasRails::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 @@ -11,12 +14,11 @@ # just for the purpose of running a single test. If you are using a tool that # preloads Rails for running tests, you may have to set it to true. config.eager_load = false + config.log_level = :debug - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{1.hour.to_i}" - } + # Configure static asset server for tests with Cache-Control for performance. + config.serve_static_assets = true + config.static_cache_control = "public, max-age=3600" # Show full error reports and disable caching. config.consider_all_requests_local = true @@ -28,19 +30,68 @@ # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false - # Store uploaded files on the local file system in a temporary directory - config.active_storage.service = :test - - config.action_mailer.perform_caching = 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 + config.action_mailer.default_url_options = { host: "tapasdev.neu.edu" } + config.action_mailer.raise_delivery_errors = false # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true + config.active_storage.service = :test + + config.middleware.use ExceptionNotification::Rack, + :email => { + :email_prefix => "[Tapas Rails Notifier TEST]", + :sender_address => %{"notifier" }, + :exception_recipients => %w{nobody@nowhere.com} + } end +# Rails.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 +# +# # Do not eager load code on boot. This avoids loading your whole application +# # just for the purpose of running a single test. If you are using a tool that +# # preloads Rails for running tests, you may have to set it to true. +# config.eager_load = false +# +# # Configure public file server for tests with Cache-Control for performance. +# config.public_file_server.enabled = true +# config.public_file_server.headers = { +# 'Cache-Control' => "public, max-age=#{1.hour.to_i}" +# } +# +# # 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 +# +# # Store uploaded files on the local file system in a temporary directory +# config.active_storage.service = :test +# +# config.action_mailer.perform_caching = 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 +# +# # Print deprecation notices to the stderr. +# config.active_support.deprecation = :stderr +# +# # Raises error for missing translations +# # config.action_view.raise_on_missing_translations = true +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index dc1899682..2086910f9 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -1,4 +1,7 @@ +# pre-upgrade - 03272023 by CCH + # 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/wrap_parameters.rb b/config/initializers/wrap_parameters.rb index bbfc3961b..7e65eef6f 100644 --- a/config/initializers/wrap_parameters.rb +++ b/config/initializers/wrap_parameters.rb @@ -1,3 +1,5 @@ +# pre-upgrade - 03272023 by CCH + # Be sure to restart your server when you modify this file. # This file contains settings for ActionController::ParamsWrapper which @@ -5,10 +7,11 @@ # 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] + wrap_parameters format: [:json] if respond_to?(:wrap_parameters) end # To enable root element in JSON for ActiveRecord objects. # ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true +# self.include_root_in_json = true # end + diff --git a/config/routes.rb b/config/routes.rb index 787824f88..cb1831ced 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,142 @@ -Rails.application.routes.draw do - # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +TapasRails::Application.routes.draw do + # At some point we'll want all this, but I'm going to disable these routes + # until we're ready to migrate to 100% Hydra-Head usage for tapas. + + root :to => "view_packages#index" + + # blacklight_for :catalog + devise_for :users, controllers: { invitations: 'users/invitations' } + + # The priority is based upon order of creation: first created -> highest priority. + # See how all your routes lay out with "rake routes". + + # You can have the root of your site routed with "root" + # root 'welcome#index' + + # Show resque admin in development environment + resque_web_constraint = lambda do |request| + Rails.env == "development" + end + + # constraints resque_web_constraint do + mount Resque::Server, at: "/resque" + # end + + get 'browse' => 'catalog#browse' + + # Communities + resources :communities + get 'communities/:did' => 'communities#show' + get 'communities/:did/edit' => 'communities#edit' + post "communities/:did" => "communities#upsert" + get 'communities' => 'communities#index' + #get '/catalog/:id' => 'communities#show' + delete "communities/:did" => "communities#destroy" + + # Collections + resources :collections + get 'collections/:did' => 'collections#show' + post "collections/:did" => "collections#upsert" + get 'collections/:did/edit' => 'collections#edit' + get 'collections' => 'collections#index' + + + # delete "collections/:did" => "collections#destroy" + + # CoreFiles + resources :core_files + get 'core_files/:did/edit' => 'core_files#edit' + get 'core_files' => 'core_files#index' + + get 'files/:did/mods' => 'core_files#mods' + get 'files/:did/tei' => 'core_files#tei' + get 'files/:did' => 'core_files#api_show' + get 'core_files/:did' => 'core_files#show' + put 'core_files/:did/reading_interfaces' => 'core_files#rebuild_reading_interfaces' + post 'core_files/:id' => 'core_files#update' + post 'files/:did' => 'core_files#upsert' + # delete "files/:did" => "core_files#destroy" + + get 'files/:did/html/:view_package' => 'core_files#view_package_html' + + resources :downloads, :only => 'show' + + namespace :api do + get 'communities/:did' => 'communities#api_show' + get 'collections/:did' => 'collections#api_show' + get 'core_files/:did' => 'core_files#api_show' + end + resources :view_packages + get 'admin/view_packages/update' => 'view_packages#run_job', as: 'update_view_packages' + get 'api/view_packages' => 'view_packages#api_index' + + get '/admin' => 'admin#index' + resources :pages + resources :news_items, path: "/news" + resources :institutions, path: "/institutions" + + get 'my_tapas' => 'users#my_tapas' + get 'my_projects' => 'users#my_projects' + get 'my_collections' => 'users#my_collections' + get 'my_records' => 'users#my_records' + get 'admin/users/new' => 'users#admin_new', as: 'admin_new_user' + get 'admin/users/:id' => 'users#admin_show' + post 'admin/users' => 'users#admin_create', as: 'admin_create_user' + get 'users/:id' => 'users#profile' + get 'mail_users' => 'users#mail_all_users', as: 'mail_users' + post 'mail_users' => 'users#mail_all_users' + resources :users, :only => ['index', 'edit', 'create', 'update', 'destroy'] + resources :menu_links, path: "/menu" + post 'update_menu_order' => 'menu_links#update_menu_order' + + match '/:id' => 'pages#show', via: 'get' #must go at end since it matches on everything + + # Example of regular route: + # get 'products/:id' => 'catalog#view' + + # Example of named route that can be invoked with purchase_url(id: product.id) + # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase + + # Example resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Example resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Example resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Example resource route with more complex sub-resources: + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', on: :collection + # end + # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable + + # Example resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end end diff --git a/config/storage.yml b/config/storage.yml index d32f76e8f..3fd44c2b7 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -1,16 +1,30 @@ +# pre-upgrade - 03272023 by CCH + test: service: Disk root: <%= Rails.root.join("tmp/storage") %> -local: - service: Disk - root: <%= Rails.root.join("storage") %> +amazon: + service: S3 + access_key_id: <%= ENV['AWS_S3_ACCESS_KEY_ID'] %> + bucket: <%= ENV['AWS_S3_BUCKET'] %> + region: 'us-east-1' + secret_access_key: <%= ENV['AWS_S3_SECRET_ACCESS_KEY'] %> + + +#test: +# service: Disk +# root: <%#= Rails.root.join("tmp/storage") %> + +#local: +# service: Disk +# root: <%#= Rails.root.join("storage") %> # Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) # amazon: # service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# access_key_id: <%#= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%#= Rails.application.credentials.dig(:aws, :secret_access_key) %> # region: us-east-1 # bucket: your_own_bucket @@ -18,14 +32,14 @@ local: # google: # service: GCS # project: your_project -# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# credentials: <%#= Rails.root.join("path/to/gcs.keyfile") %> # bucket: your_own_bucket # Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) # microsoft: # service: AzureStorage # storage_account_name: your_account_name -# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# storage_access_key: <%#= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> # container: your_container_name # mirror: From 8a9e4ad4086813aad17e7e97bbe88d05beae5d50 Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Tue, 28 Mar 2023 11:35:58 -0400 Subject: [PATCH 4/9] removes hydra and active fedora gems and dependencies, branched from update-ruby --- Gemfile | 4 ---- Gemfile.lock | 36 ------------------------------------ 2 files changed, 40 deletions(-) diff --git a/Gemfile b/Gemfile index f136d4b40..60e08a051 100644 --- a/Gemfile +++ b/Gemfile @@ -90,8 +90,6 @@ group :doc do end gem "blacklight" -gem 'hydra-head', '~> 10.0' -gem 'hydra-derivatives' gem 'blacklight-gallery' # Use ActiveModel has_secure_password @@ -134,8 +132,6 @@ gem "git" gem "json", "~> 2.3" gem 'simple_form' -gem 'active-fedora', "~> 11.0" -gem 'active_fedora-datastreams' gem 'openseadragon' gem "haml-rails", "~> 2.0" diff --git a/Gemfile.lock b/Gemfile.lock index db6168a9c..d86478508 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -47,9 +47,6 @@ GEM activesupport (>= 3.0.0) rdf (>= 2.0.2, < 4.0) rdf-vocab (>= 2.0, < 4.0) - active_encode (0.7.0) - rails - sprockets (< 4) active_fedora-datastreams (0.2.0) active-fedora (>= 11.0.0.pre, < 13) nom-xml (>= 0.5.1) @@ -73,8 +70,6 @@ GEM i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) airbrussh (1.4.0) sshkit (>= 1.6.1, != 1.7.0) arel (9.0.0) @@ -107,10 +102,6 @@ GEM rails (>= 4.2, < 6) rsolr (>= 1.0.6, < 3) twitter-typeahead-rails (= 0.11.1.pre.corejavascript) - blacklight-access_controls (0.6.2) - blacklight (~> 6.0) - cancancan (~> 1.8) - deprecation (~> 1.0) blacklight-gallery (0.12.0) blacklight (~> 6.3) bootstrap-sass (~> 3.0) @@ -276,28 +267,6 @@ GEM http-cookie (1.0.3) domain_name (~> 0.5) http_logger (0.6.0) - hydra-access-controls (10.7.0) - active-fedora (>= 10.0.0) - activesupport (>= 4, < 6) - blacklight (>= 5.16) - blacklight-access_controls (~> 0.6.0) - cancancan (~> 1.8) - deprecation (~> 1.0) - hydra-core (10.7.0) - hydra-access-controls (= 10.7.0) - railties (>= 4.0.0, < 6) - hydra-derivatives (3.5.0) - active-fedora (>= 11.3.1, < 14) - active_encode (~> 0.1) - activesupport (>= 4.0, < 6) - addressable (~> 2.5) - deprecation - mime-types (> 2.0, < 4.0) - mini_magick (>= 3.2, < 5) - hydra-head (10.7.0) - hydra-access-controls (= 10.7.0) - hydra-core (= 10.7.0) - rails (>= 3.2.6) i18n (1.12.0) concurrent-ruby (~> 1.0) iso-639 (0.3.5) @@ -363,7 +332,6 @@ GEM mime-types (3.3.1) mime-types-data (~> 3.2015) mime-types-data (3.2020.0425) - mini_magick (4.10.1) mini_mime (1.1.2) mini_portile2 (2.8.1) minitest (5.18.0) @@ -420,7 +388,6 @@ GEM pry (0.13.1) coderay (~> 1.1) method_source (~> 1.0) - public_suffix (4.0.4) raabro (1.1.6) racc (1.6.2) rack (2.2.6.4) @@ -624,7 +591,6 @@ PLATFORMS ruby DEPENDENCIES - active-fedora (~> 11.0) active_fedora-datastreams aws-sdk-s3 blacklight @@ -649,8 +615,6 @@ DEPENDENCIES friendly_id (~> 5.2.4) git haml-rails (~> 2.0) - hydra-derivatives - hydra-head (~> 10.0) jbuilder (= 2.10) jettywrapper jquery-rails From 1483456ea888b9c9097e7b3153d931bd73ab6e1f Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Tue, 28 Mar 2023 12:28:02 -0400 Subject: [PATCH 5/9] updates gitignore file and boot --- .gitignore | 3 +++ config/boot.rb | 16 ++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 092069812..45a7710b3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile '~/.gitignore_global' +bundlelist-03282023.txt +gemlist-03282023.txt + saxon-js-compilation.md .env # Ruby Mine stuff diff --git a/config/boot.rb b/config/boot.rb index f1ce6a8df..842c4eb82 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,12 +1,12 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +# pre-upgrade - 03272023 by CCH -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) -# pre-upgrade - 03272023 by CCH +# ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) # -# # Set up gems listed in the Gemfile. -# ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -# -# require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +# require 'bundler/setup' # Set up gems listed in the Gemfile. +# require 'bootsnap/setup' # Speed up boot time by caching expensive operations. + From 1e82e06015431722a552241d77478e9b77b25df2 Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Thu, 30 Mar 2023 13:49:36 -0400 Subject: [PATCH 6/9] adds solr service config file, solr config file, and assorted references to activefedora have been replaced with direct solr service or activemodel --- .gitignore | 3 +- Gemfile | 19 +- Gemfile.lock | 135 +-- app/controllers/catalog_controller.rb | 2 +- app/controllers/downloads_controller.rb | 2 +- app/controllers/institutions_controller.rb | 14 +- app/helpers/controller_helper.rb | 8 +- app/jobs/index_job.rb | 6 +- ...rebuild_community_reading_interface_job.rb | 2 +- app/jobs/rebuild_reading_interface_job.rb | 2 +- app/models/concerns/did.rb | 4 +- app/models/concerns/og_reference.rb | 14 +- app/models/concerns/solr_helpers.rb | 20 +- app/models/concerns/tapas_queries.rb | 61 +- app/models/content/html_file.rb | 64 +- app/models/content/tei_file.rb | 42 +- app/models/datastreams/mods_datastream.rb | 72 +- app/models/solr_document.rb | 8 +- app/models/user.rb | 57 +- app/validators/core_file_validator.rb | 2 +- app/views/catalog/_index_default.html.haml | 4 +- bin/rails | 10 +- config/blacklight.yml | 39 +- config/database.yml | 60 +- config/fedora.yml | 18 - config/initializers/solr_service.rb | 1 + config/jetty.yml | 15 - config/sunspot.yml | 23 - fedora_conf/conf/development/fedora.fcfg | 953 ------------------ fedora_conf/conf/test/fedora.fcfg | 953 ------------------ lib/blacklight/solr/document/mods.rb | 2 +- lib/cerberus_core/lib/cerberus_core.rb | 6 +- .../cerberus_core/base_models/collection.rb | 86 +- .../cerberus_core/base_models/community.rb | 64 +- .../cerberus_core/base_models/content_file.rb | 82 +- .../cerberus_core/base_models/core_file.rb | 80 +- .../datastreams/dublin_core_datastream.rb | 84 +- .../datastreams/file_content_datastream.rb | 58 +- .../datastreams/fits_datastream.rb | 364 +++---- .../datastreams/mods_datastream.rb | 742 +++++++------- .../datastreams/properties_datastream.rb | 144 +-- .../cerberus_core/services/query_service.rb | 384 +++---- .../sunspot/conf/_rest_managed.json | 1 - solr/configsets/sunspot/conf/admin-extra.html | 31 - solr/configsets/sunspot/conf/currency.xml | 67 -- solr/configsets/sunspot/conf/elevate.xml | 36 - .../sunspot/conf/lang/stopwords_en.txt | 54 - .../sunspot/conf/mapping-ISOLatin1Accent.txt | 246 ----- solr/configsets/sunspot/conf/protwords.txt | 21 - solr/configsets/sunspot/conf/schema.xml | 278 ----- solr/configsets/sunspot/conf/scripts.conf | 24 - solr/configsets/sunspot/conf/solrconfig.xml | 631 ------------ solr/configsets/sunspot/conf/spellings.txt | 2 - solr/configsets/sunspot/conf/synonyms.txt | 29 - solr/default/core.properties | 3 - solr/development/core.properties | 3 - solr/solr.xml | 51 - solr/test/core.properties | 3 - solr_conf/conf/schema.xml | 278 ----- solr_conf/conf/solrconfig.xml | 223 ---- solr_conf/solr.xml | 36 - spec/factories/content/html_file_factories.rb | 10 +- spec/factories/content/tei_file_factories.rb | 10 +- 63 files changed, 1341 insertions(+), 5405 deletions(-) delete mode 100644 config/fedora.yml create mode 100644 config/initializers/solr_service.rb delete mode 100644 config/jetty.yml delete mode 100644 config/sunspot.yml delete mode 100644 fedora_conf/conf/development/fedora.fcfg delete mode 100644 fedora_conf/conf/test/fedora.fcfg delete mode 100644 solr/configsets/sunspot/conf/_rest_managed.json delete mode 100644 solr/configsets/sunspot/conf/admin-extra.html delete mode 100644 solr/configsets/sunspot/conf/currency.xml delete mode 100644 solr/configsets/sunspot/conf/elevate.xml delete mode 100644 solr/configsets/sunspot/conf/lang/stopwords_en.txt delete mode 100644 solr/configsets/sunspot/conf/mapping-ISOLatin1Accent.txt delete mode 100644 solr/configsets/sunspot/conf/protwords.txt delete mode 100644 solr/configsets/sunspot/conf/schema.xml delete mode 100644 solr/configsets/sunspot/conf/scripts.conf delete mode 100644 solr/configsets/sunspot/conf/solrconfig.xml delete mode 100644 solr/configsets/sunspot/conf/spellings.txt delete mode 100644 solr/configsets/sunspot/conf/synonyms.txt delete mode 100644 solr/default/core.properties delete mode 100644 solr/development/core.properties delete mode 100644 solr/solr.xml delete mode 100644 solr/test/core.properties delete mode 100644 solr_conf/conf/schema.xml delete mode 100644 solr_conf/conf/solrconfig.xml delete mode 100644 solr_conf/solr.xml diff --git a/.gitignore b/.gitignore index 45a7710b3..1bf7e637f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,10 @@ # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile '~/.gitignore_global' +.idea bundlelist-03282023.txt gemlist-03282023.txt - +mysql-init saxon-js-compilation.md .env # Ruby Mine stuff diff --git a/Gemfile b/Gemfile index 60e08a051..d803230a4 100644 --- a/Gemfile +++ b/Gemfile @@ -12,24 +12,21 @@ gem 'passenger', '6.0.4' # Use mysql2 for the staging environment gem 'mysql2', '0.5.3' -# gem 'minitest', '4.7.5' - -# Use SCSS for stylesheets # gem 'sass-rails', '~> 4.0.2' gem 'bootstrap-sass', '3.3.4.1' # Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0' -# Use CoffeeScript for .js.coffee assets and views -gem 'coffee-rails', '~> 5.0.0' - # See https://github.com/sstephenson/execjs#readme for more supported runtimes gem 'therubyracer', platforms: :ruby # Use jquery as the JavaScript library gem 'jquery-rails' gem 'jquery-ui-rails' +gem 'dotenv-rails', groups: [:development, :test] +# loads environment variables from .env into ENV in development +# https://github.com/bkeepers/dotenv/ # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks' @@ -50,8 +47,6 @@ gem 'resque', :require => 'resque/server' # Use Nest because some inherited config uses Nest gem 'nest' -gem 'aws-sdk-s3', require: false - gem 'discard', '~> 1.2' # Use thor for command line tasks @@ -63,12 +58,6 @@ gem 'discard', '~> 1.2' # Use Namae to try to parse arbitrary names gem 'namae' -# Bootstrap WYSIWYG Editor -# gem 'bootsy' NO LONGER MAINTAINED - -# Forem gem for Forums -# gem 'forem', git: "https://github.com/radar/forem.git", :branch => "rails4" - # Configure email alerts on exception gem 'exception_notification' @@ -113,8 +102,6 @@ group :development, :test do gem "pry" gem "rspec-rails", "~> 3" gem "rspec-its" - gem "sunspot_solr" - gem "jettywrapper" gem "factory_bot_rails" end diff --git a/Gemfile.lock b/Gemfile.lock index d86478508..6aa309011 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,27 +31,6 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - active-fedora (11.5.2) - active-triples (>= 0.11.0, < 2.0.0) - activemodel (>= 4.2, < 6) - activesupport (>= 4.2.4, < 6) - deprecation - faraday (~> 0.12.1) - faraday-encoding (= 0.0.4) - ldp (~> 0.7.0) - rsolr (>= 1.1.2, < 3) - ruby-progressbar (~> 1.0) - solrizer (>= 3.4, < 5) - active-triples (1.1.0) - activemodel (>= 3.0.0) - activesupport (>= 3.0.0) - rdf (>= 2.0.2, < 4.0) - rdf-vocab (>= 2.0, < 4.0) - active_fedora-datastreams (0.2.0) - active-fedora (>= 11.0.0.pre, < 13) - nom-xml (>= 0.5.1) - om (~> 3.1) - rdf-rdfxml (~> 2.0) activejob (5.2.6) activesupport (= 5.2.6) globalid (>= 0.3.6) @@ -75,22 +54,6 @@ GEM arel (9.0.0) autoprefixer-rails (9.7.6) execjs - aws-eventstream (1.1.0) - aws-partitions (1.341.0) - aws-sdk-core (3.103.0) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.36.0) - aws-sdk-core (~> 3, >= 3.99.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.74.0) - aws-sdk-core (~> 3, >= 3.102.1) - aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.1) - aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.13) blacklight (6.23.0) bootstrap-sass (~> 3.2) @@ -137,21 +100,12 @@ GEM activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) - childprocess (3.0.0) coderay (1.1.2) - coffee-rails (5.0.0) - coffee-script (>= 2.2.0) - railties (>= 5.2.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) concurrent-ruby (1.2.2) config (2.2.1) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) crass (1.0.6) - daemons (1.3.1) date (3.3.3) deep_merge (1.2.1) deprecation (1.0.0) @@ -173,6 +127,10 @@ GEM docile (1.3.2) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) dry-configurable (0.11.5) concurrent-ruby (~> 1.0) dry-core (~> 0.4, >= 0.4.7) @@ -211,9 +169,6 @@ GEM dry-equalizer (~> 0.2) dry-initializer (~> 3.0) dry-schema (~> 1.5) - ebnf (1.2.0) - rdf (~> 3.1) - sxp (~> 1.1) edtf (3.0.5) activesupport (>= 3.0, < 7.0) erubi (1.12.0) @@ -231,8 +186,6 @@ GEM railties (>= 4.2.0) faraday (0.12.2) multipart-post (>= 1.2, < 3) - faraday-encoding (0.0.4) - faraday ffi (1.12.2) figaro (1.1.1) thor (~> 0.14) @@ -254,31 +207,20 @@ GEM haml (>= 4.0.6, < 6.0) html2haml (>= 1.0.1) railties (>= 5.1) - hamster (3.0.0) - concurrent-ruby (~> 1.0) hiredis (0.6.3) html2haml (2.2.0) erubis (~> 2.7.0) haml (>= 4.0, < 6) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - htmlentities (4.3.4) http-accept (1.7.0) http-cookie (1.0.3) domain_name (~> 0.5) - http_logger (0.6.0) i18n (1.12.0) concurrent-ruby (~> 1.0) iso-639 (0.3.5) jbuilder (2.10.0) activesupport (>= 5.0.0) - jettywrapper (2.0.3) - activesupport (>= 3.0.0) - childprocess - i18n - logger - rubyzip - jmespath (1.4.0) jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) @@ -286,14 +228,6 @@ GEM jquery-ui-rails (6.0.1) railties (>= 3.2.16) json (2.3.0) - json-canonicalization (0.2.0) - json-ld (3.1.4) - htmlentities (~> 4.3) - json-canonicalization (~> 0.2) - link_header (~> 0.0, >= 0.0.8) - multi_json (~> 1.14) - rack (~> 2.0) - rdf (~> 3.1) kaminari (1.2.0) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.0) @@ -306,19 +240,7 @@ GEM activerecord kaminari-core (= 1.2.0) kaminari-core (1.2.0) - ldp (0.7.2) - deprecation - faraday - http_logger - json-ld - rdf (>= 1.1) - rdf-isomorphic - rdf-turtle - rdf-vocab (>= 0.8) - slop libv8 (3.16.14.19) - link_header (0.0.8) - logger (1.4.2) loofah (2.19.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) @@ -373,11 +295,6 @@ GEM activesupport (>= 3.2.18) i18n nokogiri - om (3.2.0) - activemodel (>= 5.1, < 7) - activesupport - nokogiri (>= 1.4.2) - solrizer (~> 3.3) openseadragon (0.5.0) rails (> 3.2.0) orm_adapter (0.5.0) @@ -426,31 +343,6 @@ GEM rb-inotify (0.10.1) ffi (~> 1.0) rchardet (1.8.0) - rdf (3.1.1) - hamster (~> 3.0) - link_header (~> 0.0, >= 0.0.8) - rdf-aggregate-repo (3.1.0) - rdf (~> 3.1) - rdf-isomorphic (3.1.0) - rdf (~> 3.1) - rdf-rdfa (3.1.0) - haml (~> 5.1) - htmlentities (~> 4.3) - rdf (~> 3.1) - rdf-aggregate-repo (~> 3.1) - rdf-xsd (~> 3.1) - rdf-rdfxml (2.2.1) - htmlentities (~> 4.3) - rdf (>= 2.2, < 4.0) - rdf-rdfa (>= 2.2, < 4.0) - rdf-xsd (>= 2.2, < 4.0) - rdf-turtle (3.1.0) - ebnf (~> 1.2) - rdf (~> 3.1) - rdf-vocab (3.1.4) - rdf (~> 3.1) - rdf-xsd (3.1.0) - rdf (~> 3.1) rdoc (6.2.1) redic (1.5.3) hiredis @@ -500,7 +392,6 @@ GEM rspec-mocks (~> 3.9.0) rspec-support (~> 3.9.0) rspec-support (3.9.3) - ruby-progressbar (1.10.1) ruby2_keywords (0.0.2) ruby_parser (3.14.2) sexp_processor (~> 4.9) @@ -532,13 +423,6 @@ GEM rack (~> 2.0) rack-protection (= 2.0.8.1) tilt (~> 2.0) - slop (4.8.1) - solrizer (3.4.1) - activesupport - daemons - nokogiri - stomp - xml-simple sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -552,10 +436,6 @@ GEM stanford-mods (2.6.1) activesupport mods (~> 2.2) - stomp (1.4.9) - sunspot_solr (2.5.0) - sxp (1.1.0) - rdf (~> 3.1) temple (0.8.2) therubyracer (0.12.3) libv8 (~> 3.16.14.15) @@ -585,14 +465,11 @@ GEM websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - xml-simple (1.1.5) PLATFORMS ruby DEPENDENCIES - active_fedora-datastreams - aws-sdk-s3 blacklight blacklight-gallery bootstrap-sass (= 3.3.4.1) @@ -604,11 +481,11 @@ DEPENDENCIES capistrano-resque (~> 0.2.2) capistrano-rvm carrierwave (~> 1.3.1) - coffee-rails (~> 5.0.0) devise devise-guests (~> 0.3) devise_invitable (~> 2.0.0) discard (~> 1.2) + dotenv-rails exception_notification factory_bot_rails figaro @@ -616,7 +493,6 @@ DEPENDENCIES git haml-rails (~> 2.0) jbuilder (= 2.10) - jettywrapper jquery-rails jquery-ui-rails json (~> 2.3) @@ -642,7 +518,6 @@ DEPENDENCIES simplecov-json simplecov-rcov sprockets (~> 3.7.2) - sunspot_solr therubyracer turbolinks uglifier (>= 1.3.0) diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index 271b7da99..411ab2bad 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -2,7 +2,7 @@ class CatalogController < ApplicationController include Blacklight::Catalog - include Hydra::Controller::ControllerBehavior + # include Hydra::Controller::ControllerBehavior # include Rails.application.routes.url_helpers # These before_actions apply the hydra access controls # before_action :enforce_show_permissions, :only=>:show diff --git a/app/controllers/downloads_controller.rb b/app/controllers/downloads_controller.rb index f2f04327d..ef1286eb3 100644 --- a/app/controllers/downloads_controller.rb +++ b/app/controllers/downloads_controller.rb @@ -1,5 +1,5 @@ class DownloadsController < ApplicationController - include Hydra::Controller::DownloadBehavior + # include Hydra::Controller::DownloadBehavior skip_before_action :authorize_download! end diff --git a/app/controllers/institutions_controller.rb b/app/controllers/institutions_controller.rb index 83ddc6a01..27ed7a83c 100644 --- a/app/controllers/institutions_controller.rb +++ b/app/controllers/institutions_controller.rb @@ -13,11 +13,19 @@ class InstitutionsController < ApplicationController end end + # cch: commenting out as ActiveFedora has been removed + # def show + # @institution = Institution.find(params[:id]) + # @page_title = @institution.name + # count = ActiveFedora::SolrService.count("institutions_ssim:\"#{@institution.id}\"") + # @communities = ActiveFedora::SolrService.query("institutions_ssim:\"#{@institution.id}\"", rows: count) + # end + def show @institution = Institution.find(params[:id]) @page_title = @institution.name - count = ActiveFedora::SolrService.count("institutions_ssim:\"#{@institution.id}\"") - @communities = ActiveFedora::SolrService.query("institutions_ssim:\"#{@institution.id}\"", rows: count) + count = SolrService.count("institutions_ssim:\"#{@institution.id}\"") + @communities = SolrService.query("institutions_ssim:\"#{@institution.id}\"", rows: count) end def edit @@ -79,7 +87,7 @@ def destroy private def verify_admin - redirect_to root_path unless current_user && current_user.admin? + redirect_to root_path unless current_user&.admin? end def institution_params diff --git a/app/helpers/controller_helper.rb b/app/helpers/controller_helper.rb index a92151f69..4385570f8 100644 --- a/app/helpers/controller_helper.rb +++ b/app/helpers/controller_helper.rb @@ -3,9 +3,9 @@ module ControllerHelper # returned by a typical resource request. def can_read? begin - record = SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{params[:id]}\"").first) + record = SolrDocument.new(SolrService.query("id:\"#{params[:id]}\"").first) rescue NoMethodError - render_404(ActiveFedora::ObjectNotFoundError.new, request.fullpath) and return + render_404(Exception.new, request.fullpath) and return end if current_user.nil? @@ -19,9 +19,9 @@ def can_read? def can_edit? begin - record = SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{params[:id]}\"").first) + record = SolrDocument.new(SolrService.query("id:\"#{params[:id]}\"").first) rescue NoMethodError - render_404(ActiveFedora::ObjectNotFoundError.new, request.fullpath) and return + render_404(Exception.new, request.fullpath) and return end if current_user.nil? diff --git a/app/jobs/index_job.rb b/app/jobs/index_job.rb index fd50188ca..633dc7f47 100644 --- a/app/jobs/index_job.rb +++ b/app/jobs/index_job.rb @@ -17,10 +17,10 @@ def run progress_logger = Logger.new("#{Rails.root}/log/#{job_id}/resolrize-job.log") failed_pids_log = Logger.new("#{Rails.root}/log/#{job_id}/resolrize-job-failed-pids.log") - rsolr_conn = ActiveFedora::SolrService.instance.conn + rsolr_conn = SolrService.instance.conn begin - obj = ActiveFedora::Base.find(pid, :cast=>true) + obj = Base.find(pid, :cast=>true) if ![Community, Collection, Compilation, Employee].include? obj.class @@ -33,7 +33,7 @@ def run end # Delete it's old solr record - ActiveFedora::SolrService.instance.conn.delete_by_id("#{pid}", params: {'softCommit' => true}) + SolrService.instance.conn.delete_by_id("#{pid}", params: {'softCommit' => true}) # Remake the solr document rsolr_conn.add(obj.to_solr) diff --git a/app/jobs/rebuild_community_reading_interface_job.rb b/app/jobs/rebuild_community_reading_interface_job.rb index 88525c285..edeed558c 100644 --- a/app/jobs/rebuild_community_reading_interface_job.rb +++ b/app/jobs/rebuild_community_reading_interface_job.rb @@ -24,7 +24,7 @@ def run all_verbs = all_verbs.join(" OR ") # logger.info all_verbs - descendent_ographies = ActiveFedora::SolrService.query(all_verbs) + descendent_ographies = SolrService.query(all_verbs) # logger.info descendent_ographies descendent_ographies.each do |file| if CoreFile.exists?(file['id']) diff --git a/app/jobs/rebuild_reading_interface_job.rb b/app/jobs/rebuild_reading_interface_job.rb index 28f144341..0d54d6170 100644 --- a/app/jobs/rebuild_reading_interface_job.rb +++ b/app/jobs/rebuild_reading_interface_job.rb @@ -37,7 +37,7 @@ def self.perform(did) end this_log = Logger.new("#{Rails.root}/log/rebuild_job.log") this_log.error e - raise ActiveFedora::ObjectNotFoundError + raise ActiveRecord::RecordNotFound ensure tmpfile.close if tmpfile tmpfile.unlink if tmpfile diff --git a/app/models/concerns/did.rb b/app/models/concerns/did.rb index 2785645ed..b46049d8d 100644 --- a/app/models/concerns/did.rb +++ b/app/models/concerns/did.rb @@ -7,7 +7,7 @@ def ensure_unique_did query = "did_ssim:#{did} && -id:#{pid}" - if ActiveFedora::SolrService.query(query).any? + if SolrService.query(query).any? msg = "Attempted to reuse Drupal ID #{did}" raise Exceptions::DuplicateDidError.new msg end @@ -15,7 +15,7 @@ def ensure_unique_did end def exists_by_did?(nid) - return ActiveFedora::Base.exists?("did_ssim" => nid) + return ActiveRecord::Base.exists?("did_ssim" => nid) end module_function :exists_by_did? diff --git a/app/models/concerns/og_reference.rb b/app/models/concerns/og_reference.rb index 903cd98d5..0d37054f9 100644 --- a/app/models/concerns/og_reference.rb +++ b/app/models/concerns/og_reference.rb @@ -3,11 +3,19 @@ module OGReference # Return every object that references this object # as its parent via drupal og nids. + # def self.find_all_in_og(og) + # results = ActiveFedora::SolrService.query("drupal_og_reference_ssim:\"#{og}\"") + # results.map { |result| SolrDocument.new(result) } + # end + + # Return every object that references this object + # as its parent via drupal og nids. def self.find_all_in_og(og) - results = ActiveFedora::SolrService.query("drupal_og_reference_ssim:\"#{og}\"") - results.map { |result| SolrDocument.new(result) } + results = SolrService.query("drupal_og_reference_ssim:\"#{og}\"") + results.map { |result| SolrDocument.new(result) } end - + + included do has_attributes :og_reference, datastream: "properties", multiple: true end diff --git a/app/models/concerns/solr_helpers.rb b/app/models/concerns/solr_helpers.rb index 31504b41a..ed2aae049 100644 --- a/app/models/concerns/solr_helpers.rb +++ b/app/models/concerns/solr_helpers.rb @@ -1,14 +1,26 @@ module SolrHelpers extend ActiveSupport::Concern + # def index_record + # ActiveFedora::SolrService.instance.conn.add(self.to_solr) + # ActiveFedora::SolrService.instance.conn.commit + # end + # + # def remove_from_index + # id = defined? self.pid ? self.pid : self.id + # ActiveFedora::SolrService.instance.conn.delete_by_id("#{id}") + # ActiveFedora::SolrService.instance.conn.commit + # end + + # TODO: confirm that SolrService syntax for indexing methods below is correct def index_record - ActiveFedora::SolrService.instance.conn.add(self.to_solr) - ActiveFedora::SolrService.instance.conn.commit + SolrService.instance.conn.add(self.to_solr) + SolrService.instance.conn.commit end def remove_from_index id = defined? self.pid ? self.pid : self.id - ActiveFedora::SolrService.instance.conn.delete_by_id("#{id}") - ActiveFedora::SolrService.instance.conn.commit + SolrService.instance.conn.delete_by_id("#{id}") + SolrService.instance.conn.commit end end diff --git a/app/models/concerns/tapas_queries.rb b/app/models/concerns/tapas_queries.rb index b4e9ad930..e223ae032 100644 --- a/app/models/concerns/tapas_queries.rb +++ b/app/models/concerns/tapas_queries.rb @@ -19,9 +19,13 @@ def all_ography_tei_files(as = :models) raise "all_ographies expects a CoreFile Object." end - if self.is_a? ActiveFedora::Base - collections = self.collections.map { |c| "info:fedora/#{c.pid}" } - elsif self.is_a?(SolrDocument) || self.is_a?(Hash) + # if self.is_a? ActiveFedora::Base + # collections = self.collections.map { |c| "info:fedora/#{c.pid}" } + # elsif self.is_a?(SolrDocument) || self.is_a?(Hash) + # collections = self['is_member_of_ssim'] + # end + + if self.is_a?(SolrDocument) || self.is_a?(Hash) collections = self['is_member_of_ssim'] end @@ -38,14 +42,22 @@ def all_ography_tei_files(as = :models) "is_placeography_for_ssim:#{collections}",] all_verbs = all_verbs.join(" OR ") - all_core_files = ActiveFedora::SolrService.query(all_verbs) - new_query = all_core_files.map do |core_file| + # all_core_files = ActiveFedora::SolrService.query(all_verbs) + # commenting this out as ActiveFedora has been removed + # TODO: confirm SolrService query syntax is correct w/o the use of ActiveFedora class/module + all_core_files = SolrService.query(all_verbs) + + new_query = all_core_files.map do |core_file| id = RSolr.solr_escape("info:fedora/#{core_file['id']}") "(canonical_tesim:yes AND is_part_of_ssim:#{id})" end - tei_files = ActiveFedora::SolrService.query(new_query.join(' OR ')) + # commenting this out as ActiveFedora has been removed + # TODO: confirm SolrService query syntax is correct w/o the use of ActiveFedora class/module + # tei_files = ActiveFedora::SolrService.query(new_query.join(' OR ')) + + tei_files = SolrService.query(new_query.join(' OR ')) tei_files.map { |x| load_specified_type(x, as) } end @@ -76,32 +88,53 @@ def ography_type def expected_class?(class_constant) matches_class = false - if self.is_a? ActiveFedora::Base - return self.instance_of? class_constant - elsif self.is_a? SolrDocument + # if self.is_a? ActiveFedora::Base + # return self.instance_of? class_constant + # elsif self.is_a? SolrDocument + # return (self.klass == class_constant.to_s) + # elsif self.is_a? Hash + # return (self['active_fedora_model_ssi'] == class_constant.to_s) + # else + # raise QueryObjectError.new "Passed a TapasQuery a #{self.class}. "\ + # "Must use an ActiveFedora model, a SolrDocument, or a to_solr Hash." + # end + + if self.is_a? SolrDocument return (self.klass == class_constant.to_s) elsif self.is_a? Hash return (self['active_fedora_model_ssi'] == class_constant.to_s) else raise QueryObjectError.new "Passed a TapasQuery a #{self.class}. "\ - "Must use an ActiveFedora model, a SolrDocument, or a to_solr Hash." + "Must use a SolrDocument, or a to_solr Hash." end end + # def get_pid + # if self.is_a? ActiveFedora::Base + # pid = self.pid + # elsif self.is_a?(SolrDocument) || self.is_a?(Hash) + # pid = self[:id] || self['id'] + # else + # raise QueryObjectError.new "Passed a TapasQuery a #{self.class}. "\ + # "Must use an ActiveFedora model, a SolrDocument, or a to_solr Hash." + # end + # + # pid + # end + def get_pid - if self.is_a? ActiveFedora::Base - pid = self.pid - elsif self.is_a?(SolrDocument) || self.is_a?(Hash) + if self.is_a?(SolrDocument) || self.is_a?(Hash) pid = self[:id] || self['id'] else raise QueryObjectError.new "Passed a TapasQuery a #{self.class}. "\ - "Must use an ActiveFedora model, a SolrDocument, or a to_solr Hash." + "Must use a SolrDocument or a to_solr Hash." end pid end + def load_specified_type(solr_response, type) return nil unless solr_response diff --git a/app/models/content/html_file.rb b/app/models/content/html_file.rb index 853fa0c31..4835a3226 100644 --- a/app/models/content/html_file.rb +++ b/app/models/content/html_file.rb @@ -1,32 +1,32 @@ -class HTMLFile < CerberusCore::BaseModels::ContentFile - include Filename - include DownloadPath - include TapasRails::ViewPackages - - core_file_relationship :core_file - - # FIXME: (charles) Failing because property is no longer an accepted - # keyword - # has_and_belongs_to_many :html_for, :property => :is_html_for, - # :class_name => "CoreFile" - - def html_type=(str) - array = available_view_packages_machine - if array.blank? # set defaults for now - array = ["teibp", "tapas_generic"] - end - unless array.include? str - raise Exceptions::InvalidHTMLTypeError.new "HTML type must be one of: " \ - "#{array.join(",")}" - end - - properties.html_type = str - end - - def html_type - properties.html_type.first - end - - # FIXME: (charles) has_metadata is no longer defined in CerberusCore - # has_metadata :name => "properties", :type => PropertiesDatastream -end +# class HTMLFile < CerberusCore::BaseModels::ContentFile +# include Filename +# include DownloadPath +# include TapasRails::ViewPackages +# +# core_file_relationship :core_file +# +# # FIXME: (charles) Failing because property is no longer an accepted +# # keyword +# # has_and_belongs_to_many :html_for, :property => :is_html_for, +# # :class_name => "CoreFile" +# +# def html_type=(str) +# array = available_view_packages_machine +# if array.blank? # set defaults for now +# array = ["teibp", "tapas_generic"] +# end +# unless array.include? str +# raise Exceptions::InvalidHTMLTypeError.new "HTML type must be one of: " \ +# "#{array.join(",")}" +# end +# +# properties.html_type = str +# end +# +# def html_type +# properties.html_type.first +# end +# +# # FIXME: (charles) has_metadata is no longer defined in CerberusCore +# # has_metadata :name => "properties", :type => PropertiesDatastream +# end diff --git a/app/models/content/tei_file.rb b/app/models/content/tei_file.rb index 8dccdfcf0..c1275747e 100644 --- a/app/models/content/tei_file.rb +++ b/app/models/content/tei_file.rb @@ -1,21 +1,21 @@ -class TEIFile < CerberusCore::BaseModels::ContentFile - include Filename - include DownloadPath - - core_file_relationship :core_file - - # FIXME: (charles) :property keyword no longer exists and causes - # this to fail - # has_and_belongs_to_many :tfc_for, :property => :is_tfc_for, - # :class_name => "CoreFile" - - def fedora_file_path - config_path = Rails.application.config.fedora_home - datastream_str = "info:fedora/#{self.pid}/content/content.0" - escaped_datastream = Rack::Utils.escape(datastream_str) - md5_str = Digest::MD5.hexdigest(datastream_str) - dir_name = md5_str[0,2] - file_path = config_path + dir_name + "/" + escaped_datastream - return file_path - end -end +# class TEIFile < CerberusCore::BaseModels::ContentFile +# include Filename +# include DownloadPath +# +# core_file_relationship :core_file +# +# # FIXME: (charles) :property keyword no longer exists and causes +# # this to fail +# # has_and_belongs_to_many :tfc_for, :property => :is_tfc_for, +# # :class_name => "CoreFile" +# +# def fedora_file_path +# config_path = Rails.application.config.fedora_home +# datastream_str = "info:fedora/#{self.pid}/content/content.0" +# escaped_datastream = Rack::Utils.escape(datastream_str) +# md5_str = Digest::MD5.hexdigest(datastream_str) +# dir_name = md5_str[0,2] +# file_path = config_path + dir_name + "/" + escaped_datastream +# return file_path +# end +# end diff --git a/app/models/datastreams/mods_datastream.rb b/app/models/datastreams/mods_datastream.rb index 7d11a9186..0cc4c4f04 100644 --- a/app/models/datastreams/mods_datastream.rb +++ b/app/models/datastreams/mods_datastream.rb @@ -1,36 +1,36 @@ -class ModsDatastream < CerberusCore::Datastreams::ModsDatastream - use_terminology CerberusCore::Datastreams::ModsDatastream - - extend_terminology do |t| - t.identifier(path: "identifier", namespace_prefix: "mods", attributes: { type: :none }) - t.did(path: "identifier", namespace_prefix: "mods", attributes: { type: "did" }) - t.display_authors(path: "name", namespace_prefix: "mods", attributes: {displayLabel: "TAPAS Author"}){ - t.name_part(path: "namePart", namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) - t.role(path: "role", namespace_prefix: 'mods') - } - t.display_contributors(path: "name", namespace_prefix: "mods", attributes: {displayLabel: "TAPAS Contributor"}){ - t.name_part(path: "namePart", namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) - t.role(path: "role", namespace_prefix: 'mods') - } - end - - def to_solr(solr_doc = {}) - solr_doc = super solr_doc - - solr_doc["did_ssim"] = self.did.first if self.did.first.present? - solr_doc["abstract_tesim"] = self.abstract.first - solr_doc["display_authors_ssim"] = self.display_authors.name_part - solr_doc["display_contributors_ssim"] = self.display_contributors.name_part - solr_doc["authors_tesim"] = self.authors - solr_doc["contributors_tesim"] = self.contributors - return solr_doc - end - - def authors - return self.display_authors.name_part - end - - def contributors - return self.display_contributors.name_part - end -end +# class ModsDatastream < CerberusCore::Datastreams::ModsDatastream +# use_terminology CerberusCore::Datastreams::ModsDatastream +# +# extend_terminology do |t| +# t.identifier(path: "identifier", namespace_prefix: "mods", attributes: { type: :none }) +# t.did(path: "identifier", namespace_prefix: "mods", attributes: { type: "did" }) +# t.display_authors(path: "name", namespace_prefix: "mods", attributes: {displayLabel: "TAPAS Author"}){ +# t.name_part(path: "namePart", namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) +# t.role(path: "role", namespace_prefix: 'mods') +# } +# t.display_contributors(path: "name", namespace_prefix: "mods", attributes: {displayLabel: "TAPAS Contributor"}){ +# t.name_part(path: "namePart", namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) +# t.role(path: "role", namespace_prefix: 'mods') +# } +# end +# +# def to_solr(solr_doc = {}) +# solr_doc = super solr_doc +# +# solr_doc["did_ssim"] = self.did.first if self.did.first.present? +# solr_doc["abstract_tesim"] = self.abstract.first +# solr_doc["display_authors_ssim"] = self.display_authors.name_part +# solr_doc["display_contributors_ssim"] = self.display_contributors.name_part +# solr_doc["authors_tesim"] = self.authors +# solr_doc["contributors_tesim"] = self.contributors +# return solr_doc +# end +# +# def authors +# return self.display_authors.name_part +# end +# +# def contributors +# return self.display_contributors.name_part +# end +# end diff --git a/app/models/solr_document.rb b/app/models/solr_document.rb index eea8c22f3..22815a6dc 100644 --- a/app/models/solr_document.rb +++ b/app/models/solr_document.rb @@ -5,7 +5,7 @@ class SolrDocument include Blacklight::Gallery::OpenseadragonSolrDocument # include Blacklight::Document - include CerberusCore::SolrDocumentBehavior + # include CerberusCore::SolrDocumentBehavior include TapasRails::SolrDocumentBehavior include TapasQueries @@ -39,8 +39,12 @@ def any_public_collections? pids = pids.map { |x| "id:#{RSolr.solr_escape(x[12..-1])}" } query = pids.join ' OR ' - ActiveFedora::SolrService.query(query).any? do |collection| + SolrService.query(query).any? do |collection| collection['drupal_access_ssim'] == ['public'] end + + # ActiveFedora::SolrService.query(query).any? do |collection| + # collection['drupal_access_ssim'] == ['public'] + # end end end diff --git a/app/models/user.rb b/app/models/user.rb index b55e68c7c..bace79157 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,15 +1,14 @@ class User < ActiveRecord::Base - include Discard::Model - require "net/http" require "uri" # Connects this user object to Hydra behaviors. - include Hydra::User + # include Hydra::User # Connects this user object to Blacklights Bookmarks. include Blacklight::User - mount_uploader :avatar, AvatarUploader - validates_integrity_of :avatar + # cch: commenting this out to allow for time to upgrade carrierwave + # mount_uploader :avatar, AvatarUploader + # validates_integrity_of :avatar if Blacklight::Utils.needs_attr_accessible? attr_accessible :email, :password, :password_confirmation, :name, :role, :bio, :account_type @@ -17,7 +16,7 @@ class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable - devise :invitable, :database_authenticatable, :registerable, + devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable delegate :can?, :cannot?, :to => :ability @@ -27,6 +26,8 @@ class User < ActiveRecord::Base has_many :community_members has_many :communities, through: :community_members + ROLES = %w[admin paid_user unpaid_user] + ACCOUNT_TYPES = %w[free teic teic_inst] def api_key=(api_key) @@ -49,44 +50,28 @@ def user_key self.id.to_s end - def admin=(n) - if n.to_i == 0 - update(admin_at: nil) - else - update(admin_at: Time.zone.now) - end - end - def admin? - !admin_at.nil? - end - - def paid=(n) - if n.to_i == 0 - update(paid_at: nil) - else - update(paid_at: Time.zone.now) - end + return self.role.eql?('admin') end def paid_user? - !paid_at.nil? + return self.role.eql?('paid_user') end def unpaid_user? - paid_at.nil? + return self.role.eql?('unpaid_user') end def self.find_by_user_key(key) - send("find_by_nuid".to_sym, key) + self.send("find_by_nuid".to_sym, key) end def forem_name - name + self.name end def forem_email - email + self.email end def check_paid_status @@ -140,15 +125,15 @@ def after_database_authentication private - def generate_api_key - key = Devise.friendly_token + def generate_api_key + key = Devise.friendly_token - @api_key = Digest::SHA512.hexdigest key + @api_key = Digest::SHA512.hexdigest key - if User.where(:encrypted_api_key => @api_key) - generate_api_key - else - self.encrypted_api_key = @api_key + if User.where(:encrypted_api_key => @api_key) + generate_api_key + else + self.encrypted_api_key = @api_key + end end - end end diff --git a/app/validators/core_file_validator.rb b/app/validators/core_file_validator.rb index c9f0571a8..3213ab555 100644 --- a/app/validators/core_file_validator.rb +++ b/app/validators/core_file_validator.rb @@ -28,7 +28,7 @@ def validate_collection_dids # Retrieve solr documents for every collection did passed in. qs = collection_dids.map { |x| "did_ssim:#{RSolr.solr_escape(x)}" } qs = "(#{qs.join(' OR ')})" + ' AND active_fedora_model_ssi:Collection' - collections = ActiveFedora::SolrService.query(qs) + collections = SolrService.query(qs) # Raise an error if there are fewer collections than collection_dids unless collection_dids.length == collections.length diff --git a/app/views/catalog/_index_default.html.haml b/app/views/catalog/_index_default.html.haml index d40365b8e..7dbe22e1b 100644 --- a/app/views/catalog/_index_default.html.haml +++ b/app/views/catalog/_index_default.html.haml @@ -11,12 +11,12 @@ = "Collections:" %dd.blacklight-collections - document['collections_pids_ssim'].each do |col| - - collection = SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{col}\"").first) + - collection = SolrDocument.new(SolrService.query("id:\"#{col}\"").first) = link_to(collection.title, collection_path(collection.id)) - if document.collections.count > 1 %br - if !document.project.blank? - - project = SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{document.project}\"").first) + - project = SolrDocument.new(SolrService.query("id:\"#{document.project}\"").first) %dt.blacklight-project = "Project:" %dd.blacklight-project diff --git a/bin/rails b/bin/rails index 4796aaaa8..87d77cc90 100755 --- a/bin/rails +++ b/bin/rails @@ -1,11 +1,13 @@ -# pre-upgrade - 03272023 by CCH - #!/usr/bin/env ruby -APP_PATH = File.expand_path('../../config/application', __FILE__) +APP_PATH = File.expand_path('../config/application', __dir__) require_relative '../config/boot' require 'rails/commands' + +# ************** +# pre-upgrade - 03272023 by CCH + #!/usr/bin/env ruby -# APP_PATH = File.expand_path('../config/application', __dir__) +# APP_PATH = File.expand_path('../../config/application', __FILE__) # require_relative '../config/boot' # require 'rails/commands' diff --git a/config/blacklight.yml b/config/blacklight.yml index 4020beb02..73f62d803 100644 --- a/config/blacklight.yml +++ b/config/blacklight.yml @@ -1,39 +1,10 @@ -# = jetty_path key -# each environment can have a jetty_path with absolute or relative -# (to app root) path to a jetty/solr install. This is used -# by the rake tasks that start up solr automatically for testing -# and by rake solr:marc:index. -# -# jetty_path is not used by a running Blacklight application -# at all. In general you do NOT need to deploy solr in Jetty, you can deploy it -# however you want. -# jetty_path is only required for rake tasks that need to know -# how to start up solr, generally for automated testing. - -# development: -# adapter: solr -# url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/development" %> -# test: &test -# adapter: solr -# url: <%= "http://127.0.0.1:#{ENV['TEST_JETTY_PORT'] || 8888}/solr/blacklight-core" %> -# production: -# adapter: solr -# url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/development" %> - - -# This is a sample config file that does not have multiple solr instances. You will also need to be sure to -# edit the fedora.yml file to match the solr URL for active-fedora. +load_defaults: 7.19.2 development: - url: http://localhost:8983/ adapter: solr -staging: - url: http://localhost:8080/solr/development + url: <%= ENV['DEV_SOLR_URL'] || "http://127.0.0.1:8983/solr/tapas-blacklight-core" %> +test: &test adapter: solr + url: <%= ENV['TEST_SOLR_URL'] || "http://127.0.0.1:8983/solr/tapas-blacklight-core" %> production: - url: http://localhost:8080/solr/development adapter: solr -test: &TEST - url: <%= "http://127.0.0.1:#{ENV['TEST_JETTY_PORT'] || 8983}/solr/test" %> - adapter: solr -cucumber: - <<: *TEST + url: <%= ENV['PROD_SOLR_URL'] || "http://127.0.0.1:8983/solr/tapas-blacklight-core" %> diff --git a/config/database.yml b/config/database.yml index c7d12e883..c254e35b4 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,30 +1,58 @@ default: &default adapter: mysql2 - encoding: utf8 - username: <%= ENV['MYSQL_USER'] %> - password: <%= ENV['MYSQL_PASSWORD'] %> - pool: 5 - timeout: 5000 + encoding: utf8mb4 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + username: <%= ENV['MYSQL_DEV_USER'] %> + password: <%= ENV['MYSQL_DEV_PASSWORD'] %> + socket: /tmp/mysql.sock development: <<: *default - database: tapas + database: tapas_development -staging: +# 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: <<: *default - host: <%= ENV['MYSQL_HOST'] %> - port: <%= ENV['MYSQL_PORT'] %> - database: tapas_rails_staging + database: tapas_test production: <<: *default - host: <%= ENV['MYSQL_HOST'] %> - port: <%= ENV['MYSQL_PORT'] %> - database: tapas_rails_production + database: tapas_production + username: <%= ENV['MYSQL_USER'] %> + password: <%= ENV['MYSQL_PASSWORD'] %> + + + +#default: &default +# adapter: mysql2 +# encoding: utf8 +# pool: 5 +# timeout: 5000 + +#development: +# <<: *default +# username: <%#= ENV['MYSQL_DEV_USER'] %> +# password: <%#= ENV['MYSQL_DEV_PASSWORD'] %> +# socket: /tmp/mysql.sock +# database: tapas_development + +#staging: +# <<: *default +# host: <%#= ENV['MYSQL_HOST'] %> +# port: <%#= ENV['MYSQL_PORT'] %> +# database: tapas_rails_staging + +#production: +# <<: *default +# host: <%#= ENV['MYSQL_HOST'] %> +# port: <%#= ENV['MYSQL_PORT'] %> +# database: tapas_rails_production # 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: - <<: *default - database: tapas_test +#test: +# <<: *default +# database: tapas_test diff --git a/config/fedora.yml b/config/fedora.yml deleted file mode 100644 index 323efc293..000000000 --- a/config/fedora.yml +++ /dev/null @@ -1,18 +0,0 @@ -development: - user: fedoraAdmin - password: fedoraAdmin - url: http://tomcat.archimedes.digital/fcrepo-webapp-5.1.0 -staging: - user: fedoraAdmin - password: <%= ENV['STAGING_FEDORA_PASSWORD'] %> - url: http://127.0.0.1:8080/fedora -production: - user: fedoraAdmin - password: <%= ENV['PRODUCTION_FEDORA_PASSWORD'] %> - url: http://127.0.0.1:8080/fedora -test: &TEST - user: fedoraAdmin - password: fedoraAdmin - url: <%= "http://127.0.0.1:#{ENV['TEST_JETTY_PORT'] || 8983}/fedora-test" %> -cucumber: - <<: *TEST diff --git a/config/initializers/solr_service.rb b/config/initializers/solr_service.rb new file mode 100644 index 000000000..a7afa2924 --- /dev/null +++ b/config/initializers/solr_service.rb @@ -0,0 +1 @@ +::SolrService = Blacklight.default_index.connection diff --git a/config/jetty.yml b/config/jetty.yml deleted file mode 100644 index c98921780..000000000 --- a/config/jetty.yml +++ /dev/null @@ -1,15 +0,0 @@ -default: - jetty_port: 8983 - java_opts: - - "-XX:MaxPermSize=128m" - - "-Xmx256m" -staging: - jetty_port: 8080 - java_opts: - - "-XX:MaxPermSize=128m" - - "-Xmx256m" -production: - jetty_port: 8987 - java_opts: - - "-XX:MaxPermSize=128m" - - "-Xmx256m" diff --git a/config/sunspot.yml b/config/sunspot.yml deleted file mode 100644 index 5e8109236..000000000 --- a/config/sunspot.yml +++ /dev/null @@ -1,23 +0,0 @@ -production: - solr: - hostname: localhost - port: 8983 - log_level: WARNING - path: /solr/production - # read_timeout: 2 - # open_timeout: 0.5 - -development: - solr: - hostname: localhost - port: 8982 - log_level: INFO - path: /solr/development - -test: - solr: - hostname: localhost - port: 8981 - log_level: WARNING - path: /solr/test - \ No newline at end of file diff --git a/fedora_conf/conf/development/fedora.fcfg b/fedora_conf/conf/development/fedora.fcfg deleted file mode 100644 index 8264b1b22..000000000 --- a/fedora_conf/conf/development/fedora.fcfg +++ /dev/null @@ -1,953 +0,0 @@ - - - - Source of mappings from MIMETYPE to file extension - - - Controls filename extension mapping when the datastream ID is used - as the source of the filename. Values are as above. - - - Maximum number of Fedora http client connections allowed to a given host. - - - Number of seconds Fedora http client will wait for data coming across an - established http connection. - - - Defines the host name for the Fedora server, as seen from the - outside world. - - - Controls filename extension mapping when the datastream label is used - as the source of the filename. Values are always: always generate an extension - based on the MIMETYPE, using the default extension if none can be determined; - ifmissing: generate an extension if the filename obtained from the source does not - already contain one (again returning the default if there is no MIMETYPE-to-extension - mapping is found); never: never generate an extension, use the filename from the source - as-is - - - Maximun number of redirects the Fedora http client will follow (only if - httpClientFollowRedirects is set to true.) - - - The value to be set for the User-Agent HTTP request header. - - - Maximum number of total Fedora http client connections allowed at once. - - - determines the source of the filename generated when download=true - on a datastream dissemination. Value is space separated list of label: use the datastream label; - id: use the datastream ID; rels: use the value defined in RELS-INT. Each - source is checked in order, and the first containing a value is used. Omit - any of the sources if that source is never to be used. If no sources are to be used, - and just the default filename and extension below are to be used, specify " ". - - - Defines one or more email addresses for server administrators; - list is space delimited. - - - Determines the time interval in which external mechanisms must - respond to requests by the Fedora server. The value is specified in - milliseconds. The value specified should be set high enough to allow - for an average response time from any single external mechanisms. Note - this value must be less than the limit specified for the - datastreamExpirationLimit. - - - Defines the port number on which the Fedora server runs; - default is 8080. - - - Defines the redirect port of the Fedora sever; default is 8443. - - - Should the Fedora http client follow redirects? - - - Controls filename extension mapping when no filename can be determined from - the sources listed in datastreamFilenameSource. Values are always: always generate an extension - based on the MIMETYPE (using the default if no appropriate mapping is specified); - never: never generate an extension. - - - determines if a content-disposition header specifying "inline" and - a filename is added to the response for the REST API getDatastreamDissemination - when no query parameter of download=true is specified. Browser support for - recognising a filename in case of "inline" content disposition is patchy, - so you may wish to disable the content disposition header in this case and only - have it provided when download=true is specified, in which case the content disposition - of "attachment" will be used; which is generally supported. - - - Defines the context name for the Fedora server within the - application server. If set to eg "myfedora" the URL for Fedora will result - in http[s]://fedoraServerHost[:fedoraServerPort]/myfedora. - - - Defines the port number used to shutdown the Fedora sever; - default is 8005. - - - Extension to use when none can be determined from mappings - - - Filename to use for datastream downloads when none can be determined from the - sources listed in datastreamFilenameSource. - - - Controls the size of the datastream mediation hash by removing - entries outside the specified threshold. The value is specified in - seconds. Note this value must be greater than the limit specified for - the datastreamMediationLimit. - - - Controls filename extension mapping when RELS-INT is used - as the source of the filename. Values are as above. - - - Number of seconds Fedora http client will wait for a connection before timing - out. - - - Defines a human readable name for the Fedora server; default is - Fedora Repository. - - - Builds and manages Fedora's authorization structure. - - This parameter is for future use. - - - - - - - - - - - Description: Interface to the backend service security - configuration. This module initializes backend service security - information in the server by parsing the beSecurity configuration file. - This file is located in the distribution in - $FEDORA_HOME/dist/server/config/beSecurity.xml. The configuration file - is read once at server startup. - - The character encoding used for the beSecurity - configuration file. The default is "utf-8". The value - specified must correspond to the character encoding used in the - beSecurity configuration file. - - - Controls whether beSecurity config file is validated - against the beSecurityDescription schema. The default is - "false". Valid values are "true" or - "false". - - - - The interface to the storage subsystem. This provides - context-appropriate DOReaders and DOWriters for reflecting on and - writing to the objects stored in the repository. It also provides - methods for reflecting on the contents of the repository as a whole.. - - The control group to use for the system-generated DC datastream - if no DC datastream is present on ingest. Must be "X" or "M". - - - The associated password for accessing the REST endpoint - of the Fedora Generic Search service. This parameter is only - required if GSearchDOManager is used, and the service requires - authentication. - - - If the serialization format is text-based, this is the - character encoding that should be used. Default is UTF-8. - - - The username for accessing the REST endpoint of the - Fedora Generic Search service. This parameter is only required if - GSearchDOManager is used, and the service requires - authentication. - - - The named connection pool from which read/write database - connections are to be provided for the storage subsystem (see the - ConnectionPoolManager module). Default is the default provided by the - ConnectionPoolManager. - - - Hints are gathered and passed to the underline storage systems (only Akubra for now). - These are meta data or contextual information about object or datastream to be added or updated. - The default implementation is NullStorageHintsProvider; it provides no hints. You you can implement - your own FedoraStorageHintProvider and drop your implementation to the $CATALINA_HOME/webapps/fedora/WEB_INF/classes - directory (unpackaged), or the $CATALINA_HOME/webapps/fedora/WEB_INF/lib director (packaged). - - - The REST endpoint of the Fedora Generic Search service. - This parameter is only required if GSearchDOManager is - used. - - - - The control group to use for system-generated RELS-EXT and - RELS-INT datastreams where these are not already present when - adding relationships via addRelationship. Must be "X" or "M". - - - This is the namespace id for pids of newly-created objects. - This should be unique for a repository. It can be from 1 to 17 - characters, and may only contain A-Z, a-z, 0-9, '.', or '-' (dash). - - - - The management subsystem. This implements the methods necessary - to fulfill API-M requests without regard to: - - how the service is exposed - - how bytestreams and java types might be marshalled/demarshalled over the wire - - how the storage subsystem is implemented. - - Optional, default is 60000 (1 minute). - This specifies the amount of time between checks to remove - temporary files uploaded via the API-M upload interface. During - each check, old files whose age exceeds uploadStorageMinutes - will be removed. - - - - Specifies which checksumming algorithm is to be used when - automatically computing checksums as specified by the above - parameter. Valid values are: MD5 SHA-1 SHA-256 SHA-384 SHA-512. - - - Optional, default is 5. - This specifies the minimum amount of time that each uploaded - file should be kept in temporary storage. - - - Controls whether a checksum is automatically computed for - every datastream as the datastream is added to the repository. This - will allow the integrity of datastream contents to be periodically - checked to insure the object is not corrupted. - - - - Description: The access subsystem. This implements the methods - necessary to fulfill API-A requests without regard to: - - how the service is exposed - - how bytestreams and java types might be marshalled/demarshalled - over the wire. - - A boolean switch indicating whether Datastream Mediation is - activated or not. Datastream Mediation is required if using basic - authentication for API-A. When basic authentication is enabled for - API-A, backend services used by custom disseminations may or may not be - capable of authenticating with the Fedora server. Datastream mediation - coupled with the backend service configuration information in the - beSecurity.xml file enables the Fedora server to determine which backend - services are required to authenticate and which ones are allowed to - connect without authentication. Datastream mediation provides additional - repository security by not exposing the physical location of Referenced - Content datastreams to external mechanisms(services). Instead of - exposing the actual physical location of Referenced Content datastreams, - Datastream Mediation functions as a proxy requiring all external - services to communicate through the Fedora server to resolve the - location of Referenced Content datastreams. - - IMPORTANT: For Datastream Mediation to function, the Fedora server must - be internet accessible using the configured name for fedoraServerHost - and fedoraServerPort. For example, using the default fedoraServerHost - value of "localhost" will not work if you have remote backend services - since the hostname of "localhost" will not be resolvable as the Fedora - server by the remote backend services. This requirement can be difficult - to satisfy if the Fedora server is located behind a firewall and you do - not have ready access to the firewall's configuration to enable the - required access. If the Fedora server is behind a firewall and you have - no access to the firewall's configuration, you are limited to keeping - Datastream Mediation turned off. Note that this will also prevent you - from using basic authentication with API-A. The default value of - doMediateDatastreams is false. - - - - The dynamic behavior module for the access subsystem. This - implements the methods necessary to fulfill API-A requests without - regard to: - - dynamically associating a default behavior definition and mechanism with objects - - (Future) dynamically associating other behavior definitions and mechanisms - with objects - - running disseminations of dynamic behaviors - - The interface that defines the methods of the bootstrap - disseminator. These methods are "built-in" to the Fedora system, and - are dynamically associated with every behavior definition and - behavior mechanism object. - - - The class that implements the methods of the bootstrap - disseminator. These method implementations are "built-in" to the - Fedora system, and are dynamically associated with every behavior - definition and behavior mechanism object. This class can be thought - of as implementing an "internal service" whereas other disseminators - use external services (described by WSDL) to do their work. - - - The interface that defines the methods of the default - disseminator. These methods are "built-in" to the Fedora system, and - are dynamically associated with every object. - - - The class that implements the methods of the default - disseminator. These method implementations are "built-in" to the - Fedora system, and are dynamically associated with every object. - This class can be though of as implementing an "internal service" - whereas other disseminators use external services (described by - WSDL) to do their work. - - - - Supports the API-A simpleSearch and advancedSearch methods. - - (optional, default is true) Whether the content of the DC - datastream should be examined and the contents indexed, for each object. - You may wish to save time and space by disabling DC field indexing, - particularly if you have an external search service (such as Fedora - Generic Search) that already fulfills this need. - Note: If you change this value on a Fedora repository that has been - running for some time, you will need to perform a SQL rebuild using the - Fedora Rebuilder tool if you want to change objects that have already - been ingested. - - - (optional) To make unspecified, comment out or delete the - whole param line as opposed to using an empty string, - default=ConnectionPoolManager's default) The connectionPool - providing the connection to the database to be used. Warning: When - setting these values, keep in mind that while a session is not timed - out (maxSecondsPerSession seconds haven't elapsed, and not all - results have been requested), a connection from the pool is tied up. - Therefore, the connectionPool should be at least of size n, large - enough to accomodate n simultaneous search sessions. The longer - maxSecondsPerSession is, the more chance you have of tying up all - available connections from the pool. Therefore, keep - maxSecondsPerSession fairly low, but still reasonable for an - automated program or user to serially get a long list of results, - and make sure you have a connectionPool large enough to accomodate - your users. - - - (required, must be > 0) - The maximum number of seconds that the server guarantees subsequent - search results may be obtained. This is only used in cases where the - number of results is greater than maxResults (as specified by the - server [above] or the client [in the search request]). - - - (required, must be > 0) - The maximum number of records to - return as the result of a search. Even if a client requests more - results at a time, this is the cutoff value. - - - - Supports the ResourceIndex. - - (required) - Index level. Currently, only 0, and 1 are supported levels. - 0 = off and 1 = on. - WARNING: changing the level (except to 0) requires - running the Resource Index Rebuilder. - - - (optional, default is false) - Whether to flush the triple buffer before - returning from object modification operations. - Specifying this as true will ensure that RI queries - immediately reflect the latest triples. - Specifying false will not provide this guarantee, - but can significantly reduce roundtrip time for - API-M operations (depending on the triplestore - implementation). - - - (required) - Name of the triplestore to use. WARNING: changing the - triplestore running the Resource Index Rebuilder. - - - (optional) Aliases that can be used for queries. The param - name of an alias starts with the string "alias:" and is followed by - the name of the alias (shortcut) for the value, which is a URI - prefix. For example: name="alias:test" - value="http://example.org/terms#" will allow a query to use - test:apple instead of http://example.org/terms#apple - - - - Description: Exposes the repository for OAI harvesters. - - - - - - - - - Supports translation from DigitalObject to a stream of some - format, and vice-versa. The parameters below specify - serializer/deserializer classes to be used for a given format. Those - classes must implement the DOSerializer/DODeserializer interfaces. - - - - - - - - - - - - - - - The pid generator. - - - - Fedora's Java Messaging Service (JMS) Module - - - - - A datastore representing a JMS Destination for APIM events which update the repository - - - A datastore representing a JMS Destination for APIM events which do not update the repository - - - - This module facilitates obtaining ConnectionPools - - - - - Description: Supports validation of digital objects, including - XML Schema validation, Schematron validation (to Fedora Rules schema - written in Schematron language), and other programatic validation - including referential integrity checking of existence and - availability of distributed data and/or services. - - (required) - This is a directory that the validation module can use as a work space, as - when it must write a temporary file. - - - The local path to the Schematron Rules used for - Fedora-specific on Atom XML files. - - - - The local path to the Schematron Rules used for - Fedora-specific on Atom Zip files. - - - The local path to the Schematron Rules used for - Fedora-specific validation on FOXML 1.1 XML files. - - - The local path to the Schematron Rules used for - Fedora-specific validation on FOXML 1.0 XML files. - - - The local path for the Fedora-METS XML - schema used to do XML schema validation of digital objects. - - - The local path for the Fedora-METS 1.0 XML - schema used to do XML schema validation of digital objects. - - - The local path for the OASIS XACML XML policy schema - used to do XML schema validation of XACML policies. - - - The local path for the Fedora FOXML 1.1 XML schema - used to do XML schema validation of digital objects - - - The local path for the Fedora FOXML 1.0 XML schema - used to do XML schema validation of digital objects - - - The local path for the Atom XML schema used to do XML - schema validation of digital objects - - - The local path to the Schematron Rules used for - Fedora-specific validation on Fedora-METS 1.0 XML files. - - - The local path for the Atom XML schema used to do XML - schema validation of digital objects - - - The local path to the Schematron Rules used for - Fedora-specific validation on Fedora-METS XML files. - - - - This module facilitates obtaining external content via HTTP - - - MySQL database on localhost with db name of fedora3. Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - Derby database on localhost running on port 1527 Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - Oracle database on localhost with SID=fedora3 Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - PostgreSQL database on localhost with db name of fedora3. Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - local Mulgara Triplestore used by the Resource Index - - The initial size of the session pool used for queries. - Note: A value of 0 will cause the Resource Index to operate in - synchronized mode: concurrent read/write requests are put in a queue - and handled in FIFO order; this will severely impair performance and - is only intended for debugging. - - - The maximum size the buffer can reach before being forcibly - flushed. If this threshold is reached, flushing will occur in the - foreground and the buffer will be locked for writing until it is - finished. This should be larger than autoFlushBufferSize. - - - Create the model if it doesn't already exist. - At startup, the model will be automatically created. In addition, an - XML schema datatyped model named "xsd" will also be automatically - created. - - - The number of updates to send to the triplestore at a time. - This should be the same size as, or smaller than - autoFlushBufferSize. - - - Whether to propagate adds/deletes to a full-text - [Full-Text] model automatically. While a very useful feature, - enabling full-text indexing adds significantly to object ingest - times. If true, the text model will be named modelName-fullText. - Note that if this is true and autoCreate is true, the text model - will also be created if it doesn't already exist. - - - Maximum number of additional sessions the pool may add. If - specified as -1, no limit will be placed on pool growth. - - - Tells the connector to communicate with Mulgara in remote or - local mode. If true, the host parameter must be defined. If false, - the path parameter must be defined. - - - Seconds of buffer inactivity that will trigger an - auto-flush. If this threshold is reached, flushing will occur in the - background, during which time the buffer is still available for - writing. - - - The server name for rmi binding. - - - The size at which the buffer should be auto-flushed. If - this threshold is reached, flushing will occur in the background, - during which time the buffer is still available for - writing. - - - The name of the model to use. - - - Whether the triplestore should be read-only. Most Fedora - repositories will set this to false. - - - The local path to the main triplestore directory. - - - The name of the Trippi Connector class used to communicate - with the triplestore. - - - - Example local MPTStore backed by Postgres. - To use this triplestore for the Resource Index: - 1) In fedora.fcfg, change the "datastore" parameter of the - ResourceIndex module to localPostgresMPTTriplestore. - 2) Login to your Postgres server as an administrative user and - run the following commands: - CREATE ROLE "fedoraAdmin" LOGIN PASSWORD 'fedoraAdmin' - NOINHERIT CREATEDB - VALID UNTIL 'infinity'; - CREATE DATABASE "riTriples" - WITH ENCODING='SQL_ASCII' - OWNER="fedoraAdmin"; - 3) Make sure you can login to your Postgres server as fedoraAdmin. - 4) Download the appropriate Postgres JDBC 3 driver from - http://jdbc.postgresql.org/download.html - and make sure it's accessible to your servlet container. - If you're running Tomcat, putting it in common/lib/ will work. - - - - - - - - - - - - - - - - - Messaging Destination for API-M events which update the repository - - A space-separated list of message types that will be - delivered to this Destination. Currently, "apimUpdate" and - "apimAccess" are the only supported message types. - - - - Optional, defaults to topic. - - - - Messaging Destination for API-M events which did not make changes to the repository - - A space-separated list of message types that will be - delivered to this Destination. Currently, "apimUpdate" and - "apimAccess" are the only supported message types. - - - - Optional, defaults to topic. - - - diff --git a/fedora_conf/conf/test/fedora.fcfg b/fedora_conf/conf/test/fedora.fcfg deleted file mode 100644 index 6506b4d2a..000000000 --- a/fedora_conf/conf/test/fedora.fcfg +++ /dev/null @@ -1,953 +0,0 @@ - - - - Source of mappings from MIMETYPE to file extension - - - Controls filename extension mapping when the datastream ID is used - as the source of the filename. Values are as above. - - - Maximum number of Fedora http client connections allowed to a given host. - - - Number of seconds Fedora http client will wait for data coming across an - established http connection. - - - Defines the host name for the Fedora server, as seen from the - outside world. - - - Controls filename extension mapping when the datastream label is used - as the source of the filename. Values are always: always generate an extension - based on the MIMETYPE, using the default extension if none can be determined; - ifmissing: generate an extension if the filename obtained from the source does not - already contain one (again returning the default if there is no MIMETYPE-to-extension - mapping is found); never: never generate an extension, use the filename from the source - as-is - - - Maximun number of redirects the Fedora http client will follow (only if - httpClientFollowRedirects is set to true.) - - - The value to be set for the User-Agent HTTP request header. - - - Maximum number of total Fedora http client connections allowed at once. - - - determines the source of the filename generated when download=true - on a datastream dissemination. Value is space separated list of label: use the datastream label; - id: use the datastream ID; rels: use the value defined in RELS-INT. Each - source is checked in order, and the first containing a value is used. Omit - any of the sources if that source is never to be used. If no sources are to be used, - and just the default filename and extension below are to be used, specify " ". - - - Defines one or more email addresses for server administrators; - list is space delimited. - - - Determines the time interval in which external mechanisms must - respond to requests by the Fedora server. The value is specified in - milliseconds. The value specified should be set high enough to allow - for an average response time from any single external mechanisms. Note - this value must be less than the limit specified for the - datastreamExpirationLimit. - - - Defines the port number on which the Fedora server runs; - default is 8080. - - - Defines the redirect port of the Fedora sever; default is 8443. - - - Should the Fedora http client follow redirects? - - - Controls filename extension mapping when no filename can be determined from - the sources listed in datastreamFilenameSource. Values are always: always generate an extension - based on the MIMETYPE (using the default if no appropriate mapping is specified); - never: never generate an extension. - - - determines if a content-disposition header specifying "inline" and - a filename is added to the response for the REST API getDatastreamDissemination - when no query parameter of download=true is specified. Browser support for - recognising a filename in case of "inline" content disposition is patchy, - so you may wish to disable the content disposition header in this case and only - have it provided when download=true is specified, in which case the content disposition - of "attachment" will be used; which is generally supported. - - - Defines the context name for the Fedora server within the - application server. If set to eg "myfedora" the URL for Fedora will result - in http[s]://fedoraServerHost[:fedoraServerPort]/myfedora. - - - Defines the port number used to shutdown the Fedora sever; - default is 8005. - - - Extension to use when none can be determined from mappings - - - Filename to use for datastream downloads when none can be determined from the - sources listed in datastreamFilenameSource. - - - Controls the size of the datastream mediation hash by removing - entries outside the specified threshold. The value is specified in - seconds. Note this value must be greater than the limit specified for - the datastreamMediationLimit. - - - Controls filename extension mapping when RELS-INT is used - as the source of the filename. Values are as above. - - - Number of seconds Fedora http client will wait for a connection before timing - out. - - - Defines a human readable name for the Fedora server; default is - Fedora Repository. - - - Builds and manages Fedora's authorization structure. - - This parameter is for future use. - - - - - - - - - - - Description: Interface to the backend service security - configuration. This module initializes backend service security - information in the server by parsing the beSecurity configuration file. - This file is located in the distribution in - $FEDORA_HOME/dist/server/config/beSecurity.xml. The configuration file - is read once at server startup. - - The character encoding used for the beSecurity - configuration file. The default is "utf-8". The value - specified must correspond to the character encoding used in the - beSecurity configuration file. - - - Controls whether beSecurity config file is validated - against the beSecurityDescription schema. The default is - "false". Valid values are "true" or - "false". - - - - The interface to the storage subsystem. This provides - context-appropriate DOReaders and DOWriters for reflecting on and - writing to the objects stored in the repository. It also provides - methods for reflecting on the contents of the repository as a whole.. - - The control group to use for the system-generated DC datastream - if no DC datastream is present on ingest. Must be "X" or "M". - - - The associated password for accessing the REST endpoint - of the Fedora Generic Search service. This parameter is only - required if GSearchDOManager is used, and the service requires - authentication. - - - If the serialization format is text-based, this is the - character encoding that should be used. Default is UTF-8. - - - The username for accessing the REST endpoint of the - Fedora Generic Search service. This parameter is only required if - GSearchDOManager is used, and the service requires - authentication. - - - The named connection pool from which read/write database - connections are to be provided for the storage subsystem (see the - ConnectionPoolManager module). Default is the default provided by the - ConnectionPoolManager. - - - Hints are gathered and passed to the underline storage systems (only Akubra for now). - These are meta data or contextual information about object or datastream to be added or updated. - The default implementation is NullStorageHintsProvider; it provides no hints. You you can implement - your own FedoraStorageHintProvider and drop your implementation to the $CATALINA_HOME/webapps/fedora/WEB_INF/classes - directory (unpackaged), or the $CATALINA_HOME/webapps/fedora/WEB_INF/lib director (packaged). - - - The REST endpoint of the Fedora Generic Search service. - This parameter is only required if GSearchDOManager is - used. - - - - The control group to use for system-generated RELS-EXT and - RELS-INT datastreams where these are not already present when - adding relationships via addRelationship. Must be "X" or "M". - - - This is the namespace id for pids of newly-created objects. - This should be unique for a repository. It can be from 1 to 17 - characters, and may only contain A-Z, a-z, 0-9, '.', or '-' (dash). - - - - The management subsystem. This implements the methods necessary - to fulfill API-M requests without regard to: - - how the service is exposed - - how bytestreams and java types might be marshalled/demarshalled over the wire - - how the storage subsystem is implemented. - - Optional, default is 60000 (1 minute). - This specifies the amount of time between checks to remove - temporary files uploaded via the API-M upload interface. During - each check, old files whose age exceeds uploadStorageMinutes - will be removed. - - - - Specifies which checksumming algorithm is to be used when - automatically computing checksums as specified by the above - parameter. Valid values are: MD5 SHA-1 SHA-256 SHA-384 SHA-512. - - - Optional, default is 5. - This specifies the minimum amount of time that each uploaded - file should be kept in temporary storage. - - - Controls whether a checksum is automatically computed for - every datastream as the datastream is added to the repository. This - will allow the integrity of datastream contents to be periodically - checked to insure the object is not corrupted. - - - - Description: The access subsystem. This implements the methods - necessary to fulfill API-A requests without regard to: - - how the service is exposed - - how bytestreams and java types might be marshalled/demarshalled - over the wire. - - A boolean switch indicating whether Datastream Mediation is - activated or not. Datastream Mediation is required if using basic - authentication for API-A. When basic authentication is enabled for - API-A, backend services used by custom disseminations may or may not be - capable of authenticating with the Fedora server. Datastream mediation - coupled with the backend service configuration information in the - beSecurity.xml file enables the Fedora server to determine which backend - services are required to authenticate and which ones are allowed to - connect without authentication. Datastream mediation provides additional - repository security by not exposing the physical location of Referenced - Content datastreams to external mechanisms(services). Instead of - exposing the actual physical location of Referenced Content datastreams, - Datastream Mediation functions as a proxy requiring all external - services to communicate through the Fedora server to resolve the - location of Referenced Content datastreams. - - IMPORTANT: For Datastream Mediation to function, the Fedora server must - be internet accessible using the configured name for fedoraServerHost - and fedoraServerPort. For example, using the default fedoraServerHost - value of "localhost" will not work if you have remote backend services - since the hostname of "localhost" will not be resolvable as the Fedora - server by the remote backend services. This requirement can be difficult - to satisfy if the Fedora server is located behind a firewall and you do - not have ready access to the firewall's configuration to enable the - required access. If the Fedora server is behind a firewall and you have - no access to the firewall's configuration, you are limited to keeping - Datastream Mediation turned off. Note that this will also prevent you - from using basic authentication with API-A. The default value of - doMediateDatastreams is false. - - - - The dynamic behavior module for the access subsystem. This - implements the methods necessary to fulfill API-A requests without - regard to: - - dynamically associating a default behavior definition and mechanism with objects - - (Future) dynamically associating other behavior definitions and mechanisms - with objects - - running disseminations of dynamic behaviors - - The interface that defines the methods of the bootstrap - disseminator. These methods are "built-in" to the Fedora system, and - are dynamically associated with every behavior definition and - behavior mechanism object. - - - The class that implements the methods of the bootstrap - disseminator. These method implementations are "built-in" to the - Fedora system, and are dynamically associated with every behavior - definition and behavior mechanism object. This class can be thought - of as implementing an "internal service" whereas other disseminators - use external services (described by WSDL) to do their work. - - - The interface that defines the methods of the default - disseminator. These methods are "built-in" to the Fedora system, and - are dynamically associated with every object. - - - The class that implements the methods of the default - disseminator. These method implementations are "built-in" to the - Fedora system, and are dynamically associated with every object. - This class can be though of as implementing an "internal service" - whereas other disseminators use external services (described by - WSDL) to do their work. - - - - Supports the API-A simpleSearch and advancedSearch methods. - - (optional, default is true) Whether the content of the DC - datastream should be examined and the contents indexed, for each object. - You may wish to save time and space by disabling DC field indexing, - particularly if you have an external search service (such as Fedora - Generic Search) that already fulfills this need. - Note: If you change this value on a Fedora repository that has been - running for some time, you will need to perform a SQL rebuild using the - Fedora Rebuilder tool if you want to change objects that have already - been ingested. - - - (optional) To make unspecified, comment out or delete the - whole param line as opposed to using an empty string, - default=ConnectionPoolManager's default) The connectionPool - providing the connection to the database to be used. Warning: When - setting these values, keep in mind that while a session is not timed - out (maxSecondsPerSession seconds haven't elapsed, and not all - results have been requested), a connection from the pool is tied up. - Therefore, the connectionPool should be at least of size n, large - enough to accomodate n simultaneous search sessions. The longer - maxSecondsPerSession is, the more chance you have of tying up all - available connections from the pool. Therefore, keep - maxSecondsPerSession fairly low, but still reasonable for an - automated program or user to serially get a long list of results, - and make sure you have a connectionPool large enough to accomodate - your users. - - - (required, must be > 0) - The maximum number of seconds that the server guarantees subsequent - search results may be obtained. This is only used in cases where the - number of results is greater than maxResults (as specified by the - server [above] or the client [in the search request]). - - - (required, must be > 0) - The maximum number of records to - return as the result of a search. Even if a client requests more - results at a time, this is the cutoff value. - - - - Supports the ResourceIndex. - - (required) - Index level. Currently, only 0, and 1 are supported levels. - 0 = off and 1 = on. - WARNING: changing the level (except to 0) requires - running the Resource Index Rebuilder. - - - (optional, default is false) - Whether to flush the triple buffer before - returning from object modification operations. - Specifying this as true will ensure that RI queries - immediately reflect the latest triples. - Specifying false will not provide this guarantee, - but can significantly reduce roundtrip time for - API-M operations (depending on the triplestore - implementation). - - - (required) - Name of the triplestore to use. WARNING: changing the - triplestore running the Resource Index Rebuilder. - - - (optional) Aliases that can be used for queries. The param - name of an alias starts with the string "alias:" and is followed by - the name of the alias (shortcut) for the value, which is a URI - prefix. For example: name="alias:test" - value="http://example.org/terms#" will allow a query to use - test:apple instead of http://example.org/terms#apple - - - - Description: Exposes the repository for OAI harvesters. - - - - - - - - - Supports translation from DigitalObject to a stream of some - format, and vice-versa. The parameters below specify - serializer/deserializer classes to be used for a given format. Those - classes must implement the DOSerializer/DODeserializer interfaces. - - - - - - - - - - - - - - - The pid generator. - - - - Fedora's Java Messaging Service (JMS) Module - - - - - A datastore representing a JMS Destination for APIM events which update the repository - - - A datastore representing a JMS Destination for APIM events which do not update the repository - - - - This module facilitates obtaining ConnectionPools - - - - - Description: Supports validation of digital objects, including - XML Schema validation, Schematron validation (to Fedora Rules schema - written in Schematron language), and other programatic validation - including referential integrity checking of existence and - availability of distributed data and/or services. - - (required) - This is a directory that the validation module can use as a work space, as - when it must write a temporary file. - - - The local path to the Schematron Rules used for - Fedora-specific on Atom XML files. - - - - The local path to the Schematron Rules used for - Fedora-specific on Atom Zip files. - - - The local path to the Schematron Rules used for - Fedora-specific validation on FOXML 1.1 XML files. - - - The local path to the Schematron Rules used for - Fedora-specific validation on FOXML 1.0 XML files. - - - The local path for the Fedora-METS XML - schema used to do XML schema validation of digital objects. - - - The local path for the Fedora-METS 1.0 XML - schema used to do XML schema validation of digital objects. - - - The local path for the OASIS XACML XML policy schema - used to do XML schema validation of XACML policies. - - - The local path for the Fedora FOXML 1.1 XML schema - used to do XML schema validation of digital objects - - - The local path for the Fedora FOXML 1.0 XML schema - used to do XML schema validation of digital objects - - - The local path for the Atom XML schema used to do XML - schema validation of digital objects - - - The local path to the Schematron Rules used for - Fedora-specific validation on Fedora-METS 1.0 XML files. - - - The local path for the Atom XML schema used to do XML - schema validation of digital objects - - - The local path to the Schematron Rules used for - Fedora-specific validation on Fedora-METS XML files. - - - - This module facilitates obtaining external content via HTTP - - - MySQL database on localhost with db name of fedora3. Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - Derby database on localhost running on port 1527 Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - Oracle database on localhost with SID=fedora3 Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - PostgreSQL database on localhost with db name of fedora3. Each - connection pool instance has several configuration parameter that - can be used to tune the options for the connection pool. It is - recommended that you not change the default values unless you are - trying to address a specific performance issue. For additional - information regarding connection pool options, refer to the Apache - Commons Pool API documentation at - http://jakarta.apache.org/commons/pool/apidocs/index.html. - - The maximum number of idle instances in pool. - - - When true objects are validated before borrowed from the - pool. - - - When true, objects are validated by the idle object evictor - thread. - - - The query to run when validating connections. - Connections are validated according to the testOnBorrow, - testOnReturn, and testWhileIdle configuration values. - If this is specified, it must be a SQL SELECT statement - that returns at least one row. If this is NOT specified, - validation tests will not be run. - - - - The database user name. - - - When true, objects are validated before returned to the - pool. - - - The maximum number of active instances in pool. - - - The database password. - - - The JDBC connection URL. - - - Action to take when a new object is requested and the the pool has - reached maximum number of active objects. Valid values are: - 0 (fail i.e., throw Exception) - 1 (block i.e., wait until pool resources are freed) - 2 (grow i.e., increase the size of the pool). - - - The number of objects to be examined on each run of idle - evictor thread (if applicable). A value less than zero indicates - that ceil(numIdle)/abs(numTestsPerEvictionRun) will be run. - - - The JDBC driver class name. - - - The maximum amount of time in milliseconds the - borrowObject() method should wait before throwing an Exception when - whenExhaustedAction is set to WHEN_EXHAUSTED_BLOCK. A value less - than zero indicates block indefinitely. - - - The minimum of idle instances in pool. - - - The minimum amount of time in milliseconds an object can be - idle in pool before eligible for eviction (if applicable). A value - less than zero indicates no object will be evicted due to idle time - alone. - - - The time in milliseconds to sleep between runs of the idle - object evictor thread. A value less than zero indicates no idle - evictor thread is run. - - - - local Mulgara Triplestore used by the Resource Index - - The initial size of the session pool used for queries. - Note: A value of 0 will cause the Resource Index to operate in - synchronized mode: concurrent read/write requests are put in a queue - and handled in FIFO order; this will severely impair performance and - is only intended for debugging. - - - The maximum size the buffer can reach before being forcibly - flushed. If this threshold is reached, flushing will occur in the - foreground and the buffer will be locked for writing until it is - finished. This should be larger than autoFlushBufferSize. - - - Create the model if it doesn't already exist. - At startup, the model will be automatically created. In addition, an - XML schema datatyped model named "xsd" will also be automatically - created. - - - The number of updates to send to the triplestore at a time. - This should be the same size as, or smaller than - autoFlushBufferSize. - - - Whether to propagate adds/deletes to a full-text - [Full-Text] model automatically. While a very useful feature, - enabling full-text indexing adds significantly to object ingest - times. If true, the text model will be named modelName-fullText. - Note that if this is true and autoCreate is true, the text model - will also be created if it doesn't already exist. - - - Maximum number of additional sessions the pool may add. If - specified as -1, no limit will be placed on pool growth. - - - Tells the connector to communicate with Mulgara in remote or - local mode. If true, the host parameter must be defined. If false, - the path parameter must be defined. - - - Seconds of buffer inactivity that will trigger an - auto-flush. If this threshold is reached, flushing will occur in the - background, during which time the buffer is still available for - writing. - - - The server name for rmi binding. - - - The size at which the buffer should be auto-flushed. If - this threshold is reached, flushing will occur in the background, - during which time the buffer is still available for - writing. - - - The name of the model to use. - - - Whether the triplestore should be read-only. Most Fedora - repositories will set this to false. - - - The local path to the main triplestore directory. - - - The name of the Trippi Connector class used to communicate - with the triplestore. - - - - Example local MPTStore backed by Postgres. - To use this triplestore for the Resource Index: - 1) In fedora.fcfg, change the "datastore" parameter of the - ResourceIndex module to localPostgresMPTTriplestore. - 2) Login to your Postgres server as an administrative user and - run the following commands: - CREATE ROLE "fedoraAdmin" LOGIN PASSWORD 'fedoraAdmin' - NOINHERIT CREATEDB - VALID UNTIL 'infinity'; - CREATE DATABASE "riTriples" - WITH ENCODING='SQL_ASCII' - OWNER="fedoraAdmin"; - 3) Make sure you can login to your Postgres server as fedoraAdmin. - 4) Download the appropriate Postgres JDBC 3 driver from - http://jdbc.postgresql.org/download.html - and make sure it's accessible to your servlet container. - If you're running Tomcat, putting it in common/lib/ will work. - - - - - - - - - - - - - - - - - Messaging Destination for API-M events which update the repository - - A space-separated list of message types that will be - delivered to this Destination. Currently, "apimUpdate" and - "apimAccess" are the only supported message types. - - - - Optional, defaults to topic. - - - - Messaging Destination for API-M events which did not make changes to the repository - - A space-separated list of message types that will be - delivered to this Destination. Currently, "apimUpdate" and - "apimAccess" are the only supported message types. - - - - Optional, defaults to topic. - - - diff --git a/lib/blacklight/solr/document/mods.rb b/lib/blacklight/solr/document/mods.rb index 2f0fd0ef4..4cd7a03b8 100644 --- a/lib/blacklight/solr/document/mods.rb +++ b/lib/blacklight/solr/document/mods.rb @@ -14,7 +14,7 @@ def self.register_export_formats(document) end def export_as_mods_xml - cf = ActiveFedora::Base.find(self.pid, cast: true) + cf = Base.find(self.pid, cast: true) return Nokogiri::XML(cf.mods.content).to_xml {|config| config.no_declaration}.strip end diff --git a/lib/cerberus_core/lib/cerberus_core.rb b/lib/cerberus_core/lib/cerberus_core.rb index 2b8b6500f..457040685 100644 --- a/lib/cerberus_core/lib/cerberus_core.rb +++ b/lib/cerberus_core/lib/cerberus_core.rb @@ -1,6 +1,6 @@ -require 'active-fedora' -require 'hydra/head' -require 'hydra/derivatives' +# require 'active-fedora' +# require 'hydra/head' +# require 'hydra/derivatives' module CerberusCore mattr_accessor :app_root diff --git a/lib/cerberus_core/lib/cerberus_core/base_models/collection.rb b/lib/cerberus_core/lib/cerberus_core/base_models/collection.rb index 16b97e2fc..ed923d4db 100644 --- a/lib/cerberus_core/lib/cerberus_core/base_models/collection.rb +++ b/lib/cerberus_core/lib/cerberus_core/base_models/collection.rb @@ -1,43 +1,43 @@ -module CerberusCore::BaseModels - # Implements the notion of a collection holding core records and other - # collections. Collections may belong to Communities but cannot have - # Communities as children. - class Collection < ActiveFedora::Base - include CerberusCore::Concerns::ParanoidRightsValidation - include CerberusCore::Concerns::PropertiesDatastreamDelegations - include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations - include CerberusCore::Concerns::Relatable - include CerberusCore::Concerns::Traversals - include CerberusCore::Concerns::HasCoreFiles - include CerberusCore::Concerns::HasCollections - include CerberusCore::Concerns::AutoMintedPid - - # FIXME (charles): has_metadata no longer exists -- what replaced it? - # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream - # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream - # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream - # has_metadata name: 'mods', type: CerberusCore::Datastreams::ModsDatastream - - # All querying logic assumes that collections are related to communities - # via the is_member_of relationship. Using this method to define that - # relationship enforces this constraint. See ContentObject for a - # description of arguments. - def self.parent_community_relationship(relationship_name, parent_class = nil) - self.relation_asserter(:belongs_to, - relationship_name, - :is_member_of, - parent_class) - end - - # All querying logic assumes that collections are related to their - # parent collections via the is_member_of relationship. Using this - # method to define that relationship enforces this constraint. See - # ContentObject for a description of arguments. - def self.parent_collection_relationship(relationship_name, parent_class = nil) - self.relation_asserter(:belongs_to, - relationship_name, - :is_member_of, - parent_class) - end - end -end +# module CerberusCore::BaseModels +# # Implements the notion of a collection holding core records and other +# # collections. Collections may belong to Communities but cannot have +# # Communities as children. +# class Collection < ActiveFedora::Base +# include CerberusCore::Concerns::ParanoidRightsValidation +# include CerberusCore::Concerns::PropertiesDatastreamDelegations +# include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations +# include CerberusCore::Concerns::Relatable +# include CerberusCore::Concerns::Traversals +# include CerberusCore::Concerns::HasCoreFiles +# include CerberusCore::Concerns::HasCollections +# include CerberusCore::Concerns::AutoMintedPid +# +# # FIXME (charles): has_metadata no longer exists -- what replaced it? +# # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream +# # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream +# # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream +# # has_metadata name: 'mods', type: CerberusCore::Datastreams::ModsDatastream +# +# # All querying logic assumes that collections are related to communities +# # via the is_member_of relationship. Using this method to define that +# # relationship enforces this constraint. See ContentObject for a +# # description of arguments. +# def self.parent_community_relationship(relationship_name, parent_class = nil) +# self.relation_asserter(:belongs_to, +# relationship_name, +# :is_member_of, +# parent_class) +# end +# +# # All querying logic assumes that collections are related to their +# # parent collections via the is_member_of relationship. Using this +# # method to define that relationship enforces this constraint. See +# # ContentObject for a description of arguments. +# def self.parent_collection_relationship(relationship_name, parent_class = nil) +# self.relation_asserter(:belongs_to, +# relationship_name, +# :is_member_of, +# parent_class) +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/base_models/community.rb b/lib/cerberus_core/lib/cerberus_core/base_models/community.rb index ebc15954a..0d54c2e2e 100644 --- a/lib/cerberus_core/lib/cerberus_core/base_models/community.rb +++ b/lib/cerberus_core/lib/cerberus_core/base_models/community.rb @@ -1,32 +1,32 @@ -module CerberusCore::BaseModels - # Implements the notion of a community, which is an object describing - # a project with affiliated users, collections, and records. Communities - # may belong only to other communities via the has_affiliation relationship. - class Community < ActiveFedora::Base - include CerberusCore::Concerns::PropertiesDatastreamDelegations - include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations - include CerberusCore::Concerns::Relatable - include CerberusCore::Concerns::Traversals - include CerberusCore::Concerns::HasCollections - include CerberusCore::Concerns::HasCommunities - include CerberusCore::Concerns::HasCoreFiles - include CerberusCore::Concerns::AutoMintedPid - - # FIXME: (charles) has_metadata no longer exists - # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream - # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream - # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream - # has_metadata name: 'mods', type: CerberusCore::Datastreams::ModsDatastream - - # We assume that communities are related to their parent communities via - # the has_affiliation relationship. Using this method to define that - # relationship enforces this constraint. See ContentObject for an arg - # description. - def self.parent_community_relationship(relationship_name, parent_class = nil) - self.relation_asserter(:belongs_to, - relationship_name, - :has_affiliation, - parent_class) - end - end -end +# module CerberusCore::BaseModels +# # Implements the notion of a community, which is an object describing +# # a project with affiliated users, collections, and records. Communities +# # may belong only to other communities via the has_affiliation relationship. +# class Community < ActiveFedora::Base +# include CerberusCore::Concerns::PropertiesDatastreamDelegations +# include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations +# include CerberusCore::Concerns::Relatable +# include CerberusCore::Concerns::Traversals +# include CerberusCore::Concerns::HasCollections +# include CerberusCore::Concerns::HasCommunities +# include CerberusCore::Concerns::HasCoreFiles +# include CerberusCore::Concerns::AutoMintedPid +# +# # FIXME: (charles) has_metadata no longer exists +# # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream +# # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream +# # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream +# # has_metadata name: 'mods', type: CerberusCore::Datastreams::ModsDatastream +# +# # We assume that communities are related to their parent communities via +# # the has_affiliation relationship. Using this method to define that +# # relationship enforces this constraint. See ContentObject for an arg +# # description. +# def self.parent_community_relationship(relationship_name, parent_class = nil) +# self.relation_asserter(:belongs_to, +# relationship_name, +# :has_affiliation, +# parent_class) +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/base_models/content_file.rb b/lib/cerberus_core/lib/cerberus_core/base_models/content_file.rb index e33457cb6..f94b991b8 100644 --- a/lib/cerberus_core/lib/cerberus_core/base_models/content_file.rb +++ b/lib/cerberus_core/lib/cerberus_core/base_models/content_file.rb @@ -1,41 +1,41 @@ -module CerberusCore::BaseModels - # Implements the notion of a content object, which is a fedora object - # holding a piece of content, e.g. a picture or an XML file. Content objects - # always belong to CoreRecord objects. - class ContentFile < ActiveFedora::Base - include CerberusCore::Concerns::PropertiesDatastreamDelegations - include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations - include CerberusCore::Concerns::FileContentDatastreamDelegations - include CerberusCore::Concerns::Characterizable - include CerberusCore::Concerns::Relatable - include CerberusCore::Concerns::AutoMintedPid - - # FIXME (charles): has_metadata is no longer defined -- what replaced it? - # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream - # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream - # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream - # has_metadata name: 'characterization', type: CerberusCore::Datastreams::FitsDatastream - # has_file_datastream name: 'content', type: CerberusCore::Datastreams::FileContentDatastream - - def type_label - self.class.name - end - - # We assume in the logic for a core_record object that content objects point - # at it using the is_part_of relationship. Using this method to define core record - # relationships enforces that constraint. - # ==== Attributes - # * +rel_name+ - The symbol name of the relationship. - # * +rel_class+ - The stringified model name (class) of the fedora object - # this class of content objects belongs to. Only needs to be passed in when - # the model name cannot be inferred from rel_name. E.g., if the rel_name is - # :core_file, and it points at a class called CoreFile, this can be left set - # to nil - def self.core_file_relationship(rel_name, rel_class = nil) - self.relation_asserter(:belongs_to, - rel_name, - :is_part_of, - rel_class) - end - end -end +# module CerberusCore::BaseModels +# # Implements the notion of a content object, which is a fedora object +# # holding a piece of content, e.g. a picture or an XML file. Content objects +# # always belong to CoreRecord objects. +# class ContentFile < ActiveFedora::Base +# include CerberusCore::Concerns::PropertiesDatastreamDelegations +# include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations +# include CerberusCore::Concerns::FileContentDatastreamDelegations +# include CerberusCore::Concerns::Characterizable +# include CerberusCore::Concerns::Relatable +# include CerberusCore::Concerns::AutoMintedPid +# +# # FIXME (charles): has_metadata is no longer defined -- what replaced it? +# # has_metadata name: 'DC', type: CerberusCore::Datastreams::DublinCoreDatastream +# # has_metadata name: 'rightsMetadata', type: CerberusCore::Datastreams::ParanoidRightsDatastream +# # has_metadata name: 'properties', type: CerberusCore::Datastreams::PropertiesDatastream +# # has_metadata name: 'characterization', type: CerberusCore::Datastreams::FitsDatastream +# # has_file_datastream name: 'content', type: CerberusCore::Datastreams::FileContentDatastream +# +# def type_label +# self.class.name +# end +# +# # We assume in the logic for a core_record object that content objects point +# # at it using the is_part_of relationship. Using this method to define core record +# # relationships enforces that constraint. +# # ==== Attributes +# # * +rel_name+ - The symbol name of the relationship. +# # * +rel_class+ - The stringified model name (class) of the fedora object +# # this class of content objects belongs to. Only needs to be passed in when +# # the model name cannot be inferred from rel_name. E.g., if the rel_name is +# # :core_file, and it points at a class called CoreFile, this can be left set +# # to nil +# def self.core_file_relationship(rel_name, rel_class = nil) +# self.relation_asserter(:belongs_to, +# rel_name, +# :is_part_of, +# rel_class) +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/base_models/core_file.rb b/lib/cerberus_core/lib/cerberus_core/base_models/core_file.rb index 3310f08a8..5705d321a 100644 --- a/lib/cerberus_core/lib/cerberus_core/base_models/core_file.rb +++ b/lib/cerberus_core/lib/cerberus_core/base_models/core_file.rb @@ -1,40 +1,40 @@ -module CerberusCore::BaseModels - # This module implements the notion of a core record. - # Core records are fedora objects that hold - # metadata related to any number of content objects (defined in - # CerberusCore::ContentObject) attached to them via the standard isPartOf - # relationship. Core records can belong to collections. - class CoreFile < ActiveFedora::Base - include CerberusCore::Concerns::ParanoidRightsValidation - include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations - include CerberusCore::Concerns::PropertiesDatastreamDelegations - include CerberusCore::Concerns::Relatable - include CerberusCore::Concerns::Traversals - include CerberusCore::Concerns::AutoMintedPid - - before_destroy :destroy_content_objects - - # Default datastreams - # FIXME (charles): has_metadata is no long defined -- what replaced it? - # has_metadata name: "DC", type: CerberusCore::Datastreams::DublinCoreDatastream - # has_metadata name: "mods", type: CerberusCore::Datastreams::ModsDatastream - # has_metadata name: "properties", type: CerberusCore::Datastreams::PropertiesDatastream - # has_metadata name: "rightsMetadata", type: CerberusCore::Datastreams::ParanoidRightsDatastream - - # All querying logic assumes that core records are related to their parent - # collections via the is_member_of relationship. Using this method to define - # that relationship enforces this constraint. See ContentObject for a - # description of the arguments. - def self.parent_collection_relationship(relationship_name, parent_class = nil) - self.relation_asserter(:belongs_to, - relationship_name, - :is_member_of, - parent_class) - end - - # Destroy every content object attached to this CoreRecord - def destroy_content_objects - content_objects.map { |x| x.destroy } - end - end -end +# module CerberusCore::BaseModels +# # This module implements the notion of a core record. +# # Core records are fedora objects that hold +# # metadata related to any number of content objects (defined in +# # CerberusCore::ContentObject) attached to them via the standard isPartOf +# # relationship. Core records can belong to collections. +# class CoreFile < ActiveFedora::Base +# include CerberusCore::Concerns::ParanoidRightsValidation +# include CerberusCore::Concerns::ParanoidRightsDatastreamDelegations +# include CerberusCore::Concerns::PropertiesDatastreamDelegations +# include CerberusCore::Concerns::Relatable +# include CerberusCore::Concerns::Traversals +# include CerberusCore::Concerns::AutoMintedPid +# +# before_destroy :destroy_content_objects +# +# # Default datastreams +# # FIXME (charles): has_metadata is no long defined -- what replaced it? +# # has_metadata name: "DC", type: CerberusCore::Datastreams::DublinCoreDatastream +# # has_metadata name: "mods", type: CerberusCore::Datastreams::ModsDatastream +# # has_metadata name: "properties", type: CerberusCore::Datastreams::PropertiesDatastream +# # has_metadata name: "rightsMetadata", type: CerberusCore::Datastreams::ParanoidRightsDatastream +# +# # All querying logic assumes that core records are related to their parent +# # collections via the is_member_of relationship. Using this method to define +# # that relationship enforces this constraint. See ContentObject for a +# # description of the arguments. +# def self.parent_collection_relationship(relationship_name, parent_class = nil) +# self.relation_asserter(:belongs_to, +# relationship_name, +# :is_member_of, +# parent_class) +# end +# +# # Destroy every content object attached to this CoreRecord +# def destroy_content_objects +# content_objects.map { |x| x.destroy } +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/datastreams/dublin_core_datastream.rb b/lib/cerberus_core/lib/cerberus_core/datastreams/dublin_core_datastream.rb index ea9282342..e13215b12 100644 --- a/lib/cerberus_core/lib/cerberus_core/datastreams/dublin_core_datastream.rb +++ b/lib/cerberus_core/lib/cerberus_core/datastreams/dublin_core_datastream.rb @@ -1,42 +1,42 @@ -module CerberusCore::Datastreams - # Implements the entire quite basic schema for Unqualified Dublin Core. - class DublinCoreDatastream < ActiveFedora::OmDatastream - include OM::XML::Document - - # :nodoc: - # Boy I hate typing. AH = Attributes Hash, for the record - AH = {namespace_prefix: 'dc'} - - set_terminology do |t| - t.root(path: 'dc', namespace_prefix: 'oai_dc', 'xmlns:oai_dc' => 'http://www.openarchives.org/OAI/2.0/oai_dc/', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd') - t.title(AH) - t.creator(AH) - t.subject(AH) - t.description(AH) - t.publisher(AH) - t.contributor(AH) - t.date(AH) - t.type(AH) - t.format(AH) - t.identifier(AH) - t.source(AH) - t.language(AH) - t.relation(AH) - t.coverage(AH) - t.rights(AH) - end - - def prefix - "" - end - - def self.xml_template - builder = Nokogiri::XML::Builder.new do |xml| - xml['oai_dc'].dc('xmlns:oai_dc' => 'http://www.openarchives.org/OAI/2.0/oai_dc/', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd'){ - } - end - builder.doc - end - end -end \ No newline at end of file +# module CerberusCore::Datastreams +# # Implements the entire quite basic schema for Unqualified Dublin Core. +# class DublinCoreDatastream < ActiveFedora::OmDatastream +# include OM::XML::Document +# +# # :nodoc: +# # Boy I hate typing. AH = Attributes Hash, for the record +# AH = {namespace_prefix: 'dc'} +# +# set_terminology do |t| +# t.root(path: 'dc', namespace_prefix: 'oai_dc', 'xmlns:oai_dc' => 'http://www.openarchives.org/OAI/2.0/oai_dc/', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd') +# t.title(AH) +# t.creator(AH) +# t.subject(AH) +# t.description(AH) +# t.publisher(AH) +# t.contributor(AH) +# t.date(AH) +# t.type(AH) +# t.format(AH) +# t.identifier(AH) +# t.source(AH) +# t.language(AH) +# t.relation(AH) +# t.coverage(AH) +# t.rights(AH) +# end +# +# def prefix +# "" +# end +# +# def self.xml_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml['oai_dc'].dc('xmlns:oai_dc' => 'http://www.openarchives.org/OAI/2.0/oai_dc/', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', +# 'xsi:schemaLocation' => 'http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd'){ +# } +# end +# builder.doc +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/datastreams/file_content_datastream.rb b/lib/cerberus_core/lib/cerberus_core/datastreams/file_content_datastream.rb index b954b6ec1..0a9c5bb7b 100644 --- a/lib/cerberus_core/lib/cerberus_core/datastreams/file_content_datastream.rb +++ b/lib/cerberus_core/lib/cerberus_core/datastreams/file_content_datastream.rb @@ -1,29 +1,29 @@ -module CerberusCore::Datastreams - # A datastream for holding an actual content blob. Notable for providing - # the ExtractMetadata module, which is used for FITS characterization. - class FileContentDatastream < ActiveFedora::NomDatastream - def prefix - "" - end - - # ExtractMetadata was removed from Hydra::Derivatives in 2015, - # so we've copied its methods below for now - def extract_metadata - return unless has_content? - Hydra::FileCharacterization.characterize(content, filename_for_characterization.join(""), :fits) do |config| - config[:fits] = Hydra::Derivatives.fits_path - end - end - - protected - - def filename_for_characterization - registered_mime_type = MIME::Types[mime_type].first - Logger.warn "Unable to find a registered mime type for #{mime_type.inspect} on #{uri}" unless registered_mime_type - extension = registered_mime_type ? ".#{registered_mime_type.extensions.first}" : '' - version_id = 1 # TODO fixme - m = /\/([^\/]*)$/.match(uri) - ["#{m[1]}-#{version_id}", "#{extension}"] - end - end -end +# module CerberusCore::Datastreams +# # A datastream for holding an actual content blob. Notable for providing +# # the ExtractMetadata module, which is used for FITS characterization. +# class FileContentDatastream < ActiveFedora::NomDatastream +# def prefix +# "" +# end +# +# # ExtractMetadata was removed from Hydra::Derivatives in 2015, +# # so we've copied its methods below for now +# def extract_metadata +# return unless has_content? +# Hydra::FileCharacterization.characterize(content, filename_for_characterization.join(""), :fits) do |config| +# config[:fits] = Hydra::Derivatives.fits_path +# end +# end +# +# protected +# +# def filename_for_characterization +# registered_mime_type = MIME::Types[mime_type].first +# Logger.warn "Unable to find a registered mime type for #{mime_type.inspect} on #{uri}" unless registered_mime_type +# extension = registered_mime_type ? ".#{registered_mime_type.extensions.first}" : '' +# version_id = 1 # TODO fixme +# m = /\/([^\/]*)$/.match(uri) +# ["#{m[1]}-#{version_id}", "#{extension}"] +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/datastreams/fits_datastream.rb b/lib/cerberus_core/lib/cerberus_core/datastreams/fits_datastream.rb index c99fb4e17..eaaeea420 100644 --- a/lib/cerberus_core/lib/cerberus_core/datastreams/fits_datastream.rb +++ b/lib/cerberus_core/lib/cerberus_core/datastreams/fits_datastream.rb @@ -1,182 +1,182 @@ -module CerberusCore::Datastreams - # Datastream for holding the results of FITS characterization, which can be run - # against FileContentDatastream datastreams via the Characterizable concern. - class FitsDatastream < ActiveFedora::OmDatastream - include OM::XML::Document - - set_terminology do |t| - t.root(:path => "fits", - :xmlns => "http://hul.harvard.edu/ois/xml/ns/fits/fits_output", - :schema => "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd") - t.identification { - t.identity { - t.format_label(:path=>{:attribute=>"format"}) - t.mime_type(:path=>{:attribute=>"mimetype"}, index_as: [:stored_searchable]) - } - } - t.fileinfo { - t.file_size(:path=>"size") - t.last_modified(:path=>"lastmodified") - t.filename(:path=>"filename") - t.original_checksum(:path=>"md5checksum") - t.rights_basis(:path=>"rightsBasis") - t.copyright_basis(:path=>"copyrightBasis") - t.copyright_note(:path=>"copyrightNote") - } - t.filestatus { - t.well_formed(:path=>"well-formed") - t.valid(:path=>"valid") - t.status_message(:path=>"message") - } - t.metadata { - t.document { - t.file_title(:path=>"title") - t.file_author(:path=>"author") - t.file_language(:path=>"language") - t.page_count(:path=>"pageCount") - t.word_count(:path=>"wordCount") - t.character_count(:path=>"characterCount") - t.paragraph_count(:path=>"paragraphCount") - t.line_count(:path=>"lineCount") - t.table_count(:path=>"tableCount") - t.graphics_count(:path=>"graphicsCount") - } - t.image { - t.byte_order(:path=>"byteOrder") - t.compression(:path=>"compressionScheme") - t.width(:path=>"imageWidth") - t.height(:path=>"imageHeight") - t.color_space(:path=>"colorSpace") - t.profile_name(:path=>"iccProfileName") - t.profile_version(:path=>"iccProfileVersion") - t.orientation(:path=>"orientation") - t.color_map(:path=>"colorMap") - t.image_producer(:path=>"imageProducer") - t.capture_device(:path=>"captureDevice") - t.scanning_software(:path=>"scanningSoftwareName") - t.exif_version(:path=>"exifVersion") - t.gps_timestamp(:path=>"gpsTimeStamp") - t.latitude(:path=>"gpsDestLatitude") - t.longitude(:path=>"gpsDestLongitude") - } - t.text { - t.character_set(:path=>"charset") - t.markup_basis(:path=>"markupBasis") - t.markup_language(:path=>"markupLanguage") - } - t.audio { - t.duration(:path=>"duration") - t.bit_depth(:path=>"bitDepth") - t.sample_rate(:path=>"sampleRate") - t.channels(:path=>"channels") - t.data_format(:path=>"dataFormatType") - t.offset(:path=>"offset") - } - t.video { - # Not yet implemented in FITS - } - } - t.format_label(:proxy=>[:identification, :identity, :format_label]) - t.mime_type(:proxy=>[:identification, :identity, :mime_type]) - t.file_size(:proxy=>[:fileinfo, :file_size]) - t.last_modified(:proxy=>[:fileinfo, :last_modified]) - t.filename(:proxy=>[:fileinfo, :filename]) - t.original_checksum(:proxy=>[:fileinfo, :original_checksum]) - t.rights_basis(:proxy=>[:fileinfo, :rights_basis]) - t.copyright_basis(:proxy=>[:fileinfo, :copyright_basis]) - t.copyright_note(:proxy=>[:fileinfo, :copyright_note]) - t.well_formed(:proxy=>[:filestatus, :well_formed]) - t.valid(:proxy=>[:filestatus, :valid]) - t.status_message(:proxy=>[:filestatus, :status_message]) - t.file_title(:proxy=>[:metadata, :document, :file_title]) - t.file_author(:proxy=>[:metadata, :document, :file_author]) - t.page_count(:proxy=>[:metadata, :document, :page_count]) - t.file_language(:proxy=>[:metadata, :document, :file_language]) - t.word_count(:proxy=>[:metadata, :document, :word_count]) - t.character_count(:proxy=>[:metadata, :document, :character_count]) - t.paragraph_count(:proxy=>[:metadata, :document, :paragraph_count]) - t.line_count(:proxy=>[:metadata, :document, :line_count]) - t.table_count(:proxy=>[:metadata, :document, :table_count]) - t.graphics_count(:proxy=>[:metadata, :document, :graphics_count]) - t.byte_order(:proxy=>[:metadata, :image, :byte_order]) - t.compression(:proxy=>[:metadata, :image, :compression]) - t.width(:proxy=>[:metadata, :image, :width]) - t.height(:proxy=>[:metadata, :image, :height]) - t.color_space(:proxy=>[:metadata, :image, :color_space]) - t.profile_name(:proxy=>[:metadata, :image, :profile_name]) - t.profile_version(:proxy=>[:metadata, :image, :profile_version]) - t.orientation(:proxy=>[:metadata, :image, :orientation]) - t.color_map(:proxy=>[:metadata, :image, :color_map]) - t.image_producer(:proxy=>[:metadata, :image, :image_producer]) - t.capture_device(:proxy=>[:metadata, :image, :capture_device]) - t.scanning_software(:proxy=>[:metadata, :image, :scanning_software]) - t.exif_version(:proxy=>[:metadata, :image, :exif_version]) - t.gps_timestamp(:proxy=>[:metadata, :image, :gps_timestamp]) - t.latitude(:proxy=>[:metadata, :image, :latitude]) - t.longitude(:proxy=>[:metadata, :image, :longitude]) - t.character_set(:proxy=>[:metadata, :text, :character_set]) - t.markup_basis(:proxy=>[:metadata, :text, :markup_basis]) - t.markup_language(:proxy=>[:metadata, :text, :markup_language]) - t.duration(:proxy=>[:metadata, :audio, :duration]) - t.bit_depth(:proxy=>[:metadata, :audio, :bit_depth]) - t.sample_rate(:proxy=>[:metadata, :audio, :sample_rate]) - t.channels(:proxy=>[:metadata, :audio, :channels]) - t.data_format(:proxy=>[:metadata, :audio, :data_format]) - t.offset(:proxy=>[:metadata, :audio, :offset]) - end - - def self.xml_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.fits(:xmlns => 'http://hul.harvard.edu/ois/xml/ns/fits/fits_output', - 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => - "http://hul.harvard.edu/ois/xml/ns/fits/fits_output - http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd", - :version => "0.6.0", - :timestamp => "1/25/12 11:04 AM") { - xml.identification { - xml.identity(:format => '', :mimetype => '', - :toolname => 'FITS', :toolversion => '') { - xml.tool(:toolname => '', :toolversion => '') - xml.version(:toolname => '', :toolversion => '') - xml.externalIdentifier(:toolname => '', :toolversion => '') - } - } - xml.fileinfo { - xml.size(:toolname => '', :toolversion => '') - xml.creatingApplicatioName(:toolname => '', :toolversion => '', - :status => '') - xml.lastmodified(:toolname => '', :toolversion => '', :status => '') - xml.filepath(:toolname => '', :toolversion => '', :status => '') - xml.filename(:toolname => '', :toolversion => '', :status => '') - xml.md5checksum(:toolname => '', :toolversion => '', :status => '') - xml.fslastmodified(:toolname => '', :toolversion => '', :status => '') - } - xml.filestatus { - xml.tag! "well-formed", :toolname => '', :toolversion => '', :status => '' - xml.valid(:toolname => '', :toolversion => '', :status => '') - } - xml.metadata { - xml.document { - xml.title(:toolname => '', :toolversion => '', :status => '') - xml.author(:toolname => '', :toolversion => '', :status => '') - xml.pageCount(:toolname => '', :toolversion => '') - xml.isTagged(:toolname => '', :toolversion => '') - xml.hasOutline(:toolname => '', :toolversion => '') - xml.hasAnnotations(:toolname => '', :toolversion => '') - xml.isRightsManaged(:toolname => '', :toolversion => '', - :status => '') - xml.isProtected(:toolname => '', :toolversion => '') - xml.hasForms(:toolname => '', :toolversion => '', :status => '') - } - } - } - end - builder.doc - end - - def prefix - "" - end - end -end \ No newline at end of file +# module CerberusCore::Datastreams +# # Datastream for holding the results of FITS characterization, which can be run +# # against FileContentDatastream datastreams via the Characterizable concern. +# class FitsDatastream < ActiveFedora::OmDatastream +# include OM::XML::Document +# +# set_terminology do |t| +# t.root(:path => "fits", +# :xmlns => "http://hul.harvard.edu/ois/xml/ns/fits/fits_output", +# :schema => "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd") +# t.identification { +# t.identity { +# t.format_label(:path=>{:attribute=>"format"}) +# t.mime_type(:path=>{:attribute=>"mimetype"}, index_as: [:stored_searchable]) +# } +# } +# t.fileinfo { +# t.file_size(:path=>"size") +# t.last_modified(:path=>"lastmodified") +# t.filename(:path=>"filename") +# t.original_checksum(:path=>"md5checksum") +# t.rights_basis(:path=>"rightsBasis") +# t.copyright_basis(:path=>"copyrightBasis") +# t.copyright_note(:path=>"copyrightNote") +# } +# t.filestatus { +# t.well_formed(:path=>"well-formed") +# t.valid(:path=>"valid") +# t.status_message(:path=>"message") +# } +# t.metadata { +# t.document { +# t.file_title(:path=>"title") +# t.file_author(:path=>"author") +# t.file_language(:path=>"language") +# t.page_count(:path=>"pageCount") +# t.word_count(:path=>"wordCount") +# t.character_count(:path=>"characterCount") +# t.paragraph_count(:path=>"paragraphCount") +# t.line_count(:path=>"lineCount") +# t.table_count(:path=>"tableCount") +# t.graphics_count(:path=>"graphicsCount") +# } +# t.image { +# t.byte_order(:path=>"byteOrder") +# t.compression(:path=>"compressionScheme") +# t.width(:path=>"imageWidth") +# t.height(:path=>"imageHeight") +# t.color_space(:path=>"colorSpace") +# t.profile_name(:path=>"iccProfileName") +# t.profile_version(:path=>"iccProfileVersion") +# t.orientation(:path=>"orientation") +# t.color_map(:path=>"colorMap") +# t.image_producer(:path=>"imageProducer") +# t.capture_device(:path=>"captureDevice") +# t.scanning_software(:path=>"scanningSoftwareName") +# t.exif_version(:path=>"exifVersion") +# t.gps_timestamp(:path=>"gpsTimeStamp") +# t.latitude(:path=>"gpsDestLatitude") +# t.longitude(:path=>"gpsDestLongitude") +# } +# t.text { +# t.character_set(:path=>"charset") +# t.markup_basis(:path=>"markupBasis") +# t.markup_language(:path=>"markupLanguage") +# } +# t.audio { +# t.duration(:path=>"duration") +# t.bit_depth(:path=>"bitDepth") +# t.sample_rate(:path=>"sampleRate") +# t.channels(:path=>"channels") +# t.data_format(:path=>"dataFormatType") +# t.offset(:path=>"offset") +# } +# t.video { +# # Not yet implemented in FITS +# } +# } +# t.format_label(:proxy=>[:identification, :identity, :format_label]) +# t.mime_type(:proxy=>[:identification, :identity, :mime_type]) +# t.file_size(:proxy=>[:fileinfo, :file_size]) +# t.last_modified(:proxy=>[:fileinfo, :last_modified]) +# t.filename(:proxy=>[:fileinfo, :filename]) +# t.original_checksum(:proxy=>[:fileinfo, :original_checksum]) +# t.rights_basis(:proxy=>[:fileinfo, :rights_basis]) +# t.copyright_basis(:proxy=>[:fileinfo, :copyright_basis]) +# t.copyright_note(:proxy=>[:fileinfo, :copyright_note]) +# t.well_formed(:proxy=>[:filestatus, :well_formed]) +# t.valid(:proxy=>[:filestatus, :valid]) +# t.status_message(:proxy=>[:filestatus, :status_message]) +# t.file_title(:proxy=>[:metadata, :document, :file_title]) +# t.file_author(:proxy=>[:metadata, :document, :file_author]) +# t.page_count(:proxy=>[:metadata, :document, :page_count]) +# t.file_language(:proxy=>[:metadata, :document, :file_language]) +# t.word_count(:proxy=>[:metadata, :document, :word_count]) +# t.character_count(:proxy=>[:metadata, :document, :character_count]) +# t.paragraph_count(:proxy=>[:metadata, :document, :paragraph_count]) +# t.line_count(:proxy=>[:metadata, :document, :line_count]) +# t.table_count(:proxy=>[:metadata, :document, :table_count]) +# t.graphics_count(:proxy=>[:metadata, :document, :graphics_count]) +# t.byte_order(:proxy=>[:metadata, :image, :byte_order]) +# t.compression(:proxy=>[:metadata, :image, :compression]) +# t.width(:proxy=>[:metadata, :image, :width]) +# t.height(:proxy=>[:metadata, :image, :height]) +# t.color_space(:proxy=>[:metadata, :image, :color_space]) +# t.profile_name(:proxy=>[:metadata, :image, :profile_name]) +# t.profile_version(:proxy=>[:metadata, :image, :profile_version]) +# t.orientation(:proxy=>[:metadata, :image, :orientation]) +# t.color_map(:proxy=>[:metadata, :image, :color_map]) +# t.image_producer(:proxy=>[:metadata, :image, :image_producer]) +# t.capture_device(:proxy=>[:metadata, :image, :capture_device]) +# t.scanning_software(:proxy=>[:metadata, :image, :scanning_software]) +# t.exif_version(:proxy=>[:metadata, :image, :exif_version]) +# t.gps_timestamp(:proxy=>[:metadata, :image, :gps_timestamp]) +# t.latitude(:proxy=>[:metadata, :image, :latitude]) +# t.longitude(:proxy=>[:metadata, :image, :longitude]) +# t.character_set(:proxy=>[:metadata, :text, :character_set]) +# t.markup_basis(:proxy=>[:metadata, :text, :markup_basis]) +# t.markup_language(:proxy=>[:metadata, :text, :markup_language]) +# t.duration(:proxy=>[:metadata, :audio, :duration]) +# t.bit_depth(:proxy=>[:metadata, :audio, :bit_depth]) +# t.sample_rate(:proxy=>[:metadata, :audio, :sample_rate]) +# t.channels(:proxy=>[:metadata, :audio, :channels]) +# t.data_format(:proxy=>[:metadata, :audio, :data_format]) +# t.offset(:proxy=>[:metadata, :audio, :offset]) +# end +# +# def self.xml_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.fits(:xmlns => 'http://hul.harvard.edu/ois/xml/ns/fits/fits_output', +# 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', +# 'xsi:schemaLocation' => +# "http://hul.harvard.edu/ois/xml/ns/fits/fits_output +# http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd", +# :version => "0.6.0", +# :timestamp => "1/25/12 11:04 AM") { +# xml.identification { +# xml.identity(:format => '', :mimetype => '', +# :toolname => 'FITS', :toolversion => '') { +# xml.tool(:toolname => '', :toolversion => '') +# xml.version(:toolname => '', :toolversion => '') +# xml.externalIdentifier(:toolname => '', :toolversion => '') +# } +# } +# xml.fileinfo { +# xml.size(:toolname => '', :toolversion => '') +# xml.creatingApplicatioName(:toolname => '', :toolversion => '', +# :status => '') +# xml.lastmodified(:toolname => '', :toolversion => '', :status => '') +# xml.filepath(:toolname => '', :toolversion => '', :status => '') +# xml.filename(:toolname => '', :toolversion => '', :status => '') +# xml.md5checksum(:toolname => '', :toolversion => '', :status => '') +# xml.fslastmodified(:toolname => '', :toolversion => '', :status => '') +# } +# xml.filestatus { +# xml.tag! "well-formed", :toolname => '', :toolversion => '', :status => '' +# xml.valid(:toolname => '', :toolversion => '', :status => '') +# } +# xml.metadata { +# xml.document { +# xml.title(:toolname => '', :toolversion => '', :status => '') +# xml.author(:toolname => '', :toolversion => '', :status => '') +# xml.pageCount(:toolname => '', :toolversion => '') +# xml.isTagged(:toolname => '', :toolversion => '') +# xml.hasOutline(:toolname => '', :toolversion => '') +# xml.hasAnnotations(:toolname => '', :toolversion => '') +# xml.isRightsManaged(:toolname => '', :toolversion => '', +# :status => '') +# xml.isProtected(:toolname => '', :toolversion => '') +# xml.hasForms(:toolname => '', :toolversion => '', :status => '') +# } +# } +# } +# end +# builder.doc +# end +# +# def prefix +# "" +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/datastreams/mods_datastream.rb b/lib/cerberus_core/lib/cerberus_core/datastreams/mods_datastream.rb index 5956e4198..d003593b8 100644 --- a/lib/cerberus_core/lib/cerberus_core/datastreams/mods_datastream.rb +++ b/lib/cerberus_core/lib/cerberus_core/datastreams/mods_datastream.rb @@ -1,371 +1,371 @@ -module CerberusCore::Datastreams - class ModsDatastream < ActiveFedora::OmDatastream - include OM::XML::Document - - stored_sortable = Solrizer::Descriptor.new(:string, :stored, :indexed) - stored_sortable_date = Solrizer::Descriptor.new(:date, :stored, :indexed) - - set_terminology do |t| - t.root(path: 'mods', 'xmlns:mods' => 'http://www.loc.gov/mods/v3', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd') - t.title_info(path: 'titleInfo', namespace_prefix: 'mods'){ - t.title(path: 'title', namespace_prefix: 'mods', index_as: [:stored_searchable, stored_sortable]) - t.non_sort(path: 'nonSort', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.sub_title(path: 'subTitle', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.part_name(path: 'partName', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.part_number(path: 'partNumber', namespace_prefix: 'mods', index_as: [:stored_searchable]) - } - - t.abstract(path: 'abstract', namespace_prefix: 'mods', index_as: [:stored_searchable]) - - t.name(path: 'name', namespace_prefix: 'mods', attributes: { type: :none }){ - t.name_part(path: 'namePart', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) - } - - t.personal_name(path: 'name', namespace_prefix: 'mods', attributes: { type: 'personal' }){ - t.authority(path: { attribute: 'authority' }) - t.name_part(path: 'namePart', namespace_prefix: 'mods', attributes: { type: :none }, index_as: [:stored_searchable, :facetable]) - t.name_part_given(path: 'namePart', namespace_prefix: 'mods', attributes: { type: 'given' }) - t.name_part_family(path: 'namePart', namespace_prefix: 'mods', attributes: { type: 'family' }) - t.role(namespace_prefix: 'mods', index_as: [:stored_searchable]){ - t.role_term(path: 'roleTerm', namespace_prefix: 'mods'){ - t.authority(path: { attribute: 'authority'}) - t.type(path: { attribute: 'type'}) - } - } - } - - t.corporate_name(path: 'name', namespace_prefix: 'mods', attributes: { type: 'corporate' }){ - t.name_part(path: 'namePart', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) - } - - t.type_of_resource(path: 'typeOfResource', namespace_prefix: 'mods') - - t.genre(path: 'genre', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]){ - t.authority(path: { attribute: 'authority' }) - } - - t.origin_info(path: 'originInfo', namespace_prefix: 'mods'){ - t.publisher(path: 'publisher', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.place(path: 'place', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.copyright(path: 'copyrightDate', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable], attributes: { encoding: 'w3cdtf', keyDate: 'yes' }) - t.date_issued(path: 'dateIssued', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable], attributes: { encoding: 'w3cdtf' }) - t.date_other(path: 'dateOther', namespace_prefix: 'mods', index_as: [:stored_searchable], attributes: { encoding: 'w3cdtf'}) - t.issuance(path: 'issuance', namespace_prefix: 'mods') - } - - t.language(path: 'language', namespace_prefix: 'mods'){ - t.language_term(path: 'languageTerm', namespace_prefix: 'mods'){ - t.language_term_type(path: { attribute: 'type'}) - t.language_authority(path: { attribute: 'authority'}) - } - } - - t.physical_description(path: 'physicalDescription', namespace_prefix: 'mods'){ - t.form(path: 'form', namespace_prefix: 'mods'){ - t.authority(path: {attribute: 'authority'}) - } - t.digital_origin(path: 'digitalOrigin') - } - - t.note(path: 'note', namespace_prefix: 'mods', index_as: [:stored_searchable]){ - t.type(path: { attribute: 'type' }) - } - - t.subject(path: 'subject', namespace_prefix: 'mods'){ - t.topic(path: 'topic', namespace_prefix: 'mods', index_as: [:stored_searchable]){ - t.authority(path: { attribute: 'authority' }) - } - t.scoped_topic(path: 'topic', namespace_prefix: 'mods', attributes: { authority: :any }) - } - t.identifier(path: 'identifier', namespace_prefix: 'mods', index_as: [:stored_searchable]){ - t.type(path: { attribute: 'type'}) - } - - t.related_item(path: 'relatedItem', namespace_prefix: 'mods'){ - t.title_info(path: 'titleInfo', namespace_prefix: 'mods'){ - t.title(path: 'title', namespace_prefix: 'mods') - } - t.part(path: 'part', namespace_prefix: 'mods'){ - t.detail(path: 'detail', namespace_prefix: 'mods'){ - t.type(path: {attribute: 'type'}) - t.number(path: 'number', namespace_prefix: 'mods') - t.caption(path: 'caption', namespace_prefix: 'mods') - } - t.extent(path: 'extent', namespace_prefix: 'mods'){ - t.unit(path: { attribute: 'unit' }) - t.start(path: 'start', namespace_prefix: 'mods') - t.end(path: 'end', namespace_prefix: 'mods') - } - t.date(path: 'date', namespace_prefix: 'mods'){ - t.encording(path: { attribute: 'encoding' }) - } - } - t.resource_type(path: 'typeOfResource', namespace_prefix: 'mods') - t.genre(path: 'genre', namespace_prefix: 'mods'){ - t.authority(path: { attribute: 'authority' }) - } - t.origin_info(path: 'originInfo', namespace_prefix: 'mods'){ - t.place(path: 'place', namespace_prefix: 'mods'){ - t.term(path: 'placeTerm', namespace_prefix: 'mods'){ - t.type(path: { attribute: 'type' }) - } - } - t.publisher(path: 'publisher', namespace_prefix: 'mods', index_as: [:stored_searchable]) - t.issuance(path: 'issuance', namespace_prefix: 'mods') - t.frequency(path: 'frequency', namespace_prefix: 'mods'){ - t.authority(path: { attribute: 'authority'}) - } - } - t.physical_description(path: 'physicalDescription', namespace_prefix: 'mods'){ - t.form(path: 'form', namespace_prefix: 'mods'){ - t.authority(path: { attribute: 'authority'}) - } - t.digital_origin(path: 'digitalOrigin', namespace_prefix: 'mods') - } - t.identifier(path: 'identifier', namespace_prefix: 'mods'){ - t.type(path: { attribute: 'type' }) - } - } - - t.title(proxy: [:title_info, :title]) - t.date_issued(proxy: [:origin_info, :date_issued]) - end - - def prefix - "" - end - - # We override to_solr here to add - # 1. A creation_year field. - # 2. A valid date Begin field - # 3. A valid date End field - # 4. Special facetable keywords, e.g. any subject/topic field with an authority attribute - def to_solr(solr_doc = Hash.new()) - super(solr_doc) # Run the default solrization behavior - - # Extract a creation year field - if self.origin_info.copyright.any? && !self.origin_info.copyright.first.blank? - creation_date = self.origin_info.copyright.first - solr_doc["creation_year_sim"] = [creation_date[/\d{4}/]] - # solr_doc["date_issued_ssim"] = [creation_date] - elsif self.origin_info.date_issued.any? && !self.origin_info.date_issued.first.blank? - creation_date = self.origin_info.date_issued.first - solr_doc["creation_year_sim"] = [creation_date[/\d{4}/]] - end - - - # Ensure title is set to a title actually associated with this core file. - solr_doc["title_info_title_ssi"] = self.title_info.title.first - - # Extract special subject/topic fields - authorized_keywords = [] - - (0..self.subject.length).each do |i| - if self.subject(i).topic.authority.any? - authorized_keywords << self.subject(i).topic.first - end - end - - solr_doc["subject_sim"] = authorized_keywords - - #Extract and solrize names divided into first/last parts - full_names = [] - - (0..self.personal_name.length).each do |i| - fn = self.personal_name(i).name_part_given - ln = self.personal_name(i).name_part_family - - if fn.any? && ln.any? - full_names << "#{fn.first} #{ln.first}" - end - end - - solr_doc["personal_creators_tesim"] = full_names - solr_doc["personal_creators_sim"] = full_names - - # Create an aggregate facet field of all creator information - personal_names = solr_doc["personal_creators_sim"] || [] - corporate_names = solr_doc["corporate_name_name_part_sim"] || [] - names = solr_doc["name_name_part_sim"] || [] - all_names = personal_names + corporate_names + names - solr_doc["creator_sim"] = all_names - solr_doc["creator_tesim"] = all_names - - #TODO: Extract dateBegin/dateEnd information ] - return solr_doc - end - - - def self.xml_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.mods('xmlns:mods' => 'http://www.loc.gov/mods/v3', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:schemaLocation' => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd'){ - xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix=="mods" } - xml.titleInfo { - xml.title - } - xml.abstract - xml.name('type' => 'personal') - xml.name('type' => 'corporate') - xml.originInfo { - xml.dateIssued('keyDate' => 'yes', 'encoding' => 'w3cdtf') - } - xml.language{ - xml.languageTerm - } - xml.note('type' => 'citation') - xml.subject - xml.identifier - xml.typeOfResource - } - end - builder.doc - end - - # Filters out blank entries, builds nodes as required - def names=(x) - x = x.select { |name| !name.blank? } - - if x.length < self.name.length - node_count = self.name.length - x.length - trim_nodes_from_zero(:name, node_count) - end - - x.each_with_index do |name, i| - if self.name[i].nil? - self.insert_new_node(:name) - end - - self.name(i).name_part = name - end - end - - # Filters out blank keyword entries - def topics=(array_of_strings) - array_of_keywords = array_of_strings.select {|kw| !kw.blank? } - - if array_of_keywords.length < self.subject.length - node_count = self.subject.length - array_of_keywords.length - trim_nodes_from_zero(:subject, node_count) - end - - array_of_keywords.each_with_index do |kw, index| - if self.subject[index].nil? - self.insert_new_node(:subject) - end - - self.subject(index).topic = kw - end - end - - # The following four methods are probably deprecated, given that we won't be - # collecting corporate/personal names separately from end users, and therefore shouldn't - # have to assign to it/read from it for the purposes of the frontend. - - # Takes two arrays of equal length and turns them into correctly formatted - # mods_personal_name nodes. - def assign_creator_personal_names(first_names, last_names) - if first_names.length != last_names.length - raise "#{first_names.length} first names received and #{last_names.length} last names received, which won't do at all." - end - - name_pairs = Hash[first_names.zip(last_names)] - - name_pairs.select! { |first, last| !first.blank? && !last.blank? } - - if name_pairs.length < self.personal_name.length - node_count = self.personal_name.length - name_pairs.length - trim_nodes_from_zero(:personal_name, node_count) - end - - name_pairs.each_with_index do |(first_name, last_name), index| - if self.personal_name[index].nil? - self.insert_new_node(:personal_name) - end - - self.personal_name(index).name_part_given = first_name - self.personal_name(index).name_part_family = last_name - end - end - - # Takes an array and turns it into correctly formatted mods_corporate_name nodes. - def assign_corporate_names(cns) - - cns.select! { |name| !name.blank? } - - if cns.length < self.corporate_name.length - node_count = self.corporate_name.length - cns.length - trim_nodes_from_zero(:corporate_name, node_count) - end - - cns.each_with_index do |c_name, index| - if self.corporate_name[index].nil? - self.insert_new_node(:corporate_name) - end - - self.corporate_name(index).name_part = c_name - end - end - - # Eliminates some whitespace that seems to get inserted into these records when they're - # returned. - def corporate_creators - no_newlines = self.corporate_name.map { |name| name.delete("\n") } - trimmed = no_newlines.map { |name| name.strip } - return trimmed - end - - # Formats the otherwise messy return for personal creator information - def personal_creators - result_array = [] - - first_names = self.personal_name.name_part_given - last_names = self.personal_name.name_part_family - - names = first_names.zip(last_names) - - # NB: When accessing nested arrays of form [[first, second], [first, second]] - # that are all of even length, array.each do |first, second| grabs both elements - # out of each nested array in sequence. Did not know this until I looked it up. - names.each do |first, last| - result_array << Hash[first: first, last: last] - end - - return result_array - end - - - - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # Template files used by NodeHelper to add/remove nodes - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - def self.name_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.name - end - return builder.doc.root - end - - def self.subject_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.subject - end - return builder.doc.root - end - - def self.personal_name_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.name('type' => 'personal') - end - return builder.doc.root - end - - def self.corporate_name_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.name('type' => 'corporate') - end - return builder.doc.root - end - end -end \ No newline at end of file +# module CerberusCore::Datastreams +# class ModsDatastream < ActiveFedora::OmDatastream +# include OM::XML::Document +# +# stored_sortable = Solrizer::Descriptor.new(:string, :stored, :indexed) +# stored_sortable_date = Solrizer::Descriptor.new(:date, :stored, :indexed) +# +# set_terminology do |t| +# t.root(path: 'mods', 'xmlns:mods' => 'http://www.loc.gov/mods/v3', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation' => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd') +# t.title_info(path: 'titleInfo', namespace_prefix: 'mods'){ +# t.title(path: 'title', namespace_prefix: 'mods', index_as: [:stored_searchable, stored_sortable]) +# t.non_sort(path: 'nonSort', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.sub_title(path: 'subTitle', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.part_name(path: 'partName', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.part_number(path: 'partNumber', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# } +# +# t.abstract(path: 'abstract', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# +# t.name(path: 'name', namespace_prefix: 'mods', attributes: { type: :none }){ +# t.name_part(path: 'namePart', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) +# } +# +# t.personal_name(path: 'name', namespace_prefix: 'mods', attributes: { type: 'personal' }){ +# t.authority(path: { attribute: 'authority' }) +# t.name_part(path: 'namePart', namespace_prefix: 'mods', attributes: { type: :none }, index_as: [:stored_searchable, :facetable]) +# t.name_part_given(path: 'namePart', namespace_prefix: 'mods', attributes: { type: 'given' }) +# t.name_part_family(path: 'namePart', namespace_prefix: 'mods', attributes: { type: 'family' }) +# t.role(namespace_prefix: 'mods', index_as: [:stored_searchable]){ +# t.role_term(path: 'roleTerm', namespace_prefix: 'mods'){ +# t.authority(path: { attribute: 'authority'}) +# t.type(path: { attribute: 'type'}) +# } +# } +# } +# +# t.corporate_name(path: 'name', namespace_prefix: 'mods', attributes: { type: 'corporate' }){ +# t.name_part(path: 'namePart', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]) +# } +# +# t.type_of_resource(path: 'typeOfResource', namespace_prefix: 'mods') +# +# t.genre(path: 'genre', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable]){ +# t.authority(path: { attribute: 'authority' }) +# } +# +# t.origin_info(path: 'originInfo', namespace_prefix: 'mods'){ +# t.publisher(path: 'publisher', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.place(path: 'place', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.copyright(path: 'copyrightDate', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable], attributes: { encoding: 'w3cdtf', keyDate: 'yes' }) +# t.date_issued(path: 'dateIssued', namespace_prefix: 'mods', index_as: [:stored_searchable, :facetable], attributes: { encoding: 'w3cdtf' }) +# t.date_other(path: 'dateOther', namespace_prefix: 'mods', index_as: [:stored_searchable], attributes: { encoding: 'w3cdtf'}) +# t.issuance(path: 'issuance', namespace_prefix: 'mods') +# } +# +# t.language(path: 'language', namespace_prefix: 'mods'){ +# t.language_term(path: 'languageTerm', namespace_prefix: 'mods'){ +# t.language_term_type(path: { attribute: 'type'}) +# t.language_authority(path: { attribute: 'authority'}) +# } +# } +# +# t.physical_description(path: 'physicalDescription', namespace_prefix: 'mods'){ +# t.form(path: 'form', namespace_prefix: 'mods'){ +# t.authority(path: {attribute: 'authority'}) +# } +# t.digital_origin(path: 'digitalOrigin') +# } +# +# t.note(path: 'note', namespace_prefix: 'mods', index_as: [:stored_searchable]){ +# t.type(path: { attribute: 'type' }) +# } +# +# t.subject(path: 'subject', namespace_prefix: 'mods'){ +# t.topic(path: 'topic', namespace_prefix: 'mods', index_as: [:stored_searchable]){ +# t.authority(path: { attribute: 'authority' }) +# } +# t.scoped_topic(path: 'topic', namespace_prefix: 'mods', attributes: { authority: :any }) +# } +# t.identifier(path: 'identifier', namespace_prefix: 'mods', index_as: [:stored_searchable]){ +# t.type(path: { attribute: 'type'}) +# } +# +# t.related_item(path: 'relatedItem', namespace_prefix: 'mods'){ +# t.title_info(path: 'titleInfo', namespace_prefix: 'mods'){ +# t.title(path: 'title', namespace_prefix: 'mods') +# } +# t.part(path: 'part', namespace_prefix: 'mods'){ +# t.detail(path: 'detail', namespace_prefix: 'mods'){ +# t.type(path: {attribute: 'type'}) +# t.number(path: 'number', namespace_prefix: 'mods') +# t.caption(path: 'caption', namespace_prefix: 'mods') +# } +# t.extent(path: 'extent', namespace_prefix: 'mods'){ +# t.unit(path: { attribute: 'unit' }) +# t.start(path: 'start', namespace_prefix: 'mods') +# t.end(path: 'end', namespace_prefix: 'mods') +# } +# t.date(path: 'date', namespace_prefix: 'mods'){ +# t.encording(path: { attribute: 'encoding' }) +# } +# } +# t.resource_type(path: 'typeOfResource', namespace_prefix: 'mods') +# t.genre(path: 'genre', namespace_prefix: 'mods'){ +# t.authority(path: { attribute: 'authority' }) +# } +# t.origin_info(path: 'originInfo', namespace_prefix: 'mods'){ +# t.place(path: 'place', namespace_prefix: 'mods'){ +# t.term(path: 'placeTerm', namespace_prefix: 'mods'){ +# t.type(path: { attribute: 'type' }) +# } +# } +# t.publisher(path: 'publisher', namespace_prefix: 'mods', index_as: [:stored_searchable]) +# t.issuance(path: 'issuance', namespace_prefix: 'mods') +# t.frequency(path: 'frequency', namespace_prefix: 'mods'){ +# t.authority(path: { attribute: 'authority'}) +# } +# } +# t.physical_description(path: 'physicalDescription', namespace_prefix: 'mods'){ +# t.form(path: 'form', namespace_prefix: 'mods'){ +# t.authority(path: { attribute: 'authority'}) +# } +# t.digital_origin(path: 'digitalOrigin', namespace_prefix: 'mods') +# } +# t.identifier(path: 'identifier', namespace_prefix: 'mods'){ +# t.type(path: { attribute: 'type' }) +# } +# } +# +# t.title(proxy: [:title_info, :title]) +# t.date_issued(proxy: [:origin_info, :date_issued]) +# end +# +# def prefix +# "" +# end +# +# # We override to_solr here to add +# # 1. A creation_year field. +# # 2. A valid date Begin field +# # 3. A valid date End field +# # 4. Special facetable keywords, e.g. any subject/topic field with an authority attribute +# def to_solr(solr_doc = Hash.new()) +# super(solr_doc) # Run the default solrization behavior +# +# # Extract a creation year field +# if self.origin_info.copyright.any? && !self.origin_info.copyright.first.blank? +# creation_date = self.origin_info.copyright.first +# solr_doc["creation_year_sim"] = [creation_date[/\d{4}/]] +# # solr_doc["date_issued_ssim"] = [creation_date] +# elsif self.origin_info.date_issued.any? && !self.origin_info.date_issued.first.blank? +# creation_date = self.origin_info.date_issued.first +# solr_doc["creation_year_sim"] = [creation_date[/\d{4}/]] +# end +# +# +# # Ensure title is set to a title actually associated with this core file. +# solr_doc["title_info_title_ssi"] = self.title_info.title.first +# +# # Extract special subject/topic fields +# authorized_keywords = [] +# +# (0..self.subject.length).each do |i| +# if self.subject(i).topic.authority.any? +# authorized_keywords << self.subject(i).topic.first +# end +# end +# +# solr_doc["subject_sim"] = authorized_keywords +# +# #Extract and solrize names divided into first/last parts +# full_names = [] +# +# (0..self.personal_name.length).each do |i| +# fn = self.personal_name(i).name_part_given +# ln = self.personal_name(i).name_part_family +# +# if fn.any? && ln.any? +# full_names << "#{fn.first} #{ln.first}" +# end +# end +# +# solr_doc["personal_creators_tesim"] = full_names +# solr_doc["personal_creators_sim"] = full_names +# +# # Create an aggregate facet field of all creator information +# personal_names = solr_doc["personal_creators_sim"] || [] +# corporate_names = solr_doc["corporate_name_name_part_sim"] || [] +# names = solr_doc["name_name_part_sim"] || [] +# all_names = personal_names + corporate_names + names +# solr_doc["creator_sim"] = all_names +# solr_doc["creator_tesim"] = all_names +# +# #TODO: Extract dateBegin/dateEnd information ] +# return solr_doc +# end +# +# +# def self.xml_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.mods('xmlns:mods' => 'http://www.loc.gov/mods/v3', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', +# 'xsi:schemaLocation' => 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-4.xsd'){ +# xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix=="mods" } +# xml.titleInfo { +# xml.title +# } +# xml.abstract +# xml.name('type' => 'personal') +# xml.name('type' => 'corporate') +# xml.originInfo { +# xml.dateIssued('keyDate' => 'yes', 'encoding' => 'w3cdtf') +# } +# xml.language{ +# xml.languageTerm +# } +# xml.note('type' => 'citation') +# xml.subject +# xml.identifier +# xml.typeOfResource +# } +# end +# builder.doc +# end +# +# # Filters out blank entries, builds nodes as required +# def names=(x) +# x = x.select { |name| !name.blank? } +# +# if x.length < self.name.length +# node_count = self.name.length - x.length +# trim_nodes_from_zero(:name, node_count) +# end +# +# x.each_with_index do |name, i| +# if self.name[i].nil? +# self.insert_new_node(:name) +# end +# +# self.name(i).name_part = name +# end +# end +# +# # Filters out blank keyword entries +# def topics=(array_of_strings) +# array_of_keywords = array_of_strings.select {|kw| !kw.blank? } +# +# if array_of_keywords.length < self.subject.length +# node_count = self.subject.length - array_of_keywords.length +# trim_nodes_from_zero(:subject, node_count) +# end +# +# array_of_keywords.each_with_index do |kw, index| +# if self.subject[index].nil? +# self.insert_new_node(:subject) +# end +# +# self.subject(index).topic = kw +# end +# end +# +# # The following four methods are probably deprecated, given that we won't be +# # collecting corporate/personal names separately from end users, and therefore shouldn't +# # have to assign to it/read from it for the purposes of the frontend. +# +# # Takes two arrays of equal length and turns them into correctly formatted +# # mods_personal_name nodes. +# def assign_creator_personal_names(first_names, last_names) +# if first_names.length != last_names.length +# raise "#{first_names.length} first names received and #{last_names.length} last names received, which won't do at all." +# end +# +# name_pairs = Hash[first_names.zip(last_names)] +# +# name_pairs.select! { |first, last| !first.blank? && !last.blank? } +# +# if name_pairs.length < self.personal_name.length +# node_count = self.personal_name.length - name_pairs.length +# trim_nodes_from_zero(:personal_name, node_count) +# end +# +# name_pairs.each_with_index do |(first_name, last_name), index| +# if self.personal_name[index].nil? +# self.insert_new_node(:personal_name) +# end +# +# self.personal_name(index).name_part_given = first_name +# self.personal_name(index).name_part_family = last_name +# end +# end +# +# # Takes an array and turns it into correctly formatted mods_corporate_name nodes. +# def assign_corporate_names(cns) +# +# cns.select! { |name| !name.blank? } +# +# if cns.length < self.corporate_name.length +# node_count = self.corporate_name.length - cns.length +# trim_nodes_from_zero(:corporate_name, node_count) +# end +# +# cns.each_with_index do |c_name, index| +# if self.corporate_name[index].nil? +# self.insert_new_node(:corporate_name) +# end +# +# self.corporate_name(index).name_part = c_name +# end +# end +# +# # Eliminates some whitespace that seems to get inserted into these records when they're +# # returned. +# def corporate_creators +# no_newlines = self.corporate_name.map { |name| name.delete("\n") } +# trimmed = no_newlines.map { |name| name.strip } +# return trimmed +# end +# +# # Formats the otherwise messy return for personal creator information +# def personal_creators +# result_array = [] +# +# first_names = self.personal_name.name_part_given +# last_names = self.personal_name.name_part_family +# +# names = first_names.zip(last_names) +# +# # NB: When accessing nested arrays of form [[first, second], [first, second]] +# # that are all of even length, array.each do |first, second| grabs both elements +# # out of each nested array in sequence. Did not know this until I looked it up. +# names.each do |first, last| +# result_array << Hash[first: first, last: last] +# end +# +# return result_array +# end +# +# +# +# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# # Template files used by NodeHelper to add/remove nodes +# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# def self.name_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.name +# end +# return builder.doc.root +# end +# +# def self.subject_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.subject +# end +# return builder.doc.root +# end +# +# def self.personal_name_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.name('type' => 'personal') +# end +# return builder.doc.root +# end +# +# def self.corporate_name_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.name('type' => 'corporate') +# end +# return builder.doc.root +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/datastreams/properties_datastream.rb b/lib/cerberus_core/lib/cerberus_core/datastreams/properties_datastream.rb index fbd061d1a..13265baee 100644 --- a/lib/cerberus_core/lib/cerberus_core/datastreams/properties_datastream.rb +++ b/lib/cerberus_core/lib/cerberus_core/datastreams/properties_datastream.rb @@ -1,72 +1,72 @@ -module CerberusCore::Datastreams - # Catch all datastream for information that didn't have another home. - # Useful for implementing persistence of information that isn't interesting - # from an archival/curation point of view, for example an array of urls pointing - # at the thumbnail file locations for this object, which is handy when reading - # from solr responses. - class PropertiesDatastream < ActiveFedora::OmDatastream - set_terminology do |t| - t.root(:path=>"fields" ) - # Note that trying to delegate #parent_id to any object which defines - # a relationship referred to as #parent will cause a collision. Instead of - # writing/to reading from the properties datastream it'll be trying to use - # the *_id helpers provided by ActiveFedora. - t.parent_id :index_as=>[:stored_searchable] - # This is where we put the user id of the object depositor -- impacts permissions/access controls - t.depositor :index_as=>[:stored_searchable] - t.thumbnails :index_as=>[:stored_searchable] - t.canonical :index_as=>[:stored_searchable] - t.in_progress path: 'inProgress', :index_as=>[:stored_searchable] - t.download_filename index_as: [:symbol] - end - - def self.xml_template - builder = Nokogiri::XML::Builder.new do |xml| - xml.fields - end - builder.doc - end - - def prefix - "" - end - - # Checks if the Fedora object is in progress, indicating - # that the system must do additional work before it can be - # considered 'complete'. Typically, this additional work involves - # content objects pointing at a core record that should be created - # before the object is displayed to the world. - def in_progress? - return ! self.in_progress.empty? - end - - # Tag this fedora object as in progress. See #in_progress? - def tag_as_in_progress - self.in_progress = 'true' - end - - # Tag this fedora object as completed. See #in_progress?. - def tag_as_completed - self.in_progress = [] - end - - # Indicates this object is canon. See #canonical? - def canonize - self.canonical = 'yes' - end - - # Indicates this object is no longer canon. See #canonical? - def uncanonize - self.canonical = '' - end - - # Check that this (typically content bearing) Fedora object is the chief - # object associated with some other object (typically a core record). For - # example, a core record with an associated master image object and derivatives - # generated from that master image would tag the master image as the canonical - # record. - def canonical? - return self.canonical.first == 'yes' - end - end -end +# module CerberusCore::Datastreams +# # Catch all datastream for information that didn't have another home. +# # Useful for implementing persistence of information that isn't interesting +# # from an archival/curation point of view, for example an array of urls pointing +# # at the thumbnail file locations for this object, which is handy when reading +# # from solr responses. +# class PropertiesDatastream < ActiveFedora::OmDatastream +# set_terminology do |t| +# t.root(:path=>"fields" ) +# # Note that trying to delegate #parent_id to any object which defines +# # a relationship referred to as #parent will cause a collision. Instead of +# # writing/to reading from the properties datastream it'll be trying to use +# # the *_id helpers provided by ActiveFedora. +# t.parent_id :index_as=>[:stored_searchable] +# # This is where we put the user id of the object depositor -- impacts permissions/access controls +# t.depositor :index_as=>[:stored_searchable] +# t.thumbnails :index_as=>[:stored_searchable] +# t.canonical :index_as=>[:stored_searchable] +# t.in_progress path: 'inProgress', :index_as=>[:stored_searchable] +# t.download_filename index_as: [:symbol] +# end +# +# def self.xml_template +# builder = Nokogiri::XML::Builder.new do |xml| +# xml.fields +# end +# builder.doc +# end +# +# def prefix +# "" +# end +# +# # Checks if the Fedora object is in progress, indicating +# # that the system must do additional work before it can be +# # considered 'complete'. Typically, this additional work involves +# # content objects pointing at a core record that should be created +# # before the object is displayed to the world. +# def in_progress? +# return ! self.in_progress.empty? +# end +# +# # Tag this fedora object as in progress. See #in_progress? +# def tag_as_in_progress +# self.in_progress = 'true' +# end +# +# # Tag this fedora object as completed. See #in_progress?. +# def tag_as_completed +# self.in_progress = [] +# end +# +# # Indicates this object is canon. See #canonical? +# def canonize +# self.canonical = 'yes' +# end +# +# # Indicates this object is no longer canon. See #canonical? +# def uncanonize +# self.canonical = '' +# end +# +# # Check that this (typically content bearing) Fedora object is the chief +# # object associated with some other object (typically a core record). For +# # example, a core record with an associated master image object and derivatives +# # generated from that master image would tag the master image as the canonical +# # record. +# def canonical? +# return self.canonical.first == 'yes' +# end +# end +# end diff --git a/lib/cerberus_core/lib/cerberus_core/services/query_service.rb b/lib/cerberus_core/lib/cerberus_core/services/query_service.rb index 90520e9eb..4b1ebaaad 100644 --- a/lib/cerberus_core/lib/cerberus_core/services/query_service.rb +++ b/lib/cerberus_core/lib/cerberus_core/services/query_service.rb @@ -1,192 +1,192 @@ -module CerberusCore::Services - # Given a pid and the name of the class that the pid object - # is an instance of, this service handles querying Solr for - # children and descendents. See the Traversals concern for - # a cleaner interface into this service, which may admittedly - # need some polish. - class QueryService - - attr_accessor :pid, :class_name - - def initialize(pid, class_name) - self.pid = pid - self.class_name = class_name - end - - # There are three ways to 'have' a Fedora object. The first is - # holding the actual fedora ORM object. The second is the raw - # response hash returned by a query to solr, and the third is - # that response hash pushed into a SolrDocument. This object - # creates a new QueryService based on any of the three. - def self.create_from_object(object) - if (object.class.name == "SolrDocument") || object.is_a?(Hash) - id = object["id"] - class_name = object["active_fedora_model_ssi"] - - CerberusCore::Services::QueryService.new(id, class_name) - else - CerberusCore::Services::QueryService.new(object.pid, object.class.name) - end - end - - # See Traversals. - def get_children(as = :models) - query_with_models(:all, as) - end - - # See Traversals. - def get_descendents(as = :models) - results = query_with_models(:all, :query_result) - - results.each do |r| - id = r["id"] - model = r["active_fedora_model_ssi"] - qs = QueryService.new(id, model) - more_kids = qs.query_with_models(:all, :query_result) - results.push(*more_kids) - end - - parse_return_statement(as, results) - end - - # See Traversals. - def get_child_records(as = :models) - query_with_models(:files, as) - end - - # See Traversals. - def get_descendent_records(as = :models) - filter_descendent_query(:files, as) - end - - # See Traversals. - def get_child_collections(as = :models) - query_with_models(:collections, as) - end - - # See Traversals. - def get_descendent_collections(as = :models) - filter_descendent_query(:collections, as) - end - - # See Traversals. - def get_child_communities(as = :models) - query_with_models(:communities, as) - end - - # See Traversals. - def get_descendent_communities(as = :models) - filter_descendent_query(:communities, as) - end - - # Return all content objects for pid. If pid doesn't point at - # a CoreRecord type object, or just one with no content, - # return an empty array. - def get_content_objects(as = :models) - query = "is_part_of_ssim:#{full_pid}" - row_count = ActiveFedora::SolrService.count(query) - results = ActiveFedora::SolrService.query(query, rows: row_count) - parse_return_statement(as, results) - end - - # Return the canonical object for this pid. If pid doesn't point - # at a CoreRecord type object, or just one with no content, - # return nil. - def get_canonical_object(as = :models) - intermediate = get_content_objects(:query_result) - intermediate.keep_if { |x| x["canonical_tesim"] == ['yes'] } - parse_return_statement(as, intermediate).first - end - - protected - - #:nodoc: - def query_with_models(model_types, as) - models = model_array(model_types) - if models.any? - models = construct_model_query(models) - - member_of = "is_member_of_ssim:#{full_pid}" - affiliation_with = "has_affiliation_ssim:#{full_pid}" - - query = "#{models} AND (#{member_of} OR #{affiliation_with})" - row_count = ActiveFedora::SolrService.count(query) - results = ActiveFedora::SolrService.query(query, rows: row_count) - - parse_return_statement(as, results) - else - return [] - end - end - - private - - #:nodoc: - def full_pid(param_pid = nil) - if param_pid - return "\"info:fedora/#{param_pid}\"" - else - return "\"info:fedora/#{self.pid}\"" - end - end - - #:nodoc: - def construct_model_query(model_names) - models = model_names.map{|x|"\"#{x}\""}.join(" OR ") - return "active_fedora_model_ssi:(#{models})" - end - - #:nodoc: - def filter_descendent_query(model_type, as) - qr = get_descendents(:query_result) - - models = model_array(model_type) - - qr.keep_if { |r| models.include? r["active_fedora_model_ssi"] } - - parse_return_statement(as, qr) - end - - #:nodoc: - def parse_return_statement(as, results) - if [:query_result, :query_results, :raw, :raws].include? as - return results - elsif [:models, :model].include? as - results.map! do |result| - ActiveFedora::Base.find(result["id"], cast: true) - end - elsif [:solr_documents, :solr_document, :solr_docs, :solr_doc].include? as - results.map! { |result| ::SolrDocument.new(result) } - else - raise "Invalid return type specified" - end - end - - #:nodoc: - def model_array(type) - const = class_name.constantize - - records = [] - folders = [] - communities = [] - - check = Proc.new do |x, y| - const.public_methods.include?(x) && y.include?(type) - end - - if check.call(:core_file_types, [:files, :all]) - records = const.core_file_types - end - - if check.call(:collection_types, [:collections, :all]) - folders = const.collection_types - end - - if check.call(:community_types, [:communities, :all]) - communities = const.community_types - end - - return records + folders + communities - end - end -end +# module CerberusCore::Services +# # Given a pid and the name of the class that the pid object +# # is an instance of, this service handles querying Solr for +# # children and descendents. See the Traversals concern for +# # a cleaner interface into this service, which may admittedly +# # need some polish. +# class QueryService +# +# attr_accessor :pid, :class_name +# +# def initialize(pid, class_name) +# self.pid = pid +# self.class_name = class_name +# end +# +# # There are three ways to 'have' a Fedora object. The first is +# # holding the actual fedora ORM object. The second is the raw +# # response hash returned by a query to solr, and the third is +# # that response hash pushed into a SolrDocument. This object +# # creates a new QueryService based on any of the three. +# def self.create_from_object(object) +# if (object.class.name == "SolrDocument") || object.is_a?(Hash) +# id = object["id"] +# class_name = object["active_fedora_model_ssi"] +# +# CerberusCore::Services::QueryService.new(id, class_name) +# else +# CerberusCore::Services::QueryService.new(object.pid, object.class.name) +# end +# end +# +# # See Traversals. +# def get_children(as = :models) +# query_with_models(:all, as) +# end +# +# # See Traversals. +# def get_descendents(as = :models) +# results = query_with_models(:all, :query_result) +# +# results.each do |r| +# id = r["id"] +# model = r["active_fedora_model_ssi"] +# qs = QueryService.new(id, model) +# more_kids = qs.query_with_models(:all, :query_result) +# results.push(*more_kids) +# end +# +# parse_return_statement(as, results) +# end +# +# # See Traversals. +# def get_child_records(as = :models) +# query_with_models(:files, as) +# end +# +# # See Traversals. +# def get_descendent_records(as = :models) +# filter_descendent_query(:files, as) +# end +# +# # See Traversals. +# def get_child_collections(as = :models) +# query_with_models(:collections, as) +# end +# +# # See Traversals. +# def get_descendent_collections(as = :models) +# filter_descendent_query(:collections, as) +# end +# +# # See Traversals. +# def get_child_communities(as = :models) +# query_with_models(:communities, as) +# end +# +# # See Traversals. +# def get_descendent_communities(as = :models) +# filter_descendent_query(:communities, as) +# end +# +# # Return all content objects for pid. If pid doesn't point at +# # a CoreRecord type object, or just one with no content, +# # return an empty array. +# def get_content_objects(as = :models) +# query = "is_part_of_ssim:#{full_pid}" +# row_count = SolrService.count(query) +# results = SolrService.query(query, rows: row_count) +# parse_return_statement(as, results) +# end +# +# # Return the canonical object for this pid. If pid doesn't point +# # at a CoreRecord type object, or just one with no content, +# # return nil. +# def get_canonical_object(as = :models) +# intermediate = get_content_objects(:query_result) +# intermediate.keep_if { |x| x["canonical_tesim"] == ['yes'] } +# parse_return_statement(as, intermediate).first +# end +# +# protected +# +# #:nodoc: +# def query_with_models(model_types, as) +# models = model_array(model_types) +# if models.any? +# models = construct_model_query(models) +# +# member_of = "is_member_of_ssim:#{full_pid}" +# affiliation_with = "has_affiliation_ssim:#{full_pid}" +# +# query = "#{models} AND (#{member_of} OR #{affiliation_with})" +# row_count = SolrService.count(query) +# results = SolrService.query(query, rows: row_count) +# +# parse_return_statement(as, results) +# else +# return [] +# end +# end +# +# private +# +# #:nodoc: +# def full_pid(param_pid = nil) +# if param_pid +# return "\"info:fedora/#{param_pid}\"" +# else +# return "\"info:fedora/#{self.pid}\"" +# end +# end +# +# #:nodoc: +# def construct_model_query(model_names) +# models = model_names.map{|x|"\"#{x}\""}.join(" OR ") +# return "active_fedora_model_ssi:(#{models})" +# end +# +# #:nodoc: +# def filter_descendent_query(model_type, as) +# qr = get_descendents(:query_result) +# +# models = model_array(model_type) +# +# qr.keep_if { |r| models.include? r["active_fedora_model_ssi"] } +# +# parse_return_statement(as, qr) +# end +# +# #:nodoc: +# def parse_return_statement(as, results) +# if [:query_result, :query_results, :raw, :raws].include? as +# return results +# elsif [:models, :model].include? as +# results.map! do |result| +# ActiveRecord::Base.find(result["id"], cast: true) +# end +# elsif [:solr_documents, :solr_document, :solr_docs, :solr_doc].include? as +# results.map! { |result| ::SolrDocument.new(result) } +# else +# raise "Invalid return type specified" +# end +# end +# +# #:nodoc: +# def model_array(type) +# const = class_name.constantize +# +# records = [] +# folders = [] +# communities = [] +# +# check = Proc.new do |x, y| +# const.public_methods.include?(x) && y.include?(type) +# end +# +# if check.call(:core_file_types, [:files, :all]) +# records = const.core_file_types +# end +# +# if check.call(:collection_types, [:collections, :all]) +# folders = const.collection_types +# end +# +# if check.call(:community_types, [:communities, :all]) +# communities = const.community_types +# end +# +# return records + folders + communities +# end +# end +# end diff --git a/solr/configsets/sunspot/conf/_rest_managed.json b/solr/configsets/sunspot/conf/_rest_managed.json deleted file mode 100644 index 6a4aec39e..000000000 --- a/solr/configsets/sunspot/conf/_rest_managed.json +++ /dev/null @@ -1 +0,0 @@ -{"initArgs":{},"managedList":[]} diff --git a/solr/configsets/sunspot/conf/admin-extra.html b/solr/configsets/sunspot/conf/admin-extra.html deleted file mode 100644 index aa739da86..000000000 --- a/solr/configsets/sunspot/conf/admin-extra.html +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/solr/configsets/sunspot/conf/currency.xml b/solr/configsets/sunspot/conf/currency.xml deleted file mode 100644 index 3a9c58afe..000000000 --- a/solr/configsets/sunspot/conf/currency.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/solr/configsets/sunspot/conf/elevate.xml b/solr/configsets/sunspot/conf/elevate.xml deleted file mode 100644 index 7630ebe20..000000000 --- a/solr/configsets/sunspot/conf/elevate.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/solr/configsets/sunspot/conf/lang/stopwords_en.txt b/solr/configsets/sunspot/conf/lang/stopwords_en.txt deleted file mode 100644 index 2c164c0b2..000000000 --- a/solr/configsets/sunspot/conf/lang/stopwords_en.txt +++ /dev/null @@ -1,54 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# a couple of test stopwords to test that the words are really being -# configured from this file: -stopworda -stopwordb - -# Standard english stop words taken from Lucene's StopAnalyzer -a -an -and -are -as -at -be -but -by -for -if -in -into -is -it -no -not -of -on -or -such -that -the -their -then -there -these -they -this -to -was -will -with diff --git a/solr/configsets/sunspot/conf/mapping-ISOLatin1Accent.txt b/solr/configsets/sunspot/conf/mapping-ISOLatin1Accent.txt deleted file mode 100644 index ede774258..000000000 --- a/solr/configsets/sunspot/conf/mapping-ISOLatin1Accent.txt +++ /dev/null @@ -1,246 +0,0 @@ -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Syntax: -# "source" => "target" -# "source".length() > 0 (source cannot be empty.) -# "target".length() >= 0 (target can be empty.) - -# example: -# "À" => "A" -# "\u00C0" => "A" -# "\u00C0" => "\u0041" -# "ß" => "ss" -# "\t" => " " -# "\n" => "" - -# À => A -"\u00C0" => "A" - -# Á => A -"\u00C1" => "A" - -#  => A -"\u00C2" => "A" - -# à => A -"\u00C3" => "A" - -# Ä => A -"\u00C4" => "A" - -# Å => A -"\u00C5" => "A" - -# Æ => AE -"\u00C6" => "AE" - -# Ç => C -"\u00C7" => "C" - -# È => E -"\u00C8" => "E" - -# É => E -"\u00C9" => "E" - -# Ê => E -"\u00CA" => "E" - -# Ë => E -"\u00CB" => "E" - -# Ì => I -"\u00CC" => "I" - -# Í => I -"\u00CD" => "I" - -# Î => I -"\u00CE" => "I" - -# Ï => I -"\u00CF" => "I" - -# IJ => IJ -"\u0132" => "IJ" - -# Ð => D -"\u00D0" => "D" - -# Ñ => N -"\u00D1" => "N" - -# Ò => O -"\u00D2" => "O" - -# Ó => O -"\u00D3" => "O" - -# Ô => O -"\u00D4" => "O" - -# Õ => O -"\u00D5" => "O" - -# Ö => O -"\u00D6" => "O" - -# Ø => O -"\u00D8" => "O" - -# Œ => OE -"\u0152" => "OE" - -# Þ -"\u00DE" => "TH" - -# Ù => U -"\u00D9" => "U" - -# Ú => U -"\u00DA" => "U" - -# Û => U -"\u00DB" => "U" - -# Ü => U -"\u00DC" => "U" - -# Ý => Y -"\u00DD" => "Y" - -# Ÿ => Y -"\u0178" => "Y" - -# à => a -"\u00E0" => "a" - -# á => a -"\u00E1" => "a" - -# â => a -"\u00E2" => "a" - -# ã => a -"\u00E3" => "a" - -# ä => a -"\u00E4" => "a" - -# å => a -"\u00E5" => "a" - -# æ => ae -"\u00E6" => "ae" - -# ç => c -"\u00E7" => "c" - -# è => e -"\u00E8" => "e" - -# é => e -"\u00E9" => "e" - -# ê => e -"\u00EA" => "e" - -# ë => e -"\u00EB" => "e" - -# ì => i -"\u00EC" => "i" - -# í => i -"\u00ED" => "i" - -# î => i -"\u00EE" => "i" - -# ï => i -"\u00EF" => "i" - -# ij => ij -"\u0133" => "ij" - -# ð => d -"\u00F0" => "d" - -# ñ => n -"\u00F1" => "n" - -# ò => o -"\u00F2" => "o" - -# ó => o -"\u00F3" => "o" - -# ô => o -"\u00F4" => "o" - -# õ => o -"\u00F5" => "o" - -# ö => o -"\u00F6" => "o" - -# ø => o -"\u00F8" => "o" - -# œ => oe -"\u0153" => "oe" - -# ß => ss -"\u00DF" => "ss" - -# þ => th -"\u00FE" => "th" - -# ù => u -"\u00F9" => "u" - -# ú => u -"\u00FA" => "u" - -# û => u -"\u00FB" => "u" - -# ü => u -"\u00FC" => "u" - -# ý => y -"\u00FD" => "y" - -# ÿ => y -"\u00FF" => "y" - -# ff => ff -"\uFB00" => "ff" - -# fi => fi -"\uFB01" => "fi" - -# fl => fl -"\uFB02" => "fl" - -# ffi => ffi -"\uFB03" => "ffi" - -# ffl => ffl -"\uFB04" => "ffl" - -# ſt => ft -"\uFB05" => "ft" - -# st => st -"\uFB06" => "st" diff --git a/solr/configsets/sunspot/conf/protwords.txt b/solr/configsets/sunspot/conf/protwords.txt deleted file mode 100644 index 1dfc0abec..000000000 --- a/solr/configsets/sunspot/conf/protwords.txt +++ /dev/null @@ -1,21 +0,0 @@ -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#----------------------------------------------------------------------- -# Use a protected word file to protect against the stemmer reducing two -# unrelated words to the same base word. - -# Some non-words that normally won't be encountered, -# just to test that they won't be stemmed. -dontstems -zwhacky - diff --git a/solr/configsets/sunspot/conf/schema.xml b/solr/configsets/sunspot/conf/schema.xml deleted file mode 100644 index 9777c1146..000000000 --- a/solr/configsets/sunspot/conf/schema.xml +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id - - text - - - - - - - - diff --git a/solr/configsets/sunspot/conf/scripts.conf b/solr/configsets/sunspot/conf/scripts.conf deleted file mode 100644 index f58b262ae..000000000 --- a/solr/configsets/sunspot/conf/scripts.conf +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -user= -solr_hostname=localhost -solr_port=8983 -rsyncd_port=18983 -data_dir= -webapp_name=solr -master_host= -master_data_dir= -master_status_dir= diff --git a/solr/configsets/sunspot/conf/solrconfig.xml b/solr/configsets/sunspot/conf/solrconfig.xml deleted file mode 100644 index f67cfef92..000000000 --- a/solr/configsets/sunspot/conf/solrconfig.xml +++ /dev/null @@ -1,631 +0,0 @@ - - - - - - - - - 5.0.0 - - - ${solr.data.dir:} - - - - - - - - - - - - - - - - ${solr.lock.type:native} - - - true - - - - - - - - - - - - - - - - ${solr.ulog.dir:} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - 1024 - - - - - - - - - - - - - - - - - - true - - - 20 - - - 200 - - - false - - - 2 - - - - - - - - - - - - - - - - - - - default - true - true - - - spellcheck - - - - - - - explicit - json - true - text - - - spellcheck - - - - - - - {!xport} - xsort - false - - - - query - - - - - - - text - - - - - - - - - - - - - - explicit - true - - - - - - textSpell - - - - default - - textSpell - true - - - - example - title_text - true - solr.DirectSolrSpellChecker - - internal - - 0.5 - - 2 - - 1 - - 5 - - 4 - - 0.01 - - - - - - wordbreak - solr.WordBreakSolrSpellChecker - name - true - true - 10 - - --> - - - - - - - - - - - true - false - - - terms - - - - - - 1 - 2 - - - - - - *:* - - - diff --git a/solr/configsets/sunspot/conf/spellings.txt b/solr/configsets/sunspot/conf/spellings.txt deleted file mode 100644 index d7ede6f56..000000000 --- a/solr/configsets/sunspot/conf/spellings.txt +++ /dev/null @@ -1,2 +0,0 @@ -pizza -history \ No newline at end of file diff --git a/solr/configsets/sunspot/conf/synonyms.txt b/solr/configsets/sunspot/conf/synonyms.txt deleted file mode 100644 index 7f7212830..000000000 --- a/solr/configsets/sunspot/conf/synonyms.txt +++ /dev/null @@ -1,29 +0,0 @@ -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#----------------------------------------------------------------------- -#some test synonym mappings unlikely to appear in real input text -aaafoo => aaabar -bbbfoo => bbbfoo bbbbar -cccfoo => cccbar cccbaz -fooaaa,baraaa,bazaaa - -# Some synonym groups specific to this example -GB,gib,gigabyte,gigabytes -MB,mib,megabyte,megabytes -Television, Televisions, TV, TVs -#notice we use "gib" instead of "GiB" so any WordDelimiterFilter coming -#after us won't split it into two words. - -# Synonym mappings can be used for spelling correction too -pixima => pixma - diff --git a/solr/default/core.properties b/solr/default/core.properties deleted file mode 100644 index 629f4bcff..000000000 --- a/solr/default/core.properties +++ /dev/null @@ -1,3 +0,0 @@ -name=default -configSet=sunspot -dataDir=./data diff --git a/solr/development/core.properties b/solr/development/core.properties deleted file mode 100644 index 1e1db3533..000000000 --- a/solr/development/core.properties +++ /dev/null @@ -1,3 +0,0 @@ -name=development -configSet=sunspot -dataDir=./data diff --git a/solr/solr.xml b/solr/solr.xml deleted file mode 100644 index e247452da..000000000 --- a/solr/solr.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - ${host:} - ${jetty.port:8983} - ${hostContext:solr} - - ${genericCoreNodeNames:true} - - ${zkClientTimeout:30000} - ${distribUpdateSoTimeout:600000} - ${distribUpdateConnTimeout:60000} - - - - - ${socketTimeout:600000} - ${connTimeout:60000} - - - diff --git a/solr/test/core.properties b/solr/test/core.properties deleted file mode 100644 index e1221d130..000000000 --- a/solr/test/core.properties +++ /dev/null @@ -1,3 +0,0 @@ -name=test -configSet=sunspot -dataDir=./data diff --git a/solr_conf/conf/schema.xml b/solr_conf/conf/schema.xml deleted file mode 100644 index 048c00f6f..000000000 --- a/solr_conf/conf/schema.xml +++ /dev/null @@ -1,278 +0,0 @@ - - - - - id - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/solr_conf/conf/solrconfig.xml b/solr_conf/conf/solrconfig.xml deleted file mode 100644 index 1fb41db65..000000000 --- a/solr_conf/conf/solrconfig.xml +++ /dev/null @@ -1,223 +0,0 @@ - - - - - ${solr.abortOnConfigurationError:true} - - LUCENE_40 - - - - - - - - - ${solr.data.dir:} - - - - - - - ${solr.ulog.dir:} - - - - - ${solr.autoCommit.maxTime:15000} - false - - - - - - ${solr.autoSoftCommit.maxTime:-1} - - - - - - - - AND - edismax - explicit - *:* - - 100% - 1 - 2 - 0.01 - - - id - active_fedora_model_ssi - title_tesim - author_tesim - subject_tesim - all_text_timv - - - all_text_timv^10 - - - - author_tesim - - - - - title_tesim - - - - - subject_tesim - - - - - - *, - score - - - true - 1 - 10 - active_fedora_model_ssi - subject_sim - - true - default - true - true - false - 5 - - - - spellcheck - - - - - - off - all - 1 - {!raw f=id v=$id} - - id, - access_ssim, - discover_access_group_ssim,discover_access_person_ssim, - read_access_group_ssim,read_access_person_ssim, - edit_access_group_ssim,edit_access_person_ssim, - depositor_ti, - project_members_ssim, project_editors_ssim, project_admins_ssim, - embargo_release_date_dtsi - inheritable_access_ssim, - inheritable_discover_access_group_ssim,inheritable_discover_access_person_ssim, - inheritable_read_access_group_ssim,inheritable_read_access_person_ssim, - inheritable_edit_access_group_ssim,inheritable_edit_access_person_ssim, - inheritable_embargo_release_date_dtsi - - - - - - - explicit - lucene - - - - - - - all - * - 1 - {!raw f=id v=$id} - - - - - - textSpell - - - default - spell - ./spell - true - - - - - - - - - - - - - - - - solrpingquery - - - all - - - - - - search - - - diff --git a/solr_conf/solr.xml b/solr_conf/solr.xml deleted file mode 100644 index 761314374..000000000 --- a/solr_conf/solr.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - diff --git a/spec/factories/content/html_file_factories.rb b/spec/factories/content/html_file_factories.rb index 50bfea7d5..57156566a 100644 --- a/spec/factories/content/html_file_factories.rb +++ b/spec/factories/content/html_file_factories.rb @@ -1,5 +1,5 @@ -FactoryBot.define do - factory :html_file, :class => HTMLFile do - depositor { 'test_user' } - end -end +# FactoryBot.define do +# factory :html_file, :class => HTMLFile do +# depositor { 'test_user' } +# end +# end diff --git a/spec/factories/content/tei_file_factories.rb b/spec/factories/content/tei_file_factories.rb index 72125b4d2..bd0843793 100644 --- a/spec/factories/content/tei_file_factories.rb +++ b/spec/factories/content/tei_file_factories.rb @@ -1,5 +1,5 @@ -FactoryBot.define do - factory :tei_file, :class => TEIFile do - depositor { 'test_user' } - end -end +# FactoryBot.define do +# factory :tei_file, :class => TEIFile do +# depositor { 'test_user' } +# end +# end From 20f56e4350bf12ba6938b43bb476cba117a923d3 Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Fri, 31 Mar 2023 11:27:24 -0400 Subject: [PATCH 7/9] adds version number to migration files as version numbers are required with the updated version of rails --- config/database.yml | 46 ++----------------- .../20140902161922_devise_create_users.rb | 4 +- ...140902161925_add_devise_guests_to_users.rb | 4 +- ...140902161934_create_searches.blacklight.rb | 2 +- ...40902161935_create_bookmarks.blacklight.rb | 2 +- ...olymorphic_type_to_bookmarks.blacklight.rb | 2 +- ...02205708_add_encrypted_api_key_to_users.rb | 2 +- .../20170126143948_create_view_packages.rb | 2 +- .../20170201204151_change_assetdir_type.rb | 2 +- .../20170201205147_fix_assetdir_names.rb | 2 +- ...name_and_git_timestamp_to_view_packages.rb | 2 +- ...7200912_add_git_branch_to_view_packages.rb | 2 +- ...20170425125133_create_friendly_id_slugs.rb | 2 +- db/migrate/20170425130711_create_pages.rb | 2 +- .../20170425134313_add_role_to_users.rb | 2 +- ...70425151605_create_bootsy_images.bootsy.rb | 2 +- ...606_create_bootsy_img_galleries.bootsy.rb} | 4 +- ...0170426173054_create_forem_forums.forem.rb | 2 +- ...0170426173055_create_forem_topics.forem.rb | 2 +- ...20170426173056_create_forem_posts.forem.rb | 2 +- ...73057_add_reply_to_to_forem_posts.forem.rb | 2 +- ...173058_add_locked_to_forem_topics.forem.rb | 2 +- ...173059_add_pinned_to_forem_topics.forem.rb | 2 +- .../20170426173060_add_forem_views.forem.rb | 2 +- ...dated_at_and_count_to_forem_views.forem.rb | 2 +- ...173062_add_hidden_to_forem_topics.forem.rb | 2 +- ...add_indexes_to_topics_posts_views.forem.rb | 2 +- ...426173064_create_forem_categories.forem.rb | 2 +- ...6173065_add_category_id_to_forums.forem.rb | 2 +- ...173066_create_forem_subscriptions.forem.rb | 2 +- ...add_pending_review_to_forem_posts.forem.rb | 2 +- ...dd_pending_review_to_forem_topics.forem.rb | 2 +- ...069_add_forem_topics_last_post_at.forem.rb | 2 +- ...0170426173070_create_forem_groups.forem.rb | 2 +- ...26173071_create_forem_memberships.forem.rb | 2 +- ...072_create_forem_moderator_groups.forem.rb | 2 +- ...g_review_add_state_to_forem_posts.forem.rb | 2 +- ...eview_from_forem_topics_add_state.forem.rb | 2 +- ...3075_approve_all_topics_and_posts.forem.rb | 2 +- ...73076_add_notified_to_forem_posts.forem.rb | 2 +- ...3077_make_forem_views_polymorphic.forem.rb | 2 +- ...70426173078_add_forem_view_fields.forem.rb | 2 +- .../20170426173079_add_forem_admin.forem.rb | 2 +- .../20170426173080_add_forem_state.forem.rb | 2 +- ...26173081_add_forem_auto_subscribe.forem.rb | 2 +- ...70426173082_add_friendly_id_slugs.forem.rb | 2 +- ...ame_title_to_name_on_forem_forums.forem.rb | 2 +- ...173084_add_position_to_categories.forem.rb | 2 +- ...0426173085_add_position_to_forums.forem.rb | 2 +- .../20170426175101_add_name_to_users.rb | 2 +- .../20170523152748_add_publish_to_pages.rb | 2 +- .../20170526154953_add_timestamps_to_pages.rb | 2 +- .../20170526180105_create_news_items.rb | 2 +- .../20170601175928_create_menu_links.rb | 2 +- .../20170601180139_add_tags_to_news_items.rb | 2 +- .../20170608140842_add_submenu_to_pages.rb | 2 +- .../20170719221855_create_institutions.rb | 2 +- .../20170719223854_change_description_type.rb | 2 +- .../20171108165807_add_institution_to_user.rb | 2 +- .../20171108202341_add_avatar_to_users.rb | 2 +- db/migrate/20171108213808_add_bio_to_users.rb | 2 +- ...0180214180611_add_confirmable_to_devise.rb | 2 +- ...0180323170339_add_account_type_to_users.rb | 2 +- 63 files changed, 69 insertions(+), 107 deletions(-) rename db/migrate/{20170425151606_create_bootsy_image_galleries.bootsy.rb => 20170425151606_create_bootsy_img_galleries.bootsy.rb} (60%) diff --git a/config/database.yml b/config/database.yml index c254e35b4..5b97b475f 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,18 +1,16 @@ default: &default adapter: mysql2 encoding: utf8mb4 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - username: <%= ENV['MYSQL_DEV_USER'] %> - password: <%= ENV['MYSQL_DEV_PASSWORD'] %> + pool: 5 + timeout: 5000 + username: <%= ENV['MYSQL_USER'] %> + password: <%= ENV['MYSQL_PASSWORD'] %> socket: /tmp/mysql.sock development: <<: *default database: tapas_development -# 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: <<: *default database: tapas_test @@ -20,39 +18,3 @@ test: production: <<: *default database: tapas_production - username: <%= ENV['MYSQL_USER'] %> - password: <%= ENV['MYSQL_PASSWORD'] %> - - - -#default: &default -# adapter: mysql2 -# encoding: utf8 -# pool: 5 -# timeout: 5000 - -#development: -# <<: *default -# username: <%#= ENV['MYSQL_DEV_USER'] %> -# password: <%#= ENV['MYSQL_DEV_PASSWORD'] %> -# socket: /tmp/mysql.sock -# database: tapas_development - -#staging: -# <<: *default -# host: <%#= ENV['MYSQL_HOST'] %> -# port: <%#= ENV['MYSQL_PORT'] %> -# database: tapas_rails_staging - -#production: -# <<: *default -# host: <%#= ENV['MYSQL_HOST'] %> -# port: <%#= ENV['MYSQL_PORT'] %> -# database: tapas_rails_production - -# 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: -# <<: *default -# database: tapas_test diff --git a/db/migrate/20140902161922_devise_create_users.rb b/db/migrate/20140902161922_devise_create_users.rb index cf497c272..b9762d0ff 100644 --- a/db/migrate/20140902161922_devise_create_users.rb +++ b/db/migrate/20140902161922_devise_create_users.rb @@ -1,5 +1,5 @@ -class DeviseCreateUsers < ActiveRecord::Migration - def change +class DeviseCreateUsers < ActiveRecord::Migration[5.2] +def change create_table(:users) do |t| ## Database authenticatable t.string :email, null: false, default: "" diff --git a/db/migrate/20140902161925_add_devise_guests_to_users.rb b/db/migrate/20140902161925_add_devise_guests_to_users.rb index 445a7d1b6..1adadb975 100644 --- a/db/migrate/20140902161925_add_devise_guests_to_users.rb +++ b/db/migrate/20140902161925_add_devise_guests_to_users.rb @@ -1,4 +1,4 @@ -class AddDeviseGuestsToUsers < ActiveRecord::Migration +class AddDeviseGuestsToUsers < ActiveRecord::Migration[5.2] def self.up change_table(:users) do |t| ## Database authenticatable @@ -12,4 +12,4 @@ def self.down # model already existed. Please edit below which fields you would like to remove in this migration. raise ActiveRecord::IrreversibleMigration end -end \ No newline at end of file +end diff --git a/db/migrate/20140902161934_create_searches.blacklight.rb b/db/migrate/20140902161934_create_searches.blacklight.rb index 8bc708f51..7b4f1170a 100644 --- a/db/migrate/20140902161934_create_searches.blacklight.rb +++ b/db/migrate/20140902161934_create_searches.blacklight.rb @@ -1,6 +1,6 @@ # This migration comes from blacklight (originally 20140202020201) # -*- encoding : utf-8 -*- -class CreateSearches < ActiveRecord::Migration +class CreateSearches < ActiveRecord::Migration[5.2] def self.up create_table :searches do |t| t.text :query_params diff --git a/db/migrate/20140902161935_create_bookmarks.blacklight.rb b/db/migrate/20140902161935_create_bookmarks.blacklight.rb index 069e6910c..4b3d236e4 100644 --- a/db/migrate/20140902161935_create_bookmarks.blacklight.rb +++ b/db/migrate/20140902161935_create_bookmarks.blacklight.rb @@ -1,6 +1,6 @@ # This migration comes from blacklight (originally 20140202020202) # -*- encoding : utf-8 -*- -class CreateBookmarks < ActiveRecord::Migration +class CreateBookmarks < ActiveRecord::Migration[5.2] def self.up create_table :bookmarks do |t| t.integer :user_id, :null=>false diff --git a/db/migrate/20140902161936_add_polymorphic_type_to_bookmarks.blacklight.rb b/db/migrate/20140902161936_add_polymorphic_type_to_bookmarks.blacklight.rb index 16a02a8cb..91240dfe6 100644 --- a/db/migrate/20140902161936_add_polymorphic_type_to_bookmarks.blacklight.rb +++ b/db/migrate/20140902161936_add_polymorphic_type_to_bookmarks.blacklight.rb @@ -1,6 +1,6 @@ # This migration comes from blacklight (originally 20140320000000) # -*- encoding : utf-8 -*- -class AddPolymorphicTypeToBookmarks < ActiveRecord::Migration +class AddPolymorphicTypeToBookmarks < ActiveRecord::Migration[5.2] def change add_column(:bookmarks, :document_type, :string) diff --git a/db/migrate/20140902205708_add_encrypted_api_key_to_users.rb b/db/migrate/20140902205708_add_encrypted_api_key_to_users.rb index df8a334d7..d67f96cb9 100644 --- a/db/migrate/20140902205708_add_encrypted_api_key_to_users.rb +++ b/db/migrate/20140902205708_add_encrypted_api_key_to_users.rb @@ -1,4 +1,4 @@ -class AddEncryptedApiKeyToUsers < ActiveRecord::Migration +class AddEncryptedApiKeyToUsers < ActiveRecord::Migration[5.2] def up add_column :users, :encrypted_api_key, :string end diff --git a/db/migrate/20170126143948_create_view_packages.rb b/db/migrate/20170126143948_create_view_packages.rb index 1446cb738..296be447c 100644 --- a/db/migrate/20170126143948_create_view_packages.rb +++ b/db/migrate/20170126143948_create_view_packages.rb @@ -1,4 +1,4 @@ -class CreateViewPackages < ActiveRecord::Migration +class CreateViewPackages < ActiveRecord::Migration[5.2] def change create_table :view_packages do |t| t.string :human_name diff --git a/db/migrate/20170201204151_change_assetdir_type.rb b/db/migrate/20170201204151_change_assetdir_type.rb index fa2b7eb38..2c925a3f9 100644 --- a/db/migrate/20170201204151_change_assetdir_type.rb +++ b/db/migrate/20170201204151_change_assetdir_type.rb @@ -1,4 +1,4 @@ -class ChangeAssetdirType < ActiveRecord::Migration +class ChangeAssetdirType < ActiveRecord::Migration[5.2] def up change_table :view_packages do |t| t.change :css_dir, :text diff --git a/db/migrate/20170201205147_fix_assetdir_names.rb b/db/migrate/20170201205147_fix_assetdir_names.rb index da1de170a..fdba10e48 100644 --- a/db/migrate/20170201205147_fix_assetdir_names.rb +++ b/db/migrate/20170201205147_fix_assetdir_names.rb @@ -1,4 +1,4 @@ -class FixAssetdirNames < ActiveRecord::Migration +class FixAssetdirNames < ActiveRecord::Migration[5.2] def up rename_column :view_packages, :css_dir, :css_files rename_column :view_packages, :js_dir, :js_files diff --git a/db/migrate/20170215140743_add_dir_name_and_git_timestamp_to_view_packages.rb b/db/migrate/20170215140743_add_dir_name_and_git_timestamp_to_view_packages.rb index 72be407b7..5ad17e2c8 100644 --- a/db/migrate/20170215140743_add_dir_name_and_git_timestamp_to_view_packages.rb +++ b/db/migrate/20170215140743_add_dir_name_and_git_timestamp_to_view_packages.rb @@ -1,4 +1,4 @@ -class AddDirNameAndGitTimestampToViewPackages < ActiveRecord::Migration +class AddDirNameAndGitTimestampToViewPackages < ActiveRecord::Migration[5.2] def up add_column :view_packages, :dir_name, :string add_column :view_packages, :git_timestamp, :datetime diff --git a/db/migrate/20170217200912_add_git_branch_to_view_packages.rb b/db/migrate/20170217200912_add_git_branch_to_view_packages.rb index 62cf3d5b7..025dad0c2 100644 --- a/db/migrate/20170217200912_add_git_branch_to_view_packages.rb +++ b/db/migrate/20170217200912_add_git_branch_to_view_packages.rb @@ -1,4 +1,4 @@ -class AddGitBranchToViewPackages < ActiveRecord::Migration +class AddGitBranchToViewPackages < ActiveRecord::Migration[5.2] def up add_column :view_packages, :git_branch, :string end diff --git a/db/migrate/20170425125133_create_friendly_id_slugs.rb b/db/migrate/20170425125133_create_friendly_id_slugs.rb index 770f62644..134c328bb 100644 --- a/db/migrate/20170425125133_create_friendly_id_slugs.rb +++ b/db/migrate/20170425125133_create_friendly_id_slugs.rb @@ -1,4 +1,4 @@ -class CreateFriendlyIdSlugs < ActiveRecord::Migration +class CreateFriendlyIdSlugs < ActiveRecord::Migration[5.2] def change create_table :friendly_id_slugs do |t| t.string :slug, :null => false diff --git a/db/migrate/20170425130711_create_pages.rb b/db/migrate/20170425130711_create_pages.rb index 0561b275f..f17c81908 100644 --- a/db/migrate/20170425130711_create_pages.rb +++ b/db/migrate/20170425130711_create_pages.rb @@ -1,4 +1,4 @@ -class CreatePages < ActiveRecord::Migration +class CreatePages < ActiveRecord::Migration[5.2] def change create_table :pages do |t| t.string :title, :null=>false diff --git a/db/migrate/20170425134313_add_role_to_users.rb b/db/migrate/20170425134313_add_role_to_users.rb index f2c25413c..beadfc503 100644 --- a/db/migrate/20170425134313_add_role_to_users.rb +++ b/db/migrate/20170425134313_add_role_to_users.rb @@ -1,4 +1,4 @@ -class AddRoleToUsers < ActiveRecord::Migration +class AddRoleToUsers < ActiveRecord::Migration[5.2] def up add_column :users, :role, :string end diff --git a/db/migrate/20170425151605_create_bootsy_images.bootsy.rb b/db/migrate/20170425151605_create_bootsy_images.bootsy.rb index bfb393e99..01a98afe2 100644 --- a/db/migrate/20170425151605_create_bootsy_images.bootsy.rb +++ b/db/migrate/20170425151605_create_bootsy_images.bootsy.rb @@ -1,5 +1,5 @@ # This migration comes from bootsy (originally 20120624171333) -class CreateBootsyImages < ActiveRecord::Migration +class CreateBootsyImages < ActiveRecord::Migration[5.2] def change create_table :bootsy_images do |t| t.string :image_file diff --git a/db/migrate/20170425151606_create_bootsy_image_galleries.bootsy.rb b/db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb similarity index 60% rename from db/migrate/20170425151606_create_bootsy_image_galleries.bootsy.rb rename to db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb index 620f36d4c..295fb8542 100644 --- a/db/migrate/20170425151606_create_bootsy_image_galleries.bootsy.rb +++ b/db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb @@ -1,7 +1,7 @@ # This migration comes from bootsy (originally 20120628124845) -class CreateBootsyImageGalleries < ActiveRecord::Migration +class CreateBootsyImgGalleries < ActiveRecord::Migration[5.2] def change - create_table :bootsy_image_galleries do |t| + create_table :bootsy_img_galleries do |t| t.references :bootsy_resource, polymorphic: true t.timestamps end diff --git a/db/migrate/20170426173054_create_forem_forums.forem.rb b/db/migrate/20170426173054_create_forem_forums.forem.rb index 3c9abaa1a..3806facbb 100644 --- a/db/migrate/20170426173054_create_forem_forums.forem.rb +++ b/db/migrate/20170426173054_create_forem_forums.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110214221555) -class CreateForemForums < ActiveRecord::Migration +class CreateForemForums < ActiveRecord::Migration[5.2] def up create_table :forem_forums do |t| t.string :title diff --git a/db/migrate/20170426173055_create_forem_topics.forem.rb b/db/migrate/20170426173055_create_forem_topics.forem.rb index 93d489cd6..a5687f2ec 100644 --- a/db/migrate/20170426173055_create_forem_topics.forem.rb +++ b/db/migrate/20170426173055_create_forem_topics.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110221092741) -class CreateForemTopics < ActiveRecord::Migration +class CreateForemTopics < ActiveRecord::Migration[5.2] def change create_table :forem_topics do |t| t.integer :forum_id diff --git a/db/migrate/20170426173056_create_forem_posts.forem.rb b/db/migrate/20170426173056_create_forem_posts.forem.rb index de0469c1c..b5d5177a7 100644 --- a/db/migrate/20170426173056_create_forem_posts.forem.rb +++ b/db/migrate/20170426173056_create_forem_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110221094502) -class CreateForemPosts < ActiveRecord::Migration +class CreateForemPosts < ActiveRecord::Migration[5.2] def change create_table :forem_posts do |t| t.integer :topic_id diff --git a/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb b/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb index 769a2cf30..0dc2eb642 100644 --- a/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb +++ b/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110228084940) -class AddReplyToToForemPosts < ActiveRecord::Migration +class AddReplyToToForemPosts < ActiveRecord::Migration[5.2] def change add_column :forem_posts, :reply_to_id, :integer end diff --git a/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb b/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb index fd1eea65c..18a7243e8 100644 --- a/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb +++ b/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110519210300) -class AddLockedToForemTopics < ActiveRecord::Migration +class AddLockedToForemTopics < ActiveRecord::Migration[5.2] def change add_column :forem_topics, :locked, :boolean, :null => false, :default => false end diff --git a/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb b/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb index d201b02da..b6907bbdd 100644 --- a/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb +++ b/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110519222000) -class AddPinnedToForemTopics < ActiveRecord::Migration +class AddPinnedToForemTopics < ActiveRecord::Migration[5.2] def change add_column :forem_topics, :pinned, :boolean, :default => false, :nullable => false end diff --git a/db/migrate/20170426173060_add_forem_views.forem.rb b/db/migrate/20170426173060_add_forem_views.forem.rb index 1ddd8e8ff..22ea5efed 100644 --- a/db/migrate/20170426173060_add_forem_views.forem.rb +++ b/db/migrate/20170426173060_add_forem_views.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110520150056) -class AddForemViews < ActiveRecord::Migration +class AddForemViews < ActiveRecord::Migration[5.2] def change create_table :forem_views do |t| t.integer :user_id diff --git a/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb b/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb index d3a6a71b4..3f8615c95 100644 --- a/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb +++ b/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110626150056) -class AddUpdatedAtAndCountToForemViews < ActiveRecord::Migration +class AddUpdatedAtAndCountToForemViews < ActiveRecord::Migration[5.2] def change add_column :forem_views, :updated_at, :datetime add_column :forem_views, :count, :integer, :default => 0 diff --git a/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb b/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb index 1ae540334..4595c6fce 100644 --- a/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb +++ b/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20110626160056) -class AddHiddenToForemTopics < ActiveRecord::Migration +class AddHiddenToForemTopics < ActiveRecord::Migration[5.2] def change add_column :forem_topics, :hidden, :boolean, :default => false end diff --git a/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb b/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb index 77a86193e..dfd126bbc 100644 --- a/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb +++ b/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20111026143136) -class AddIndexesToTopicsPostsViews < ActiveRecord::Migration +class AddIndexesToTopicsPostsViews < ActiveRecord::Migration[5.2] def change add_index :forem_topics, :forum_id add_index :forem_topics, :user_id diff --git a/db/migrate/20170426173064_create_forem_categories.forem.rb b/db/migrate/20170426173064_create_forem_categories.forem.rb index ba05073cd..7e2bf0c1d 100644 --- a/db/migrate/20170426173064_create_forem_categories.forem.rb +++ b/db/migrate/20170426173064_create_forem_categories.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20111103210835) -class CreateForemCategories < ActiveRecord::Migration +class CreateForemCategories < ActiveRecord::Migration[5.2] def change create_table :forem_categories do |t| t.string :name, :null => false diff --git a/db/migrate/20170426173065_add_category_id_to_forums.forem.rb b/db/migrate/20170426173065_add_category_id_to_forums.forem.rb index b155b7915..5cc5e275c 100644 --- a/db/migrate/20170426173065_add_category_id_to_forums.forem.rb +++ b/db/migrate/20170426173065_add_category_id_to_forums.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20111103214432) -class AddCategoryIdToForums < ActiveRecord::Migration +class AddCategoryIdToForums < ActiveRecord::Migration[5.2] def change add_column :forem_forums, :category_id, :integer diff --git a/db/migrate/20170426173066_create_forem_subscriptions.forem.rb b/db/migrate/20170426173066_create_forem_subscriptions.forem.rb index 91c25c84d..76d0ac82c 100644 --- a/db/migrate/20170426173066_create_forem_subscriptions.forem.rb +++ b/db/migrate/20170426173066_create_forem_subscriptions.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20111208014437) -class CreateForemSubscriptions < ActiveRecord::Migration +class CreateForemSubscriptions < ActiveRecord::Migration[5.2] def change create_table :forem_subscriptions do |t| t.integer :subscriber_id diff --git a/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb b/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb index 9e8476053..03f577f2a 100644 --- a/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb +++ b/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120221195806) -class AddPendingReviewToForemPosts < ActiveRecord::Migration +class AddPendingReviewToForemPosts < ActiveRecord::Migration[5.2] def change add_column :forem_posts, :pending_review, :boolean, :default => true diff --git a/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb b/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb index 73fddd1c7..e9db0f93c 100644 --- a/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb +++ b/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120221195807) -class AddPendingReviewToForemTopics < ActiveRecord::Migration +class AddPendingReviewToForemTopics < ActiveRecord::Migration[5.2] def change add_column :forem_topics, :pending_review, :boolean, :default => true diff --git a/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb b/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb index 3f11c942c..1c2b8a382 100644 --- a/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb +++ b/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120222000227) -class AddForemTopicsLastPostAt < ActiveRecord::Migration +class AddForemTopicsLastPostAt < ActiveRecord::Migration[5.2] def up add_column :forem_topics, :last_post_at, :datetime Forem::Topic.reset_column_information diff --git a/db/migrate/20170426173070_create_forem_groups.forem.rb b/db/migrate/20170426173070_create_forem_groups.forem.rb index 2d6170c78..f9009e972 100644 --- a/db/migrate/20170426173070_create_forem_groups.forem.rb +++ b/db/migrate/20170426173070_create_forem_groups.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120222155549) -class CreateForemGroups < ActiveRecord::Migration +class CreateForemGroups < ActiveRecord::Migration[5.2] def change create_table :forem_groups do |t| t.string :name diff --git a/db/migrate/20170426173071_create_forem_memberships.forem.rb b/db/migrate/20170426173071_create_forem_memberships.forem.rb index 4385541a3..fc607892a 100644 --- a/db/migrate/20170426173071_create_forem_memberships.forem.rb +++ b/db/migrate/20170426173071_create_forem_memberships.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120222204450) -class CreateForemMemberships < ActiveRecord::Migration +class CreateForemMemberships < ActiveRecord::Migration[5.2] def change create_table :forem_memberships do |t| t.integer :group_id diff --git a/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb b/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb index d1ca23d24..fdbfac70a 100644 --- a/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb +++ b/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120223162058) -class CreateForemModeratorGroups < ActiveRecord::Migration +class CreateForemModeratorGroups < ActiveRecord::Migration[5.2] def change create_table :forem_moderator_groups do |t| t.integer :forum_id diff --git a/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb b/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb index abe247d80..440d914ff 100644 --- a/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb +++ b/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120227195911) -class RemovePendingReviewAddStateToForemPosts < ActiveRecord::Migration +class RemovePendingReviewAddStateToForemPosts < ActiveRecord::Migration[5.2] def up remove_column :forem_posts, :pending_review add_column :forem_posts, :state, :string, :default => 'pending_review' diff --git a/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb b/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb index d47d057e5..0b22a59f1 100644 --- a/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb +++ b/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120227202639) -class RemovePendingReviewFromForemTopicsAddState < ActiveRecord::Migration +class RemovePendingReviewFromForemTopicsAddState < ActiveRecord::Migration[5.2] def up remove_column :forem_topics, :pending_review add_column :forem_topics, :state, :string, :default => 'pending_review' diff --git a/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb b/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb index 39f64f599..f6537fbc3 100644 --- a/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb +++ b/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120228194653) -class ApproveAllTopicsAndPosts < ActiveRecord::Migration +class ApproveAllTopicsAndPosts < ActiveRecord::Migration[5.2] def up Forem::Topic.update_all :state => "approved" Forem::Post.update_all :state => "approved" diff --git a/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb b/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb index 23fcae712..e9e5e19e5 100644 --- a/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb +++ b/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120228202859) -class AddNotifiedToForemPosts < ActiveRecord::Migration +class AddNotifiedToForemPosts < ActiveRecord::Migration[5.2] def change add_column :forem_posts, :notified, :boolean, :default => false end diff --git a/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb b/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb index bf88ee6b8..c34cff715 100644 --- a/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb +++ b/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120229165013) -class MakeForemViewsPolymorphic < ActiveRecord::Migration +class MakeForemViewsPolymorphic < ActiveRecord::Migration[5.2] def up rename_column :forem_views, :topic_id, :viewable_id add_column :forem_views, :viewable_type, :string diff --git a/db/migrate/20170426173078_add_forem_view_fields.forem.rb b/db/migrate/20170426173078_add_forem_view_fields.forem.rb index c420ee47c..ccdff5a55 100644 --- a/db/migrate/20170426173078_add_forem_view_fields.forem.rb +++ b/db/migrate/20170426173078_add_forem_view_fields.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120302152918) -class AddForemViewFields < ActiveRecord::Migration +class AddForemViewFields < ActiveRecord::Migration[5.2] def up add_column :forem_views, :current_viewed_at, :datetime add_column :forem_views, :past_viewed_at, :datetime diff --git a/db/migrate/20170426173079_add_forem_admin.forem.rb b/db/migrate/20170426173079_add_forem_admin.forem.rb index 258aac8c1..b0beba084 100644 --- a/db/migrate/20170426173079_add_forem_admin.forem.rb +++ b/db/migrate/20170426173079_add_forem_admin.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120616193446) -class AddForemAdmin < ActiveRecord::Migration +class AddForemAdmin < ActiveRecord::Migration[5.2] def change unless column_exists?(user_class, :forem_admin) add_column user_class, :forem_admin, :boolean, :default => false diff --git a/db/migrate/20170426173080_add_forem_state.forem.rb b/db/migrate/20170426173080_add_forem_state.forem.rb index 4bd865dca..5a27e79ef 100644 --- a/db/migrate/20170426173080_add_forem_state.forem.rb +++ b/db/migrate/20170426173080_add_forem_state.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120616193447) -class AddForemState < ActiveRecord::Migration +class AddForemState < ActiveRecord::Migration[5.2] def change unless column_exists?(user_class, :forem_state) add_column user_class, :forem_state, :string, :default => 'pending_review' diff --git a/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb b/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb index 9a412fe21..d788c1a02 100644 --- a/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb +++ b/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120616193448) -class AddForemAutoSubscribe < ActiveRecord::Migration +class AddForemAutoSubscribe < ActiveRecord::Migration[5.2] def change unless column_exists?(user_class, :forem_auto_subscribe) add_column user_class, :forem_auto_subscribe, :boolean, :default => false diff --git a/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb b/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb index 9c44c18b2..4baa615ad 100644 --- a/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb +++ b/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20120718073130) -class AddFriendlyIdSlugs < ActiveRecord::Migration +class AddFriendlyIdSlugs < ActiveRecord::Migration[5.2] def change add_column :forem_forums, :slug, :string add_index :forem_forums, :slug, :unique => true diff --git a/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb b/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb index 8c14eff06..de1768c55 100644 --- a/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb +++ b/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20121203093719) -class RenameTitleToNameOnForemForums < ActiveRecord::Migration +class RenameTitleToNameOnForemForums < ActiveRecord::Migration[5.2] def up rename_column :forem_forums, :title, :name end diff --git a/db/migrate/20170426173084_add_position_to_categories.forem.rb b/db/migrate/20170426173084_add_position_to_categories.forem.rb index ba98da203..78e2edaea 100644 --- a/db/migrate/20170426173084_add_position_to_categories.forem.rb +++ b/db/migrate/20170426173084_add_position_to_categories.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20140917034000) -class AddPositionToCategories < ActiveRecord::Migration +class AddPositionToCategories < ActiveRecord::Migration[5.2] def change add_column :forem_categories, :position, :integer, :default => 0 end diff --git a/db/migrate/20170426173085_add_position_to_forums.forem.rb b/db/migrate/20170426173085_add_position_to_forums.forem.rb index 8f780e208..1a9dd7967 100644 --- a/db/migrate/20170426173085_add_position_to_forums.forem.rb +++ b/db/migrate/20170426173085_add_position_to_forums.forem.rb @@ -1,5 +1,5 @@ # This migration comes from forem (originally 20140917201619) -class AddPositionToForums < ActiveRecord::Migration +class AddPositionToForums < ActiveRecord::Migration[5.2] def change add_column :forem_forums, :position, :integer, :default => 0 end diff --git a/db/migrate/20170426175101_add_name_to_users.rb b/db/migrate/20170426175101_add_name_to_users.rb index 1ca063ebe..27f06bd2a 100644 --- a/db/migrate/20170426175101_add_name_to_users.rb +++ b/db/migrate/20170426175101_add_name_to_users.rb @@ -1,4 +1,4 @@ -class AddNameToUsers < ActiveRecord::Migration +class AddNameToUsers < ActiveRecord::Migration[5.2] def up add_column :users, :name, :string end diff --git a/db/migrate/20170523152748_add_publish_to_pages.rb b/db/migrate/20170523152748_add_publish_to_pages.rb index bcf0ea6cd..3be574471 100644 --- a/db/migrate/20170523152748_add_publish_to_pages.rb +++ b/db/migrate/20170523152748_add_publish_to_pages.rb @@ -1,4 +1,4 @@ -class AddPublishToPages < ActiveRecord::Migration +class AddPublishToPages < ActiveRecord::Migration[5.2] def up add_column :pages, :publish, :string end diff --git a/db/migrate/20170526154953_add_timestamps_to_pages.rb b/db/migrate/20170526154953_add_timestamps_to_pages.rb index 62e8da98c..f683ca077 100644 --- a/db/migrate/20170526154953_add_timestamps_to_pages.rb +++ b/db/migrate/20170526154953_add_timestamps_to_pages.rb @@ -1,4 +1,4 @@ -class AddTimestampsToPages < ActiveRecord::Migration +class AddTimestampsToPages < ActiveRecord::Migration[5.2] def change add_timestamps :pages end diff --git a/db/migrate/20170526180105_create_news_items.rb b/db/migrate/20170526180105_create_news_items.rb index 8113bd135..dcdcb0028 100644 --- a/db/migrate/20170526180105_create_news_items.rb +++ b/db/migrate/20170526180105_create_news_items.rb @@ -1,4 +1,4 @@ -class CreateNewsItems < ActiveRecord::Migration +class CreateNewsItems < ActiveRecord::Migration[5.2] def change create_table :news_items do |t| t.string :author diff --git a/db/migrate/20170601175928_create_menu_links.rb b/db/migrate/20170601175928_create_menu_links.rb index d5e7b50da..d53daaa48 100644 --- a/db/migrate/20170601175928_create_menu_links.rb +++ b/db/migrate/20170601175928_create_menu_links.rb @@ -1,4 +1,4 @@ -class CreateMenuLinks < ActiveRecord::Migration +class CreateMenuLinks < ActiveRecord::Migration[5.2] def change create_table :menu_links do |t| t.string :link_text, :null=>false diff --git a/db/migrate/20170601180139_add_tags_to_news_items.rb b/db/migrate/20170601180139_add_tags_to_news_items.rb index 9307ef4ef..703c0f11c 100644 --- a/db/migrate/20170601180139_add_tags_to_news_items.rb +++ b/db/migrate/20170601180139_add_tags_to_news_items.rb @@ -1,4 +1,4 @@ -class AddTagsToNewsItems < ActiveRecord::Migration +class AddTagsToNewsItems < ActiveRecord::Migration[5.2] def up add_column :news_items, :tags, :string end diff --git a/db/migrate/20170608140842_add_submenu_to_pages.rb b/db/migrate/20170608140842_add_submenu_to_pages.rb index 017ac3223..a641da4b8 100644 --- a/db/migrate/20170608140842_add_submenu_to_pages.rb +++ b/db/migrate/20170608140842_add_submenu_to_pages.rb @@ -1,4 +1,4 @@ -class AddSubmenuToPages < ActiveRecord::Migration +class AddSubmenuToPages < ActiveRecord::Migration[5.2] def up add_column :pages, :submenu, :string end diff --git a/db/migrate/20170719221855_create_institutions.rb b/db/migrate/20170719221855_create_institutions.rb index ec34e1f8f..274fe9153 100644 --- a/db/migrate/20170719221855_create_institutions.rb +++ b/db/migrate/20170719221855_create_institutions.rb @@ -1,4 +1,4 @@ -class CreateInstitutions < ActiveRecord::Migration +class CreateInstitutions < ActiveRecord::Migration[5.2] def change create_table :institutions do |t| t.string :name, :null=>false diff --git a/db/migrate/20170719223854_change_description_type.rb b/db/migrate/20170719223854_change_description_type.rb index 2dda651b9..4b453f1c5 100644 --- a/db/migrate/20170719223854_change_description_type.rb +++ b/db/migrate/20170719223854_change_description_type.rb @@ -1,4 +1,4 @@ -class ChangeDescriptionType < ActiveRecord::Migration +class ChangeDescriptionType < ActiveRecord::Migration[5.2] def up change_table :institutions do |t| t.change :description, :text diff --git a/db/migrate/20171108165807_add_institution_to_user.rb b/db/migrate/20171108165807_add_institution_to_user.rb index 0f6f57acd..0ac4d360b 100644 --- a/db/migrate/20171108165807_add_institution_to_user.rb +++ b/db/migrate/20171108165807_add_institution_to_user.rb @@ -1,4 +1,4 @@ -class AddInstitutionToUser < ActiveRecord::Migration +class AddInstitutionToUser < ActiveRecord::Migration[5.2] def change add_reference :users, :institution, index: true end diff --git a/db/migrate/20171108202341_add_avatar_to_users.rb b/db/migrate/20171108202341_add_avatar_to_users.rb index 7b4de37ad..af29d9d03 100644 --- a/db/migrate/20171108202341_add_avatar_to_users.rb +++ b/db/migrate/20171108202341_add_avatar_to_users.rb @@ -1,4 +1,4 @@ -class AddAvatarToUsers < ActiveRecord::Migration +class AddAvatarToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :avatar, :string end diff --git a/db/migrate/20171108213808_add_bio_to_users.rb b/db/migrate/20171108213808_add_bio_to_users.rb index 7198e9980..11d4deb46 100644 --- a/db/migrate/20171108213808_add_bio_to_users.rb +++ b/db/migrate/20171108213808_add_bio_to_users.rb @@ -1,4 +1,4 @@ -class AddBioToUsers < ActiveRecord::Migration +class AddBioToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :bio, :text end diff --git a/db/migrate/20180214180611_add_confirmable_to_devise.rb b/db/migrate/20180214180611_add_confirmable_to_devise.rb index dd14643d1..ca96aa56e 100644 --- a/db/migrate/20180214180611_add_confirmable_to_devise.rb +++ b/db/migrate/20180214180611_add_confirmable_to_devise.rb @@ -1,4 +1,4 @@ -class AddConfirmableToDevise < ActiveRecord::Migration +class AddConfirmableToDevise < ActiveRecord::Migration[5.2] # Note: You can't use change, as User.update_all will fail in the down migration def up add_column :users, :confirmation_token, :string diff --git a/db/migrate/20180323170339_add_account_type_to_users.rb b/db/migrate/20180323170339_add_account_type_to_users.rb index 51ba2904c..66a69ab23 100644 --- a/db/migrate/20180323170339_add_account_type_to_users.rb +++ b/db/migrate/20180323170339_add_account_type_to_users.rb @@ -1,4 +1,4 @@ -class AddAccountTypeToUsers < ActiveRecord::Migration +class AddAccountTypeToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :account_type, :text end From b8b1fbfcee0944a5ef6971538de74ab78d775f8a Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Fri, 31 Mar 2023 11:48:46 -0400 Subject: [PATCH 8/9] removes forum/forem migrations, html template elements, references in classes, styling, controllers, config files, and js files related to bootsy --- Gemfile | 1 - app/assets/javascripts/bootsy_options.js | 369 ------------------ app/assets/stylesheets/application.css.scss | 2 - app/controllers/application_controller.rb | 9 +- .../forem/application_controller_decorator.rb | 6 - app/models/solr_document.rb | 4 - app/models/user.rb | 14 +- app/views/admin/index.html.haml | 5 - config/initializers/forem.rb | 17 - config/locales/menu.en.yml | 3 - ...70425151605_create_bootsy_images.bootsy.rb | 10 - ...1606_create_bootsy_img_galleries.bootsy.rb | 9 - ...0170426173054_create_forem_forums.forem.rb | 14 - ...0170426173055_create_forem_topics.forem.rb | 12 - ...20170426173056_create_forem_posts.forem.rb | 12 - ...73057_add_reply_to_to_forem_posts.forem.rb | 6 - ...173058_add_locked_to_forem_topics.forem.rb | 6 - ...173059_add_pinned_to_forem_topics.forem.rb | 6 - .../20170426173060_add_forem_views.forem.rb | 10 - ...dated_at_and_count_to_forem_views.forem.rb | 7 - ...173062_add_hidden_to_forem_topics.forem.rb | 6 - ...add_indexes_to_topics_posts_views.forem.rb | 13 - ...426173064_create_forem_categories.forem.rb | 9 - ...6173065_add_category_id_to_forums.forem.rb | 10 - ...173066_create_forem_subscriptions.forem.rb | 9 - ...add_pending_review_to_forem_posts.forem.rb | 9 - ...dd_pending_review_to_forem_topics.forem.rb | 9 - ...069_add_forem_topics_last_post_at.forem.rb | 15 - ...0170426173070_create_forem_groups.forem.rb | 10 - ...26173071_create_forem_memberships.forem.rb | 11 - ...072_create_forem_moderator_groups.forem.rb | 11 - ...g_review_add_state_to_forem_posts.forem.rb | 17 - ...eview_from_forem_topics_add_state.forem.rb | 17 - ...3075_approve_all_topics_and_posts.forem.rb | 11 - ...73076_add_notified_to_forem_posts.forem.rb | 6 - ...3077_make_forem_views_polymorphic.forem.rb | 13 - ...70426173078_add_forem_view_fields.forem.rb | 24 -- .../20170426173079_add_forem_admin.forem.rb | 12 - .../20170426173080_add_forem_state.forem.rb | 12 - ...26173081_add_forem_auto_subscribe.forem.rb | 12 - ...70426173082_add_friendly_id_slugs.forem.rb | 19 - ...ame_title_to_name_on_forem_forums.forem.rb | 10 - ...173084_add_position_to_categories.forem.rb | 6 - ...0426173085_add_position_to_forums.forem.rb | 6 - db/schema.rb | 188 ++------- 45 files changed, 50 insertions(+), 937 deletions(-) delete mode 100644 app/assets/javascripts/bootsy_options.js delete mode 100644 app/decorators/controllers/forem/application_controller_decorator.rb delete mode 100644 config/initializers/forem.rb delete mode 100644 db/migrate/20170425151605_create_bootsy_images.bootsy.rb delete mode 100644 db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb delete mode 100644 db/migrate/20170426173054_create_forem_forums.forem.rb delete mode 100644 db/migrate/20170426173055_create_forem_topics.forem.rb delete mode 100644 db/migrate/20170426173056_create_forem_posts.forem.rb delete mode 100644 db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb delete mode 100644 db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb delete mode 100644 db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb delete mode 100644 db/migrate/20170426173060_add_forem_views.forem.rb delete mode 100644 db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb delete mode 100644 db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb delete mode 100644 db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb delete mode 100644 db/migrate/20170426173064_create_forem_categories.forem.rb delete mode 100644 db/migrate/20170426173065_add_category_id_to_forums.forem.rb delete mode 100644 db/migrate/20170426173066_create_forem_subscriptions.forem.rb delete mode 100644 db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb delete mode 100644 db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb delete mode 100644 db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb delete mode 100644 db/migrate/20170426173070_create_forem_groups.forem.rb delete mode 100644 db/migrate/20170426173071_create_forem_memberships.forem.rb delete mode 100644 db/migrate/20170426173072_create_forem_moderator_groups.forem.rb delete mode 100644 db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb delete mode 100644 db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb delete mode 100644 db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb delete mode 100644 db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb delete mode 100644 db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb delete mode 100644 db/migrate/20170426173078_add_forem_view_fields.forem.rb delete mode 100644 db/migrate/20170426173079_add_forem_admin.forem.rb delete mode 100644 db/migrate/20170426173080_add_forem_state.forem.rb delete mode 100644 db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb delete mode 100644 db/migrate/20170426173082_add_friendly_id_slugs.forem.rb delete mode 100644 db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb delete mode 100644 db/migrate/20170426173084_add_position_to_categories.forem.rb delete mode 100644 db/migrate/20170426173085_add_position_to_forums.forem.rb diff --git a/Gemfile b/Gemfile index d803230a4..e1588d945 100644 --- a/Gemfile +++ b/Gemfile @@ -33,7 +33,6 @@ gem 'turbolinks' # for handling slugs in URLS instead of IDs gem 'friendly_id', '~> 5.2.4' # Note: You MUST use 5.0.0 or greater for Rails 4.0+ -# hand to downgrade from 5.1.0 to 5.0.0 for forem to work # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '2.10' diff --git a/app/assets/javascripts/bootsy_options.js b/app/assets/javascripts/bootsy_options.js deleted file mode 100644 index d6049a695..000000000 --- a/app/assets/javascripts/bootsy_options.js +++ /dev/null @@ -1,369 +0,0 @@ -Bootsy.options = $.extend(true, Bootsy.options, { - parserRules: { - tags: { - a: { - set_attributes: { - target: "", - rel: "" - }, - check_attributes: { - name: "alt", - href: "href" - } - }, - script: {}, - p: {} - } - } -}); - -Bootsy.options.parserRules.classes = { - "navbar": 1, - "caret": 1, - "label": 1, - "table": 1, - "img-responsive": 1, - "img-rounded": 1, - "img-thumbnail": 1, - "img-circle": 1, - "sr-only": 1, - "lead": 1, - "text-muted": 1, - "text-primary": 1, - "text-warning": 1, - "text-danger": 1, - "text-success": 1, - "text-info": 1, - "text-left": 1, - "text-right": 1, - "text-center": 1, - "h6": 1, - "h1": 1, - "h2": 1, - "h3": 1, - "h4": 1, - "h5": 1, - "page-header": 1, - "list-unstyled": 1, - "list-inline": 1, - "initialism": 1, - "pull-right": 1, - "prettyprint": 1, - "pre-scrollable": 1, - "container": 1, - "row": 1, - "col-lg-12": 1, - "col-xs-11": 1, - "col-xs-1": 1, - "col-xs-2": 1, - "col-xs-3": 1, - "col-xs-4": 1, - "col-xs-5": 1, - "col-xs-6": 1, - "col-xs-7": 1, - "col-xs-8": 1, - "col-xs-9": 1, - "col-xs-10": 1, - "col-xs-12": 1, - "col-sm-11": 1, - "col-sm-1": 1, - "col-sm-2": 1, - "col-sm-3": 1, - "col-sm-4": 1, - "col-sm-5": 1, - "col-sm-6": 1, - "col-sm-7": 1, - "col-sm-8": 1, - "col-sm-9": 1, - "col-sm-10": 1, - "col-sm-12": 1, - "col-sm-push-1": 1, - "col-sm-push-2": 1, - "col-sm-push-3": 1, - "col-sm-push-4": 1, - "col-sm-push-5": 1, - "col-sm-push-6": 1, - "col-sm-push-7": 1, - "col-sm-push-8": 1, - "col-sm-push-9": 1, - "col-sm-push-10": 1, - "col-sm-push-11": 1, - "col-sm-pull-1": 1, - "col-sm-pull-2": 1, - "col-sm-pull-3": 1, - "col-sm-pull-4": 1, - "col-sm-pull-5": 1, - "col-sm-pull-6": 1, - "col-sm-pull-7": 1, - "col-sm-pull-8": 1, - "col-sm-pull-9": 1, - "col-sm-pull-10": 1, - "col-sm-pull-11": 1, - "col-sm-offset-1": 1, - "col-sm-offset-2": 1, - "col-sm-offset-3": 1, - "col-sm-offset-4": 1, - "col-sm-offset-5": 1, - "col-sm-offset-6": 1, - "col-sm-offset-7": 1, - "col-sm-offset-8": 1, - "col-sm-offset-9": 1, - "col-sm-offset-10": 1, - "col-sm-offset-11": 1, - "col-md-11": 1, - "col-md-1": 1, - "col-md-2": 1, - "col-md-3": 1, - "col-md-4": 1, - "col-md-5": 1, - "col-md-6": 1, - "col-md-7": 1, - "col-md-8": 1, - "col-md-9": 1, - "col-md-10": 1, - "col-md-12": 1, - "col-md-push-0": 1, - "col-md-push-1": 1, - "col-md-push-2": 1, - "col-md-push-3": 1, - "col-md-push-4": 1, - "col-md-push-5": 1, - "col-md-push-6": 1, - "col-md-push-7": 1, - "col-md-push-8": 1, - "col-md-push-9": 1, - "col-md-push-10": 1, - "col-md-push-11": 1, - "col-md-pull-0": 1, - "col-md-pull-1": 1, - "col-md-pull-2": 1, - "col-md-pull-3": 1, - "col-md-pull-4": 1, - "col-md-pull-5": 1, - "col-md-pull-6": 1, - "col-md-pull-7": 1, - "col-md-pull-8": 1, - "col-md-pull-9": 1, - "col-md-pull-10": 1, - "col-md-pull-11": 1, - "col-md-offset-0": 1, - "col-md-offset-1": 1, - "col-md-offset-2": 1, - "col-md-offset-3": 1, - "col-md-offset-4": 1, - "col-md-offset-5": 1, - "col-md-offset-6": 1, - "col-md-offset-7": 1, - "col-md-offset-8": 1, - "col-md-offset-9": 1, - "col-md-offset-10": 1, - "col-md-offset-11": 1, - "col-lg-11": 1, - "col-lg-1": 1, - "col-lg-2": 1, - "col-lg-3": 1, - "col-lg-4": 1, - "col-lg-5": 1, - "col-lg-6": 1, - "col-lg-7": 1, - "col-lg-8": 1, - "col-lg-9": 1, - "col-lg-10": 1, - "col-lg-push-0": 1, - "col-lg-push-1": 1, - "col-lg-push-2": 1, - "col-lg-push-3": 1, - "col-lg-push-4": 1, - "col-lg-push-5": 1, - "col-lg-push-6": 1, - "col-lg-push-7": 1, - "col-lg-push-8": 1, - "col-lg-push-9": 1, - "col-lg-push-10": 1, - "col-lg-push-11": 1, - "col-lg-pull-0": 1, - "col-lg-pull-1": 1, - "col-lg-pull-2": 1, - "col-lg-pull-3": 1, - "col-lg-pull-4": 1, - "col-lg-pull-5": 1, - "col-lg-pull-6": 1, - "col-lg-pull-7": 1, - "col-lg-pull-8": 1, - "col-lg-pull-9": 1, - "col-lg-pull-10": 1, - "col-lg-pull-11": 1, - "col-lg-offset-0": 1, - "col-lg-offset-1": 1, - "col-lg-offset-2": 1, - "col-lg-offset-3": 1, - "col-lg-offset-4": 1, - "col-lg-offset-5": 1, - "col-lg-offset-6": 1, - "col-lg-offset-7": 1, - "col-lg-offset-8": 1, - "col-lg-offset-9": 1, - "col-lg-offset-10": 1, - "col-lg-offset-11": 1, - "table-bordered": 1, - "table-responsive": 1, - "form-control": 1, - "form-group": 1, - "checkbox": 1, - "checkbox-inline": 1, - "input-sm": 1, - "input-lg": 1, - "control-label": 1, - "input-group-addon": 1, - "form-control-static": 1, - "help-block": 1, - "btn": 1, - "active": 1, - "btn-default": 1, - "btn-primary": 1, - "btn-warning": 1, - "btn-danger": 1, - "btn-success": 1, - "btn-info": 1, - "btn-link": 1, - "btn-lg": 1, - "btn-xs": 1, - "btn-block": 1, - "fade": 1, - "in": 1, - "collapse": 1, - "collapsing": 1, - "glyphicon": 1, - "dropdown": 1, - "dropdown-menu": 1, - "divider": 1, - "dropdown-header": 1, - "dropdown-backdrop": 1, - "btn-group-vertical": 1, - "btn-group": 1, - "dropdown-toggle": 1, - "btn-group-justified": 1, - "input-group": 1, - "col": 1, - "input-group-btn": 1, - "nav": 1, - "nav-divider": 1, - "nav-tabs": 1, - "nav-justified": 1, - "nav-tabs-justified": 1, - "pill-pane": 1, - "navbar-header": 1, - "navbar-collapse": 1, - "navbar-static-top": 1, - "navbar-fixed-bottom": 1, - "navbar-fixed-top": 1, - "navbar-brand": 1, - "navbar-toggle": 1, - "icon-bar": 1, - "navbar-nav": 1, - "navbar-left": 1, - "navbar-right": 1, - "navbar-form": 1, - "navbar-btn": 1, - "navbar-text": 1, - "navbar-default": 1, - "navbar-link": 1, - "navbar-inverse": 1, - "breadcrumb": 1, - "pagination": 1, - "pager": 1, - "label-default": 1, - "label-primary": 1, - "label-success": 1, - "label-info": 1, - "label-warning": 1, - "label-danger": 1, - "badge": 1, - "jumbotron": 1, - "thumbnail": 1, - "caption": 1, - "alert": 1, - "alert-link": 1, - "alert-dismissable": 1, - "close": 1, - "alert-success": 1, - "alert-info": 1, - "alert-warning": 1, - "alert-danger": 1, - "progress": 1, - "progress-bar": 1, - "progress-bar-success": 1, - "progress-bar-info": 1, - "progress-bar-warning": 1, - "progress-bar-danger": 1, - "media-body": 1, - "media": 1, - "media-object": 1, - "media-heading": 1, - "pull-left": 1, - "media-list": 1, - "list-group": 1, - "list-group-item": 1, - "list-group-item-heading": 1, - "list-group-item-text": 1, - "panel": 1, - "panel-body": 1, - "panel-heading": 1, - "panel-title": 1, - "panel-footer": 1, - "panel-default": 1, - "panel-primary": 1, - "panel-success": 1, - "panel-warning": 1, - "panel-danger": 1, - "panel-info": 1, - "well": 1, - "well-lg": 1, - "well-sm": 1, - "modal-open": 1, - "modal": 1, - "modal-dialog": 1, - "modal-content": 1, - "modal-backdrop": 1, - "modal-header": 1, - "modal-title": 1, - "modal-body": 1, - "modal-footer": 1, - "tooltip": 1, - "top": 1, - "right": 1, - "bottom": 1, - "left": 1, - "tooltip-inner": 1, - "tooltip-arrow": 1, - "popover": 1, - "popover-title": 1, - "popover-content": 1, - "arrow": 1, - "carousel": 1, - "carousel-inner": 1, - "item": 1, - "prev": 1, - "next": 1, - "carousel-control": 1, - "glyphicon-chevron-right": 1, - "icon-next": 1, - "carousel-indicators": 1, - "carousel-caption": 1, - "hide": 1, - "show": 1, - "invisible": 1, - "text-hide": 1, - "affix": 1, - "hidden": 1, - "visible-xs": 1, - "visible-sm": 1, - "visible-md": 1, - "visible-lg": 1, - "hidden-xs": 1, - "hidden-sm": 1, - "hidden-md": 1, - "hidden-lg": 1, - "visible-print": 1, - "hidden-print": 1, -} diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss index 5cf5de9b0..0c4943219 100644 --- a/app/assets/stylesheets/application.css.scss +++ b/app/assets/stylesheets/application.css.scss @@ -30,8 +30,6 @@ // @import 'jquery-ui/resizable'; -// @import 'forem/base'; - @import 'tapas-general'; // @import 'nestable'; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7151b8148..e354f773e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,11 +1,6 @@ class ApplicationController < ActionController::Base helper Openseadragon::OpenseadragonHelper - def forem_user - current_user - end - helper_method :forem_user - # Adds a few additional behaviors into the application controller include Blacklight::Controller @@ -25,7 +20,7 @@ def create_temp_file(file) FileUtils.mkdir_p(tmpdir) tmpfile = Rails.root.join(tmpdir, fname) FileUtils.mv(fpath, tmpfile) - return tmpfile.to_s + tmpfile.to_s end def create_temp_file_from_existing(fedora_file, original_file) @@ -36,7 +31,7 @@ def create_temp_file_from_existing(fedora_file, original_file) FileUtils.mkdir_p(tmpdir) tmpfile = Rails.root.join(tmpdir, fname) FileUtils.cp(fpath, tmpfile) - return tmpfile.to_s + tmpfile.to_s end def pretty_json(status) diff --git a/app/decorators/controllers/forem/application_controller_decorator.rb b/app/decorators/controllers/forem/application_controller_decorator.rb deleted file mode 100644 index eb4527f9e..000000000 --- a/app/decorators/controllers/forem/application_controller_decorator.rb +++ /dev/null @@ -1,6 +0,0 @@ -Forem::ApplicationController.class_eval do - def search_action_url(options = {}) - # Rails 4.2 deprecated url helpers accepting string keys for 'controller' or 'action' - "/catalog" - end -end diff --git a/app/models/solr_document.rb b/app/models/solr_document.rb index 22815a6dc..1ed5f1581 100644 --- a/app/models/solr_document.rb +++ b/app/models/solr_document.rb @@ -42,9 +42,5 @@ def any_public_collections? SolrService.query(query).any? do |collection| collection['drupal_access_ssim'] == ['public'] end - - # ActiveFedora::SolrService.query(query).any? do |collection| - # collection['drupal_access_ssim'] == ['public'] - # end end end diff --git a/app/models/user.rb b/app/models/user.rb index bace79157..99835643f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -66,13 +66,13 @@ def self.find_by_user_key(key) self.send("find_by_nuid".to_sym, key) end - def forem_name - self.name - end - - def forem_email - self.email - end + # def forem_name + # self.name + # end + # + # def forem_email + # self.email + # end def check_paid_status # FIXME: we can't use pluot, as it's too out of date diff --git a/app/views/admin/index.html.haml b/app/views/admin/index.html.haml index 94d51292c..b0339371a 100644 --- a/app/views/admin/index.html.haml +++ b/app/views/admin/index.html.haml @@ -39,11 +39,6 @@ %br =link_to "Send Mail to all Users", mail_users_path, class:['btn', 'btn-primary', 'btn-large'] - -%h3 - = "Forums" --# = link_to "Forum Admin", forem.admin_root_url, class:['btn', 'btn-primary', 'btn-large'] - %h3 = "Resque Workers" = link_to "Resque Dashboard", resque_server_path, class:['btn', 'btn-primary', 'btn-large'] diff --git a/config/initializers/forem.rb b/config/initializers/forem.rb deleted file mode 100644 index ed17b09a8..000000000 --- a/config/initializers/forem.rb +++ /dev/null @@ -1,17 +0,0 @@ -# Forem.user_class = "User" -# Forem.email_from_address = "no-reply@tapas.neu.edu" -# If you do not want to use gravatar for avatars then specify the method to use here: -# Forem.avatar_user_method = :custom_avatar_url -# Forem.per_page = 20 - - -Rails.application.config.to_prepare do -# If you want to change the layout that Forem uses, uncomment and customize the next line: - # Forem::ApplicationController.layout "blacklight" - # Forem.layout = "blacklight" -# -# If you want to add your own cancan Abilities to Forem, uncomment and customize the next line: -# Forem::Ability.register_ability(Ability) -end -# -# By default, these lines will use the layout located at app/views/layouts/forem.html.erb in your application. diff --git a/config/locales/menu.en.yml b/config/locales/menu.en.yml index dbdaf25de..0bfe1f73d 100644 --- a/config/locales/menu.en.yml +++ b/config/locales/menu.en.yml @@ -40,9 +40,6 @@ en: text: "Community" url: "/community" submenu: - forums: - text: "Forums" - url: "/forums" news: text: "News" url: "/news" diff --git a/db/migrate/20170425151605_create_bootsy_images.bootsy.rb b/db/migrate/20170425151605_create_bootsy_images.bootsy.rb deleted file mode 100644 index 01a98afe2..000000000 --- a/db/migrate/20170425151605_create_bootsy_images.bootsy.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from bootsy (originally 20120624171333) -class CreateBootsyImages < ActiveRecord::Migration[5.2] - def change - create_table :bootsy_images do |t| - t.string :image_file - t.references :image_gallery - t.timestamps - end - end -end diff --git a/db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb b/db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb deleted file mode 100644 index 295fb8542..000000000 --- a/db/migrate/20170425151606_create_bootsy_img_galleries.bootsy.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This migration comes from bootsy (originally 20120628124845) -class CreateBootsyImgGalleries < ActiveRecord::Migration[5.2] - def change - create_table :bootsy_img_galleries do |t| - t.references :bootsy_resource, polymorphic: true - t.timestamps - end - end -end diff --git a/db/migrate/20170426173054_create_forem_forums.forem.rb b/db/migrate/20170426173054_create_forem_forums.forem.rb deleted file mode 100644 index 3806facbb..000000000 --- a/db/migrate/20170426173054_create_forem_forums.forem.rb +++ /dev/null @@ -1,14 +0,0 @@ -# This migration comes from forem (originally 20110214221555) -class CreateForemForums < ActiveRecord::Migration[5.2] - def up - create_table :forem_forums do |t| - t.string :title - t.text :description - end - - end - - def down - drop_table :forem_forums - end -end diff --git a/db/migrate/20170426173055_create_forem_topics.forem.rb b/db/migrate/20170426173055_create_forem_topics.forem.rb deleted file mode 100644 index a5687f2ec..000000000 --- a/db/migrate/20170426173055_create_forem_topics.forem.rb +++ /dev/null @@ -1,12 +0,0 @@ -# This migration comes from forem (originally 20110221092741) -class CreateForemTopics < ActiveRecord::Migration[5.2] - def change - create_table :forem_topics do |t| - t.integer :forum_id - t.integer :user_id - t.string :subject - - t.timestamps :null => true - end - end -end diff --git a/db/migrate/20170426173056_create_forem_posts.forem.rb b/db/migrate/20170426173056_create_forem_posts.forem.rb deleted file mode 100644 index b5d5177a7..000000000 --- a/db/migrate/20170426173056_create_forem_posts.forem.rb +++ /dev/null @@ -1,12 +0,0 @@ -# This migration comes from forem (originally 20110221094502) -class CreateForemPosts < ActiveRecord::Migration[5.2] - def change - create_table :forem_posts do |t| - t.integer :topic_id - t.text :text - t.integer :user_id - - t.timestamps :null => true - end - end -end diff --git a/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb b/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb deleted file mode 100644 index 0dc2eb642..000000000 --- a/db/migrate/20170426173057_add_reply_to_to_forem_posts.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20110228084940) -class AddReplyToToForemPosts < ActiveRecord::Migration[5.2] - def change - add_column :forem_posts, :reply_to_id, :integer - end -end diff --git a/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb b/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb deleted file mode 100644 index 18a7243e8..000000000 --- a/db/migrate/20170426173058_add_locked_to_forem_topics.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20110519210300) -class AddLockedToForemTopics < ActiveRecord::Migration[5.2] - def change - add_column :forem_topics, :locked, :boolean, :null => false, :default => false - end -end diff --git a/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb b/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb deleted file mode 100644 index b6907bbdd..000000000 --- a/db/migrate/20170426173059_add_pinned_to_forem_topics.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20110519222000) -class AddPinnedToForemTopics < ActiveRecord::Migration[5.2] - def change - add_column :forem_topics, :pinned, :boolean, :default => false, :nullable => false - end -end diff --git a/db/migrate/20170426173060_add_forem_views.forem.rb b/db/migrate/20170426173060_add_forem_views.forem.rb deleted file mode 100644 index 22ea5efed..000000000 --- a/db/migrate/20170426173060_add_forem_views.forem.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from forem (originally 20110520150056) -class AddForemViews < ActiveRecord::Migration[5.2] - def change - create_table :forem_views do |t| - t.integer :user_id - t.integer :topic_id - t.datetime :created_at - end - end -end diff --git a/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb b/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb deleted file mode 100644 index 3f8615c95..000000000 --- a/db/migrate/20170426173061_add_updated_at_and_count_to_forem_views.forem.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This migration comes from forem (originally 20110626150056) -class AddUpdatedAtAndCountToForemViews < ActiveRecord::Migration[5.2] - def change - add_column :forem_views, :updated_at, :datetime - add_column :forem_views, :count, :integer, :default => 0 - end -end diff --git a/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb b/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb deleted file mode 100644 index 4595c6fce..000000000 --- a/db/migrate/20170426173062_add_hidden_to_forem_topics.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20110626160056) -class AddHiddenToForemTopics < ActiveRecord::Migration[5.2] - def change - add_column :forem_topics, :hidden, :boolean, :default => false - end -end diff --git a/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb b/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb deleted file mode 100644 index dfd126bbc..000000000 --- a/db/migrate/20170426173063_add_indexes_to_topics_posts_views.forem.rb +++ /dev/null @@ -1,13 +0,0 @@ -# This migration comes from forem (originally 20111026143136) -class AddIndexesToTopicsPostsViews < ActiveRecord::Migration[5.2] - def change - add_index :forem_topics, :forum_id - add_index :forem_topics, :user_id - add_index :forem_posts, :topic_id - add_index :forem_posts, :user_id - add_index :forem_posts, :reply_to_id - add_index :forem_views, :user_id - add_index :forem_views, :topic_id - add_index :forem_views, :updated_at - end -end diff --git a/db/migrate/20170426173064_create_forem_categories.forem.rb b/db/migrate/20170426173064_create_forem_categories.forem.rb deleted file mode 100644 index 7e2bf0c1d..000000000 --- a/db/migrate/20170426173064_create_forem_categories.forem.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This migration comes from forem (originally 20111103210835) -class CreateForemCategories < ActiveRecord::Migration[5.2] - def change - create_table :forem_categories do |t| - t.string :name, :null => false - t.timestamps :null => true - end - end -end diff --git a/db/migrate/20170426173065_add_category_id_to_forums.forem.rb b/db/migrate/20170426173065_add_category_id_to_forums.forem.rb deleted file mode 100644 index 5cc5e275c..000000000 --- a/db/migrate/20170426173065_add_category_id_to_forums.forem.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from forem (originally 20111103214432) -class AddCategoryIdToForums < ActiveRecord::Migration[5.2] - def change - add_column :forem_forums, :category_id, :integer - - if Forem::Forum.count > 0 - Forem::Forum.update_all :category_id => Forem::Category.first.id - end - end -end diff --git a/db/migrate/20170426173066_create_forem_subscriptions.forem.rb b/db/migrate/20170426173066_create_forem_subscriptions.forem.rb deleted file mode 100644 index 76d0ac82c..000000000 --- a/db/migrate/20170426173066_create_forem_subscriptions.forem.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This migration comes from forem (originally 20111208014437) -class CreateForemSubscriptions < ActiveRecord::Migration[5.2] - def change - create_table :forem_subscriptions do |t| - t.integer :subscriber_id - t.integer :topic_id - end - end -end diff --git a/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb b/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb deleted file mode 100644 index 03f577f2a..000000000 --- a/db/migrate/20170426173067_add_pending_review_to_forem_posts.forem.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This migration comes from forem (originally 20120221195806) -class AddPendingReviewToForemPosts < ActiveRecord::Migration[5.2] - def change - add_column :forem_posts, :pending_review, :boolean, :default => true - - Forem::Post.reset_column_information - Forem::Post.update_all :pending_review => false - end -end diff --git a/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb b/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb deleted file mode 100644 index e9db0f93c..000000000 --- a/db/migrate/20170426173068_add_pending_review_to_forem_topics.forem.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This migration comes from forem (originally 20120221195807) -class AddPendingReviewToForemTopics < ActiveRecord::Migration[5.2] - def change - add_column :forem_topics, :pending_review, :boolean, :default => true - - Forem::Topic.reset_column_information - Forem::Topic.update_all :pending_review => false - end -end diff --git a/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb b/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb deleted file mode 100644 index 1c2b8a382..000000000 --- a/db/migrate/20170426173069_add_forem_topics_last_post_at.forem.rb +++ /dev/null @@ -1,15 +0,0 @@ -# This migration comes from forem (originally 20120222000227) -class AddForemTopicsLastPostAt < ActiveRecord::Migration[5.2] - def up - add_column :forem_topics, :last_post_at, :datetime - Forem::Topic.reset_column_information - Forem::Topic.includes(:posts).find_each do |t| - post = t.posts.last - t.update_attribute(:last_post_at, post.updated_at) - end - end - - def down - remove_column :forem_topics, :last_post_at - end -end diff --git a/db/migrate/20170426173070_create_forem_groups.forem.rb b/db/migrate/20170426173070_create_forem_groups.forem.rb deleted file mode 100644 index f9009e972..000000000 --- a/db/migrate/20170426173070_create_forem_groups.forem.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from forem (originally 20120222155549) -class CreateForemGroups < ActiveRecord::Migration[5.2] - def change - create_table :forem_groups do |t| - t.string :name - end - - add_index :forem_groups, :name - end -end diff --git a/db/migrate/20170426173071_create_forem_memberships.forem.rb b/db/migrate/20170426173071_create_forem_memberships.forem.rb deleted file mode 100644 index fc607892a..000000000 --- a/db/migrate/20170426173071_create_forem_memberships.forem.rb +++ /dev/null @@ -1,11 +0,0 @@ -# This migration comes from forem (originally 20120222204450) -class CreateForemMemberships < ActiveRecord::Migration[5.2] - def change - create_table :forem_memberships do |t| - t.integer :group_id - t.integer :member_id - end - - add_index :forem_memberships, :group_id - end -end diff --git a/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb b/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb deleted file mode 100644 index fdbfac70a..000000000 --- a/db/migrate/20170426173072_create_forem_moderator_groups.forem.rb +++ /dev/null @@ -1,11 +0,0 @@ -# This migration comes from forem (originally 20120223162058) -class CreateForemModeratorGroups < ActiveRecord::Migration[5.2] - def change - create_table :forem_moderator_groups do |t| - t.integer :forum_id - t.integer :group_id - end - - add_index :forem_moderator_groups, :forum_id - end -end diff --git a/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb b/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb deleted file mode 100644 index 440d914ff..000000000 --- a/db/migrate/20170426173073_remove_pending_review_add_state_to_forem_posts.forem.rb +++ /dev/null @@ -1,17 +0,0 @@ -# This migration comes from forem (originally 20120227195911) -class RemovePendingReviewAddStateToForemPosts < ActiveRecord::Migration[5.2] - def up - remove_column :forem_posts, :pending_review - add_column :forem_posts, :state, :string, :default => 'pending_review' - add_index :forem_posts, :state - end - - def down - remove_index :forem_posts, :state - remove_column :forem_posts, :state - add_column :forem_posts, :pending_review, :boolean, :default => true - - Forem::Post.reset_column_information - Forem::Post.update_all :pending_review => false - end -end diff --git a/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb b/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb deleted file mode 100644 index 0b22a59f1..000000000 --- a/db/migrate/20170426173074_remove_pending_review_from_forem_topics_add_state.forem.rb +++ /dev/null @@ -1,17 +0,0 @@ -# This migration comes from forem (originally 20120227202639) -class RemovePendingReviewFromForemTopicsAddState < ActiveRecord::Migration[5.2] - def up - remove_column :forem_topics, :pending_review - add_column :forem_topics, :state, :string, :default => 'pending_review' - add_index :forem_topics, :state - end - - def down - remove_index :forem_topics, :state - remove_column :forem_topics, :state - add_column :forem_topics, :pending_review, :boolean, :default => true - - Forem::Topic.reset_column_information - Forem::Topic.update_all :pending_review => false - end -end diff --git a/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb b/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb deleted file mode 100644 index f6537fbc3..000000000 --- a/db/migrate/20170426173075_approve_all_topics_and_posts.forem.rb +++ /dev/null @@ -1,11 +0,0 @@ -# This migration comes from forem (originally 20120228194653) -class ApproveAllTopicsAndPosts < ActiveRecord::Migration[5.2] - def up - Forem::Topic.update_all :state => "approved" - Forem::Post.update_all :state => "approved" - end - - def down - end -end - diff --git a/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb b/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb deleted file mode 100644 index e9e5e19e5..000000000 --- a/db/migrate/20170426173076_add_notified_to_forem_posts.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20120228202859) -class AddNotifiedToForemPosts < ActiveRecord::Migration[5.2] - def change - add_column :forem_posts, :notified, :boolean, :default => false - end -end diff --git a/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb b/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb deleted file mode 100644 index c34cff715..000000000 --- a/db/migrate/20170426173077_make_forem_views_polymorphic.forem.rb +++ /dev/null @@ -1,13 +0,0 @@ -# This migration comes from forem (originally 20120229165013) -class MakeForemViewsPolymorphic < ActiveRecord::Migration[5.2] - def up - rename_column :forem_views, :topic_id, :viewable_id - add_column :forem_views, :viewable_type, :string - Forem::View.update_all("viewable_type='Forem::Topic'") - end - - def down - remove_column :forem_views, :viewable_type - rename_column :forem_views, :viewable_id, :topic_id - end -end diff --git a/db/migrate/20170426173078_add_forem_view_fields.forem.rb b/db/migrate/20170426173078_add_forem_view_fields.forem.rb deleted file mode 100644 index ccdff5a55..000000000 --- a/db/migrate/20170426173078_add_forem_view_fields.forem.rb +++ /dev/null @@ -1,24 +0,0 @@ -# This migration comes from forem (originally 20120302152918) -class AddForemViewFields < ActiveRecord::Migration[5.2] - def up - add_column :forem_views, :current_viewed_at, :datetime - add_column :forem_views, :past_viewed_at, :datetime - add_column :forem_topics, :views_count, :integer, :default=>0 - add_column :forem_forums, :views_count, :integer, :default=>0 - - Forem::Topic.find_each do |topic| - topic.update_column(:views_count, topic.views.sum(:count)) - end - - Forem::Forum.find_each do |forum| - forum.update_column(:views_count, forum.topics.sum(:views_count)) - end - end - - def down - remove_column :forem_views, :current_viewed_at - remove_column :forem_views, :past_viewed_at - remove_column :forem_topics, :views_count - remove_column :forem_forums, :views_count - end -end diff --git a/db/migrate/20170426173079_add_forem_admin.forem.rb b/db/migrate/20170426173079_add_forem_admin.forem.rb deleted file mode 100644 index b0beba084..000000000 --- a/db/migrate/20170426173079_add_forem_admin.forem.rb +++ /dev/null @@ -1,12 +0,0 @@ -# This migration comes from forem (originally 20120616193446) -class AddForemAdmin < ActiveRecord::Migration[5.2] - def change - unless column_exists?(user_class, :forem_admin) - add_column user_class, :forem_admin, :boolean, :default => false - end - end - - def user_class - Forem.user_class.table_name.downcase.to_sym - end -end diff --git a/db/migrate/20170426173080_add_forem_state.forem.rb b/db/migrate/20170426173080_add_forem_state.forem.rb deleted file mode 100644 index 5a27e79ef..000000000 --- a/db/migrate/20170426173080_add_forem_state.forem.rb +++ /dev/null @@ -1,12 +0,0 @@ -# This migration comes from forem (originally 20120616193447) -class AddForemState < ActiveRecord::Migration[5.2] - def change - unless column_exists?(user_class, :forem_state) - add_column user_class, :forem_state, :string, :default => 'pending_review' - end - end - - def user_class - Forem.user_class.table_name.downcase.to_sym - end -end diff --git a/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb b/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb deleted file mode 100644 index d788c1a02..000000000 --- a/db/migrate/20170426173081_add_forem_auto_subscribe.forem.rb +++ /dev/null @@ -1,12 +0,0 @@ -# This migration comes from forem (originally 20120616193448) -class AddForemAutoSubscribe < ActiveRecord::Migration[5.2] - def change - unless column_exists?(user_class, :forem_auto_subscribe) - add_column user_class, :forem_auto_subscribe, :boolean, :default => false - end - end - - def user_class - Forem.user_class.table_name.downcase.to_sym - end -end \ No newline at end of file diff --git a/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb b/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb deleted file mode 100644 index 4baa615ad..000000000 --- a/db/migrate/20170426173082_add_friendly_id_slugs.forem.rb +++ /dev/null @@ -1,19 +0,0 @@ -# This migration comes from forem (originally 20120718073130) -class AddFriendlyIdSlugs < ActiveRecord::Migration[5.2] - def change - add_column :forem_forums, :slug, :string - add_index :forem_forums, :slug, :unique => true - Forem::Forum.reset_column_information - Forem::Forum.find_each {|t| t.save! } - - add_column :forem_categories, :slug, :string - add_index :forem_categories, :slug, :unique => true - Forem::Category.reset_column_information - Forem::Category.find_each {|t| t.save! } - - add_column :forem_topics, :slug, :string - add_index :forem_topics, :slug, :unique => true - Forem::Topic.reset_column_information - Forem::Topic.find_each {|t| t.save! } - end -end diff --git a/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb b/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb deleted file mode 100644 index de1768c55..000000000 --- a/db/migrate/20170426173083_rename_title_to_name_on_forem_forums.forem.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This migration comes from forem (originally 20121203093719) -class RenameTitleToNameOnForemForums < ActiveRecord::Migration[5.2] - def up - rename_column :forem_forums, :title, :name - end - - def down - rename_column :forem_forums, :name, :title - end -end diff --git a/db/migrate/20170426173084_add_position_to_categories.forem.rb b/db/migrate/20170426173084_add_position_to_categories.forem.rb deleted file mode 100644 index 78e2edaea..000000000 --- a/db/migrate/20170426173084_add_position_to_categories.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20140917034000) -class AddPositionToCategories < ActiveRecord::Migration[5.2] - def change - add_column :forem_categories, :position, :integer, :default => 0 - end -end diff --git a/db/migrate/20170426173085_add_position_to_forums.forem.rb b/db/migrate/20170426173085_add_position_to_forums.forem.rb deleted file mode 100644 index 1a9dd7967..000000000 --- a/db/migrate/20170426173085_add_position_to_forums.forem.rb +++ /dev/null @@ -1,6 +0,0 @@ -# This migration comes from forem (originally 20140917201619) -class AddPositionToForums < ActiveRecord::Migration[5.2] - def change - add_column :forem_forums, :position, :integer, :default => 0 - end -end diff --git a/db/schema.rb b/db/schema.rb index e9651810a..f5f01fb29 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ ActiveRecord::Schema.define(version: 2020_07_27_210248) do - create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false t.bigint "record_id", null: false @@ -22,7 +22,7 @@ t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true end - create_table "active_storage_blobs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "active_storage_blobs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "key", null: false t.string "filename", null: false t.string "content_type" @@ -33,44 +33,30 @@ t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true end - create_table "bookmarks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "bookmarks", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.integer "user_id", null: false t.string "user_type" t.string "document_id" t.string "title" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "document_type" t.index ["user_id"], name: "index_bookmarks_on_user_id" end - create_table "bootsy_image_galleries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "bootsy_resource_id" - t.string "bootsy_resource_type" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "bootsy_images", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "image_file" - t.integer "image_gallery_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "captions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "captions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "active_storage_attachment_id" t.index ["active_storage_attachment_id"], name: "index_captions_on_active_storage_attachment_id" end - create_table "collection_collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "collection_collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "collection_id" t.integer "parent_collection_id", null: false t.index ["collection_id", "parent_collection_id"], name: "index_collections_parent", unique: true t.index ["collection_id"], name: "index_collection_collections_on_collection_id" end - create_table "collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "title", null: false t.text "description" t.datetime "created_at", null: false @@ -83,7 +69,7 @@ t.index ["discarded_at"], name: "index_collections_on_discarded_at" end - create_table "collections_core_files", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "collections_core_files", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "core_file_id" t.bigint "collection_id" t.index ["collection_id", "core_file_id"], name: "index_collections_core_files_on_collection_id_and_core_file_id", unique: true @@ -91,7 +77,7 @@ t.index ["core_file_id"], name: "index_collections_core_files_on_core_file_id" end - create_table "communities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "communities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "title", null: false t.text "description" t.datetime "created_at", null: false @@ -103,14 +89,14 @@ t.index ["discarded_at"], name: "index_communities_on_discarded_at" end - create_table "communities_institutions", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "communities_institutions", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "community_id", null: false t.bigint "institution_id", null: false t.index ["community_id", "institution_id"], name: "index_communities_instutitions", unique: true t.index ["institution_id", "community_id"], name: "index_institutions_communities", unique: true end - create_table "community_collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "community_collections", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "collection_id" t.bigint "community_id" t.index ["collection_id", "community_id"], name: "index_community_collections_on_collection_id_and_community_id", unique: true @@ -118,14 +104,14 @@ t.index ["community_id"], name: "index_community_collections_on_community_id" end - create_table "community_communities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "community_communities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "community_id" t.integer "parent_community_id", null: false t.index ["community_id", "parent_community_id"], name: "index_community_parent", unique: true t.index ["community_id"], name: "index_community_communities_on_community_id" end - create_table "community_members", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "community_members", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "community_id" t.bigint "user_id" t.string "member_type", limit: 6, default: "member" @@ -134,7 +120,7 @@ t.index ["user_id"], name: "index_community_members_on_user_id" end - create_table "core_files", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "core_files", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "title", null: false t.text "description" t.datetime "created_at", null: false @@ -146,7 +132,7 @@ t.index ["discarded_at"], name: "index_core_files_on_discarded_at" end - create_table "core_files_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t| + create_table "core_files_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "core_file_id", null: false t.string "user_type", limit: 11, default: "contributor", null: false @@ -154,96 +140,7 @@ t.index ["user_id", "core_file_id"], name: "index_core_files_users_on_user_id_and_core_file_id", unique: true end - create_table "forem_categories", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "name", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "slug" - t.integer "position", default: 0 - t.index ["slug"], name: "index_forem_categories_on_slug", unique: true - end - - create_table "forem_forums", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "name" - t.text "description" - t.integer "category_id" - t.integer "views_count", default: 0 - t.string "slug" - t.integer "position", default: 0 - t.index ["slug"], name: "index_forem_forums_on_slug", unique: true - end - - create_table "forem_groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.string "name" - t.index ["name"], name: "index_forem_groups_on_name" - end - - create_table "forem_memberships", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "group_id" - t.integer "member_id" - t.index ["group_id"], name: "index_forem_memberships_on_group_id" - end - - create_table "forem_moderator_groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "forum_id" - t.integer "group_id" - t.index ["forum_id"], name: "index_forem_moderator_groups_on_forum_id" - end - - create_table "forem_posts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "topic_id" - t.text "text" - t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "reply_to_id" - t.string "state", default: "pending_review" - t.boolean "notified", default: false - t.index ["reply_to_id"], name: "index_forem_posts_on_reply_to_id" - t.index ["state"], name: "index_forem_posts_on_state" - t.index ["topic_id"], name: "index_forem_posts_on_topic_id" - t.index ["user_id"], name: "index_forem_posts_on_user_id" - end - - create_table "forem_subscriptions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "subscriber_id" - t.integer "topic_id" - end - - create_table "forem_topics", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "forum_id" - t.integer "user_id" - t.string "subject" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "locked", default: false, null: false - t.boolean "pinned", default: false - t.boolean "hidden", default: false - t.datetime "last_post_at" - t.string "state", default: "pending_review" - t.integer "views_count", default: 0 - t.string "slug" - t.index ["forum_id"], name: "index_forem_topics_on_forum_id" - t.index ["slug"], name: "index_forem_topics_on_slug", unique: true - t.index ["state"], name: "index_forem_topics_on_state" - t.index ["user_id"], name: "index_forem_topics_on_user_id" - end - - create_table "forem_views", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.integer "user_id" - t.integer "viewable_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "count", default: 0 - t.string "viewable_type" - t.datetime "current_viewed_at" - t.datetime "past_viewed_at" - t.index ["updated_at"], name: "index_forem_views_on_updated_at" - t.index ["user_id"], name: "index_forem_views_on_user_id" - t.index ["viewable_id"], name: "index_forem_views_on_viewable_id" - end - - create_table "friendly_id_slugs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "friendly_id_slugs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "slug", null: false t.integer "sluggable_id", null: false t.string "sluggable_type", limit: 50 @@ -255,7 +152,7 @@ t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type" end - create_table "institutions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "institutions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name", null: false t.text "description" t.string "image" @@ -263,52 +160,52 @@ t.string "latitude" t.string "longitude" t.string "url" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - create_table "menu_links", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "menu_links", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "link_text", null: false t.string "link_href", null: false t.string "classes" t.integer "link_order" t.integer "parent_link_id" t.string "menu_name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - create_table "news_items", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "news_items", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "author" t.string "publish" t.string "title", null: false t.string "slug", null: false t.text "content" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "tags" end - create_table "pages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "pages", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "title", null: false t.string "slug", null: false t.text "content" t.string "publish" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "submenu" end - create_table "searches", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| - t.text "query_params", collation: "utf8_general_ci" + create_table "searches", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| + t.text "query_params" t.integer "user_id" - t.string "user_type", collation: "utf8_general_ci" - t.datetime "created_at" - t.datetime "updated_at" + t.string "user_type" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["user_id"], name: "index_searches_on_user_id" end - create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" @@ -319,15 +216,12 @@ t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.boolean "guest", default: false t.string "encrypted_api_key" - t.boolean "forem_admin", default: false - t.string "forem_state", default: "pending_review" - t.boolean "forem_auto_subscribe", default: false t.string "name" - t.integer "institution_id" + t.bigint "institution_id" t.string "avatar" t.text "bio" t.string "confirmation_token" @@ -356,7 +250,7 @@ t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end - create_table "view_packages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t| + create_table "view_packages", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "human_name" t.string "machine_name" t.text "description" @@ -365,8 +259,8 @@ t.text "js_files" t.text "parameters" t.text "run_process" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "dir_name" t.datetime "git_timestamp" t.string "git_branch" From f1a9427aa3c0e562b2072560d4bd886b381f9df8 Mon Sep 17 00:00:00 2001 From: candyhazlett Date: Fri, 31 Mar 2023 17:27:13 -0400 Subject: [PATCH 9/9] removes more hydra active fedora files I missed, extra assets files, extra routes, and updates config files, plus fiddles with js compile via sprockets --- .gitignore | 2 + Gemfile | 11 +- Gemfile.lock | 10 +- config/environments/development.rb | 6 +- config/environments/production.rb | 2 +- config/initializers/hydra_config.rb | 22 - config/routes.rb | 6 - node_modules/.yarn-integrity | 10 + ...fest-012bf6910f8d93798c4ac9ba297e7161.json | 1 + ...8c1c4fa7d61282a24f3c1840100cf350f2fe5e.css | 8617 ++++ ...c4fa7d61282a24f3c1840100cf350f2fe5e.css.gz | Bin 0 -> 35203 bytes ...1d828d6ed094460019723a85d51805ecd75a2b3.js | 34091 ++++++++++++++++ ...28d6ed094460019723a85d51805ecd75a2b3.js.gz | Bin 0 -> 237131 bytes ...1724d183a39ad072e73e1b3d8cbf646d2d0407.eot | Bin 0 -> 20127 bytes ...4d183a39ad072e73e1b3d8cbf646d2d0407.eot.gz | Bin 0 -> 20056 bytes ...bcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg | 288 + ...b56bd4a53af4d83d316d6dd7a36903c43e5.svg.gz | Bin 0 -> 26508 bytes ...8596275a9839b959c226e15439557a5a80742.woff | Bin 0 -> 23424 bytes ...d06a1ea9361bdcf0b442d06a18a8051af57456.ttf | Bin 0 -> 45404 bytes ...a1ea9361bdcf0b442d06a18a8051af57456.ttf.gz | Bin 0 -> 23360 bytes ...a0cda5a44c4039214094e7957b4c040ef11c.woff2 | Bin 0 -> 18028 bytes ...7a885d06d64efe5b5b18a351641ad5506b53b1.ico | Bin 0 -> 5900 bytes ...85d06d64efe5b5b18a351641ad5506b53b1.ico.gz | Bin 0 -> 5575 bytes ...5f3f278c9dad531951b680114733089f369794.png | Bin 0 -> 27048 bytes ...caeecd1ebae9fc43cf0ab98ebcfe554368814c.png | Bin 0 -> 9746 bytes ...535fa2a25548cefb7d1a2de625b59f31853cb6.png | Bin 0 -> 1506 bytes ...a79f78fc06fdfa814710dedb7021a7d6206fde.png | Bin 0 -> 1827 bytes ...2cd053ce3199bfd2c9e1660f2c7cdc60d0be11.png | Bin 0 -> 1895 bytes ...1ba81800de423a16da8c7f348c19ae8924d142.png | Bin 0 -> 1066 bytes ...fd61972b98738874d995e077091344f59fc26b.png | Bin 0 -> 1085 bytes ...605301b4da04c034981af70ec0ec3e1bb509a8.png | Bin 0 -> 2184 bytes ...e280b1da93fd43360f721642b42229b9e5e817.png | Bin 0 -> 2225 bytes ...2b93c7f05d2d5e0fdf97b8b8e957e5476ff586.png | Bin 0 -> 1309 bytes ...f071cf51a96712ddac54b803a8fee917ce27d8.png | Bin 0 -> 1062 bytes ...a4ccb3ebbf883329c44473cd247d0f22c320d9.png | Bin 0 -> 2091 bytes ...08956ae031b09d85533adf83e094c5b187833c.png | Bin 0 -> 2138 bytes ...43e9bb3bd14b84959973d61a622bbb4777dfc9.png | Bin 0 -> 1258 bytes ...a276fd079f50ec0df2b03b04bfc36cfc217103.png | Bin 0 -> 1918 bytes ...1fd447a86c46b65e67ce182632cb518dfd2bb9.png | Bin 0 -> 2358 bytes ...b98ea09d6b0be41cce42ed512239cede37a1ab.png | Bin 0 -> 2411 bytes ...27152c1b7528811582c68b7b4bf25b8673fe07.png | Bin 0 -> 2027 bytes ...3758d7d33eab41a69093d9c1101c164c07fe8b.png | Bin 0 -> 1933 bytes ...58b20744a7251786746d7508624db5b4c81bce.png | Bin 0 -> 2361 bytes ...9f1723fcd13077870337874171e99dee9f9929.png | Bin 0 -> 2413 bytes ...caea0e3850478d1f869e2e7a73b7dc363ca2e2.png | Bin 0 -> 2029 bytes ...8403824df252fa6835aa586301b19c80c264e3.png | Bin 0 -> 1731 bytes ...4f87671c089db4863f933989b10263818cf435.png | Bin 0 -> 2094 bytes ...4dc5ee6dba6d7fed433e3a910dcda69ca4a977.png | Bin 0 -> 2036 bytes ...9e8117ce58506177dc438cc00cdf837f513f09.png | Bin 0 -> 1779 bytes ...54790c0decd8dea5bd115f7d6d0d2bf04c5e00.png | Bin 0 -> 1800 bytes ...c57997174652f480f3002d45beaf918b1230c1.png | Bin 0 -> 2158 bytes ...6572d1440df9f31c424ef4a6be62f3a45d472b.png | Bin 0 -> 2039 bytes ...3e42fc40035d2070eec9ce1261c8b7bc126526.png | Bin 0 -> 1812 bytes ...f02c691a201c21d74bbad5f3d9336463b52604.png | Bin 0 -> 1060 bytes ...6e49e7da4b219981c9929abf89fbd1a18b58a2.png | Bin 0 -> 2116 bytes ...4a6aa24311bcba0d836dc6ebded4c5d7146475.png | Bin 0 -> 2159 bytes ...f912fe7069105ab68980f69674ff5c25521ed9.png | Bin 0 -> 1262 bytes ...728814d3b7332b14748054ae460aa9be929e77.png | Bin 0 -> 977 bytes ...9e86577339ffa280b6a51621388f2cad9900e1.png | Bin 0 -> 1926 bytes ...b350bfd80c603cbb6a4b0af705fbcdf8ca57dc.png | Bin 0 -> 1997 bytes ...cc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa.png | Bin 0 -> 1153 bytes ...a551d8efb411b13be8d04c1afd4d9210a75b92.png | Bin 0 -> 21567 bytes vendor/assets/javascripts/forem.js.coffee | 3 - vendor/assets/stylesheets/forem.css.scss | 0 yarn.lock | 4 + 65 files changed, 43030 insertions(+), 43 deletions(-) delete mode 100644 config/initializers/hydra_config.rb create mode 100644 node_modules/.yarn-integrity create mode 100644 public/assets/.sprockets-manifest-012bf6910f8d93798c4ac9ba297e7161.json create mode 100644 public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css create mode 100644 public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css.gz create mode 100644 public/assets/application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js create mode 100644 public/assets/application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js.gz create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot.gz create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg.gz create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf.gz create mode 100644 public/assets/bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2 create mode 100644 public/assets/favicon-431b0dcc5a0e56bb22a8c13c087a885d06d64efe5b5b18a351641ad5506b53b1.ico create mode 100644 public/assets/favicon-431b0dcc5a0e56bb22a8c13c087a885d06d64efe5b5b18a351641ad5506b53b1.ico.gz create mode 100644 public/assets/logo-0e6b1f8122c86e81273620122a5f3f278c9dad531951b680114733089f369794.png create mode 100644 public/assets/logo_no_text-61c44db96a24f085a489d42b71caeecd1ebae9fc43cf0ab98ebcfe554368814c.png create mode 100644 public/assets/openseadragon/button_grouphover-2e64df18c27b1a51955c47cbe7535fa2a25548cefb7d1a2de625b59f31853cb6.png create mode 100644 public/assets/openseadragon/button_hover-b1086485b0d055d468a729f5a6a79f78fc06fdfa814710dedb7021a7d6206fde.png create mode 100644 public/assets/openseadragon/button_pressed-01f1c05bdee216ec417e3475552cd053ce3199bfd2c9e1660f2c7cdc60d0be11.png create mode 100644 public/assets/openseadragon/button_rest-5c693c3b03e6efc5c491ab2e8e1ba81800de423a16da8c7f348c19ae8924d142.png create mode 100644 public/assets/openseadragon/fullpage_grouphover-f96415fcf86eff56b664f2328ffd61972b98738874d995e077091344f59fc26b.png create mode 100644 public/assets/openseadragon/fullpage_hover-3cc954037484edb4a74d97a374605301b4da04c034981af70ec0ec3e1bb509a8.png create mode 100644 public/assets/openseadragon/fullpage_pressed-7b3d188695ec59993a09cf27dde280b1da93fd43360f721642b42229b9e5e817.png create mode 100644 public/assets/openseadragon/fullpage_rest-1b7ae93b3fe5d0df99e196bfe22b93c7f05d2d5e0fdf97b8b8e957e5476ff586.png create mode 100644 public/assets/openseadragon/home_grouphover-2f2dfd6ed6fd11c1aec5491c36f071cf51a96712ddac54b803a8fee917ce27d8.png create mode 100644 public/assets/openseadragon/home_hover-170fc906037fe8707d3757775ea4ccb3ebbf883329c44473cd247d0f22c320d9.png create mode 100644 public/assets/openseadragon/home_pressed-e8a08eb8d9862e63c8df96fbe508956ae031b09d85533adf83e094c5b187833c.png create mode 100644 public/assets/openseadragon/home_rest-6fd27483f507bf8b4a15d6c60d43e9bb3bd14b84959973d61a622bbb4777dfc9.png create mode 100644 public/assets/openseadragon/next_grouphover-e7c76fb2c8a792a63efe2ad76da276fd079f50ec0df2b03b04bfc36cfc217103.png create mode 100644 public/assets/openseadragon/next_hover-67210c1194693f480cfe9935281fd447a86c46b65e67ce182632cb518dfd2bb9.png create mode 100644 public/assets/openseadragon/next_pressed-95afb05783b4c599eec66a21a2b98ea09d6b0be41cce42ed512239cede37a1ab.png create mode 100644 public/assets/openseadragon/next_rest-d9b1965f3bcddd3db23e63037a27152c1b7528811582c68b7b4bf25b8673fe07.png create mode 100644 public/assets/openseadragon/previous_grouphover-c7e82a94049ff615a7dc6f78ae3758d7d33eab41a69093d9c1101c164c07fe8b.png create mode 100644 public/assets/openseadragon/previous_hover-94126f0047e7901b3d2e408abb58b20744a7251786746d7508624db5b4c81bce.png create mode 100644 public/assets/openseadragon/previous_pressed-b80145c436ff5cd94c3f672eed9f1723fcd13077870337874171e99dee9f9929.png create mode 100644 public/assets/openseadragon/previous_rest-56999fcbe41a0ebb5d701fb463caea0e3850478d1f869e2e7a73b7dc363ca2e2.png create mode 100644 public/assets/openseadragon/rotateleft_grouphover-35d3cf9efe958bd88ae0c532648403824df252fa6835aa586301b19c80c264e3.png create mode 100644 public/assets/openseadragon/rotateleft_hover-59fee051c2aff4c8491255be664f87671c089db4863f933989b10263818cf435.png create mode 100644 public/assets/openseadragon/rotateleft_pressed-97d28095eb471109d0aee65f9f4dc5ee6dba6d7fed433e3a910dcda69ca4a977.png create mode 100644 public/assets/openseadragon/rotateleft_rest-ab4731e3c7d7a4b40ea07c16269e8117ce58506177dc438cc00cdf837f513f09.png create mode 100644 public/assets/openseadragon/rotateright_grouphover-ebdaf54f82601db210a5ac2e0a54790c0decd8dea5bd115f7d6d0d2bf04c5e00.png create mode 100644 public/assets/openseadragon/rotateright_hover-a9124016ebe30ec16f3691a16cc57997174652f480f3002d45beaf918b1230c1.png create mode 100644 public/assets/openseadragon/rotateright_pressed-a75e74dab723a0587d365e4b076572d1440df9f31c424ef4a6be62f3a45d472b.png create mode 100644 public/assets/openseadragon/rotateright_rest-c201ce35f6651e824eee3eb5ca3e42fc40035d2070eec9ce1261c8b7bc126526.png create mode 100644 public/assets/openseadragon/zoomin_grouphover-ecd40589890cdfd81911752c4af02c691a201c21d74bbad5f3d9336463b52604.png create mode 100644 public/assets/openseadragon/zoomin_hover-6a2c08cf07b12162f73e80417d6e49e7da4b219981c9929abf89fbd1a18b58a2.png create mode 100644 public/assets/openseadragon/zoomin_pressed-b9eb902ca333aaabd8cf77c1184a6aa24311bcba0d836dc6ebded4c5d7146475.png create mode 100644 public/assets/openseadragon/zoomin_rest-674258f78d924bfe2454a637ecf912fe7069105ab68980f69674ff5c25521ed9.png create mode 100644 public/assets/openseadragon/zoomout_grouphover-b582631f7ede7c640c46a29d74728814d3b7332b14748054ae460aa9be929e77.png create mode 100644 public/assets/openseadragon/zoomout_hover-b752facaf76d197e235dd789929e86577339ffa280b6a51621388f2cad9900e1.png create mode 100644 public/assets/openseadragon/zoomout_pressed-99ce17d25e10d07ebe3a21642eb350bfd80c603cbb6a4b0af705fbcdf8ca57dc.png create mode 100644 public/assets/openseadragon/zoomout_rest-a4ff50ab46d8de87c720cb9cbccc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa.png create mode 100644 public/assets/tapaslogo-opaque-4e173fb972554829fc5040f6b0a551d8efb411b13be8d04c1afd4d9210a75b92.png delete mode 100644 vendor/assets/javascripts/forem.js.coffee delete mode 100644 vendor/assets/stylesheets/forem.css.scss create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 1bf7e637f..34be274e5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,8 @@ bundlelist-03282023.txt gemlist-03282023.txt mysql-init saxon-js-compilation.md +rails-about.txt +notes.txt .env # Ruby Mine stuff .idea/ diff --git a/Gemfile b/Gemfile index e1588d945..3ddc46e49 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,8 @@ gem 'rails', '5.2.6' # Use rubyzip to handle Zipped content files from Drupal gem 'rubyzip' +gem 'sprockets-rails', :require => 'sprockets/railtie' + # Use passenger as the application server gem 'passenger', '6.0.4' @@ -48,12 +50,6 @@ gem 'nest' gem 'discard', '~> 1.2' -# Use thor for command line tasks -# gem 'thor', '1.0.1' - -# Install thor-rails to write thor tasks that are rails env aware -# gem 'thor-rails' - # Use Namae to try to parse arbitrary names gem 'namae' @@ -121,5 +117,6 @@ gem 'simple_form' gem 'openseadragon' gem "haml-rails", "~> 2.0" -gem 'sprockets', '~> 3.7.2' gem 'carrierwave', '~> 1.3.1' +# Use CoffeeScript for .js.coffee assets and views +gem 'coffee-rails', '~> 5.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index 6aa309011..f8b1b033b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -101,6 +101,13 @@ GEM activesupport (>= 4.0.0) mime-types (>= 1.16) coderay (1.1.2) + coffee-rails (5.0.0) + coffee-script (>= 2.2.0) + railties (>= 5.2.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) concurrent-ruby (1.2.2) config (2.2.1) deep_merge (~> 1.2, >= 1.2.1) @@ -481,6 +488,7 @@ DEPENDENCIES capistrano-resque (~> 0.2.2) capistrano-rvm carrierwave (~> 1.3.1) + coffee-rails (~> 5.0.0) devise devise-guests (~> 0.3) devise_invitable (~> 2.0.0) @@ -517,7 +525,7 @@ DEPENDENCIES simplecov simplecov-json simplecov-rcov - sprockets (~> 3.7.2) + sprockets-rails therubyracer turbolinks uglifier (>= 1.3.0) diff --git a/config/environments/development.rb b/config/environments/development.rb index f1c0e55d1..c14d63e51 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -14,7 +14,7 @@ config.log_level = :debug - config.fedora_home = "#{Rails.root.to_s}/jetty/fedora/default/data/datastreamStore/" + # config.fedora_home = "#{Rails.root.to_s}/jetty/fedora/default/data/datastreamStore/" # Show full error reports and disable caching. config.consider_all_requests_local = true @@ -35,12 +35,12 @@ # Raise an error on page load if there are pending migrations config.active_record.migration_error = :page_load - config.active_storage.service = :amazon + # config.active_storage.service = :amazon # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. - config.assets.debug = true + # config.assets.debug = true config.assets.compress = false # Parse ~/.gitconfig in an attempt to load the email address of the currently diff --git a/config/environments/production.rb b/config/environments/production.rb index 1b56eb346..76c8725c9 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -13,7 +13,7 @@ # Rake tasks automatically ignore this option for performance. config.eager_load = true - config.fedora_home = "/opt/fedora/data/datastreamStore/" + # config.fedora_home = "/opt/fedora/data/datastreamStore/" # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false diff --git a/config/initializers/hydra_config.rb b/config/initializers/hydra_config.rb deleted file mode 100644 index 28ba2fb9b..000000000 --- a/config/initializers/hydra_config.rb +++ /dev/null @@ -1,22 +0,0 @@ -# windows doesn't properly require hydra-head (from the gemfile), so we need to require it explicitly here: -#require 'hydra/head' unless defined? Hydra - -# Hydra.configure do |config| - # This specifies the solr field names of permissions-related fields. - # You only need to change these values if you've indexed permissions by some means other than the Hydra's built-in tooling. - # If you change these, you must also update the permissions request handler in your solrconfig.xml to return those values - # - # config.permissions.discover.group = ActiveFedora::SolrService.solr_name("discover_access_group", :symbol) - # config.permissions.discover.individual = ActiveFedora::SolrService.solr_name("discover_access_person", :symbol) - # config.permissions.read.group = ActiveFedora::SolrService.solr_name("read_access_group", :symbol) - # config.permissions.read.individual = ActiveFedora::SolrService.solr_name("read_access_person", :symbol) - # config.permissions.edit.group = ActiveFedora::SolrService.solr_name("edit_access_group", :symbol) - # config.permissions.edit.individual = ActiveFedora::SolrService.solr_name("edit_access_person", :symbol) - # - # config.permissions.embargo.release_date = ActiveFedora::SolrService.solr_name("embargo_release_date", :stored_sortable, type: :date) - # config.permissions.lease.expiration_date = ActiveFedora::SolrService.solr_name("lease_expiration_date", :stored_sortable, type: :date) - # - # - # specify the user model - # config.user_model = '#{model_name.classify}' -#end diff --git a/config/routes.rb b/config/routes.rb index cb1831ced..2726161b8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -96,10 +96,8 @@ # Example of named route that can be invoked with purchase_url(id: product.id) # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase - # Example resource route (maps HTTP verbs to controller actions automatically): # resources :products - # Example resource route with options: # resources :products do # member do @@ -111,13 +109,11 @@ # get 'sold' # end # end - # Example resource route with sub-resources: # resources :products do # resources :comments, :sales # resource :seller # end - # Example resource route with more complex sub-resources: # resources :products do # resources :comments @@ -125,14 +121,12 @@ # get 'recent', on: :collection # end # end - # Example resource route with concerns: # concern :toggleable do # post 'toggle' # end # resources :posts, concerns: :toggleable # resources :photos, concerns: :toggleable - # Example resource route within a namespace: # namespace :admin do # # Directs /admin/products/* to Admin::ProductsController diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 000000000..1db5abbae --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "darwin-x64-93", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/public/assets/.sprockets-manifest-012bf6910f8d93798c4ac9ba297e7161.json b/public/assets/.sprockets-manifest-012bf6910f8d93798c4ac9ba297e7161.json new file mode 100644 index 000000000..49e2d6331 --- /dev/null +++ b/public/assets/.sprockets-manifest-012bf6910f8d93798c4ac9ba297e7161.json @@ -0,0 +1 @@ +{"files":{"favicon-431b0dcc5a0e56bb22a8c13c087a885d06d64efe5b5b18a351641ad5506b53b1.ico":{"logical_path":"favicon.ico","mtime":"2021-08-06T11:53:55-04:00","size":5900,"digest":"431b0dcc5a0e56bb22a8c13c087a885d06d64efe5b5b18a351641ad5506b53b1","integrity":"sha256-QxsNzFoOVrsiqME8CHqIXQbWTv5bWxijUWQa1VBrU7E="},"logo-0e6b1f8122c86e81273620122a5f3f278c9dad531951b680114733089f369794.png":{"logical_path":"logo.png","mtime":"2021-08-06T11:53:55-04:00","size":27048,"digest":"0e6b1f8122c86e81273620122a5f3f278c9dad531951b680114733089f369794","integrity":"sha256-DmsfgSLIboEnNiASKl8/J4ydrVMZUbaAEUczCJ82l5Q="},"logo_no_text-61c44db96a24f085a489d42b71caeecd1ebae9fc43cf0ab98ebcfe554368814c.png":{"logical_path":"logo_no_text.png","mtime":"2021-08-06T11:53:55-04:00","size":9746,"digest":"61c44db96a24f085a489d42b71caeecd1ebae9fc43cf0ab98ebcfe554368814c","integrity":"sha256-YcRNuWok8IWkidQrccruzR666fxDzwq5jrz+VUNogUw="},"tapaslogo-opaque-4e173fb972554829fc5040f6b0a551d8efb411b13be8d04c1afd4d9210a75b92.png":{"logical_path":"tapaslogo-opaque.png","mtime":"2021-08-06T11:53:55-04:00","size":21567,"digest":"4e173fb972554829fc5040f6b0a551d8efb411b13be8d04c1afd4d9210a75b92","integrity":"sha256-Thc/uXJVSCn8UED2sKVR2O+0EbE76NBMGv1NkhCnW5I="},"application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js":{"logical_path":"application.js","mtime":"2023-03-31T12:54:09-04:00","size":942540,"digest":"74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3","integrity":"sha256-dOGKnXyuY30bRDa/Mdgo1u0JRGABlyOoXVGAXs11orM="},"application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css":{"logical_path":"application.css","mtime":"2023-03-31T11:39:49-04:00","size":224444,"digest":"6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e","integrity":"sha256-bUkWD6oTd7yedwf2kYwcT6fWEoKiTzwYQBAM81Dy/l4="},"openseadragon/button_grouphover-2e64df18c27b1a51955c47cbe7535fa2a25548cefb7d1a2de625b59f31853cb6.png":{"logical_path":"openseadragon/button_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1506,"digest":"2e64df18c27b1a51955c47cbe7535fa2a25548cefb7d1a2de625b59f31853cb6","integrity":"sha256-LmTfGMJ7GlGVXEfL51NfoqJVSM77fRot5iW1nzGFPLY="},"openseadragon/button_hover-b1086485b0d055d468a729f5a6a79f78fc06fdfa814710dedb7021a7d6206fde.png":{"logical_path":"openseadragon/button_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":1827,"digest":"b1086485b0d055d468a729f5a6a79f78fc06fdfa814710dedb7021a7d6206fde","integrity":"sha256-sQhkhbDQVdRopyn1pqefePwG/fqBRxDe23Ahp9Ygb94="},"openseadragon/button_pressed-01f1c05bdee216ec417e3475552cd053ce3199bfd2c9e1660f2c7cdc60d0be11.png":{"logical_path":"openseadragon/button_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":1895,"digest":"01f1c05bdee216ec417e3475552cd053ce3199bfd2c9e1660f2c7cdc60d0be11","integrity":"sha256-AfHAW97iFuxBfjR1VSzQU84xmb/SyeFmDyx83GDQvhE="},"openseadragon/button_rest-5c693c3b03e6efc5c491ab2e8e1ba81800de423a16da8c7f348c19ae8924d142.png":{"logical_path":"openseadragon/button_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1066,"digest":"5c693c3b03e6efc5c491ab2e8e1ba81800de423a16da8c7f348c19ae8924d142","integrity":"sha256-XGk8OwPm78XEkasujhuoGADeQjoW2ox/NIwZrokk0UI="},"openseadragon/fullpage_grouphover-f96415fcf86eff56b664f2328ffd61972b98738874d995e077091344f59fc26b.png":{"logical_path":"openseadragon/fullpage_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1085,"digest":"f96415fcf86eff56b664f2328ffd61972b98738874d995e077091344f59fc26b","integrity":"sha256-+WQV/Phu/1a2ZPIyj/1hlyuYc4h02ZXgdwkTRPWfwms="},"openseadragon/fullpage_hover-3cc954037484edb4a74d97a374605301b4da04c034981af70ec0ec3e1bb509a8.png":{"logical_path":"openseadragon/fullpage_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2184,"digest":"3cc954037484edb4a74d97a374605301b4da04c034981af70ec0ec3e1bb509a8","integrity":"sha256-PMlUA3SE7bSnTZejdGBTAbTaBMA0mBr3DsDsPhu1Cag="},"openseadragon/fullpage_pressed-7b3d188695ec59993a09cf27dde280b1da93fd43360f721642b42229b9e5e817.png":{"logical_path":"openseadragon/fullpage_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2225,"digest":"7b3d188695ec59993a09cf27dde280b1da93fd43360f721642b42229b9e5e817","integrity":"sha256-ez0YhpXsWZk6Cc8n3eKAsdqT/UM2D3IWQrQiKbnl6Bc="},"openseadragon/fullpage_rest-1b7ae93b3fe5d0df99e196bfe22b93c7f05d2d5e0fdf97b8b8e957e5476ff586.png":{"logical_path":"openseadragon/fullpage_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1309,"digest":"1b7ae93b3fe5d0df99e196bfe22b93c7f05d2d5e0fdf97b8b8e957e5476ff586","integrity":"sha256-G3rpOz/l0N+Z4Za/4iuTx/BdLV4P35e4uOlX5Udv9YY="},"openseadragon/home_grouphover-2f2dfd6ed6fd11c1aec5491c36f071cf51a96712ddac54b803a8fee917ce27d8.png":{"logical_path":"openseadragon/home_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1062,"digest":"2f2dfd6ed6fd11c1aec5491c36f071cf51a96712ddac54b803a8fee917ce27d8","integrity":"sha256-Ly39btb9EcGuxUkcNvBxz1GpZxLdrFS4A6j+6RfOJ9g="},"openseadragon/home_hover-170fc906037fe8707d3757775ea4ccb3ebbf883329c44473cd247d0f22c320d9.png":{"logical_path":"openseadragon/home_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2091,"digest":"170fc906037fe8707d3757775ea4ccb3ebbf883329c44473cd247d0f22c320d9","integrity":"sha256-Fw/JBgN/6HB9N1d3XqTMs+u/iDMpxERzzSR9DyLDINk="},"openseadragon/home_pressed-e8a08eb8d9862e63c8df96fbe508956ae031b09d85533adf83e094c5b187833c.png":{"logical_path":"openseadragon/home_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2138,"digest":"e8a08eb8d9862e63c8df96fbe508956ae031b09d85533adf83e094c5b187833c","integrity":"sha256-6KCOuNmGLmPI35b75QiVauAxsJ2FUzrfg+CUxbGHgzw="},"openseadragon/home_rest-6fd27483f507bf8b4a15d6c60d43e9bb3bd14b84959973d61a622bbb4777dfc9.png":{"logical_path":"openseadragon/home_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1258,"digest":"6fd27483f507bf8b4a15d6c60d43e9bb3bd14b84959973d61a622bbb4777dfc9","integrity":"sha256-b9J0g/UHv4tKFdbGDUPpuzvRS4SVmXPWGmIru0d338k="},"openseadragon/next_grouphover-e7c76fb2c8a792a63efe2ad76da276fd079f50ec0df2b03b04bfc36cfc217103.png":{"logical_path":"openseadragon/next_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1918,"digest":"e7c76fb2c8a792a63efe2ad76da276fd079f50ec0df2b03b04bfc36cfc217103","integrity":"sha256-58dvssinkqY+/irXbaJ2/QefUOwN8rA7BL/DbPwhcQM="},"openseadragon/next_hover-67210c1194693f480cfe9935281fd447a86c46b65e67ce182632cb518dfd2bb9.png":{"logical_path":"openseadragon/next_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2358,"digest":"67210c1194693f480cfe9935281fd447a86c46b65e67ce182632cb518dfd2bb9","integrity":"sha256-ZyEMEZRpP0gM/pk1KB/UR6hsRrZeZ84YJjLLUY39K7k="},"openseadragon/next_pressed-95afb05783b4c599eec66a21a2b98ea09d6b0be41cce42ed512239cede37a1ab.png":{"logical_path":"openseadragon/next_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2411,"digest":"95afb05783b4c599eec66a21a2b98ea09d6b0be41cce42ed512239cede37a1ab","integrity":"sha256-la+wV4O0xZnuxmohormOoJ1rC+QczkLtUSI5zt43oas="},"openseadragon/next_rest-d9b1965f3bcddd3db23e63037a27152c1b7528811582c68b7b4bf25b8673fe07.png":{"logical_path":"openseadragon/next_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":2027,"digest":"d9b1965f3bcddd3db23e63037a27152c1b7528811582c68b7b4bf25b8673fe07","integrity":"sha256-2bGWXzvN3T2yPmMDeicVLBt1KIEVgsaLe0vyW4Zz/gc="},"openseadragon/previous_grouphover-c7e82a94049ff615a7dc6f78ae3758d7d33eab41a69093d9c1101c164c07fe8b.png":{"logical_path":"openseadragon/previous_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1933,"digest":"c7e82a94049ff615a7dc6f78ae3758d7d33eab41a69093d9c1101c164c07fe8b","integrity":"sha256-x+gqlASf9hWn3G94rjdY19M+q0GmkJPZwRAcFkwH/os="},"openseadragon/previous_hover-94126f0047e7901b3d2e408abb58b20744a7251786746d7508624db5b4c81bce.png":{"logical_path":"openseadragon/previous_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2361,"digest":"94126f0047e7901b3d2e408abb58b20744a7251786746d7508624db5b4c81bce","integrity":"sha256-lBJvAEfnkBs9LkCKu1iyB0SnJReGdG11CGJNtbTIG84="},"openseadragon/previous_pressed-b80145c436ff5cd94c3f672eed9f1723fcd13077870337874171e99dee9f9929.png":{"logical_path":"openseadragon/previous_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2413,"digest":"b80145c436ff5cd94c3f672eed9f1723fcd13077870337874171e99dee9f9929","integrity":"sha256-uAFFxDb/XNlMP2cu7Z8XI/zRMHeHAzeHQXHpne6fmSk="},"openseadragon/previous_rest-56999fcbe41a0ebb5d701fb463caea0e3850478d1f869e2e7a73b7dc363ca2e2.png":{"logical_path":"openseadragon/previous_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":2029,"digest":"56999fcbe41a0ebb5d701fb463caea0e3850478d1f869e2e7a73b7dc363ca2e2","integrity":"sha256-Vpmfy+QaDrtdcB+0Y8rqDjhQR40fhp4uenO33DY8ouI="},"openseadragon/rotateleft_grouphover-35d3cf9efe958bd88ae0c532648403824df252fa6835aa586301b19c80c264e3.png":{"logical_path":"openseadragon/rotateleft_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1731,"digest":"35d3cf9efe958bd88ae0c532648403824df252fa6835aa586301b19c80c264e3","integrity":"sha256-NdPPnv6Vi9iK4MUyZIQDgk3yUvpoNapYYwGxnIDCZOM="},"openseadragon/rotateleft_hover-59fee051c2aff4c8491255be664f87671c089db4863f933989b10263818cf435.png":{"logical_path":"openseadragon/rotateleft_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2094,"digest":"59fee051c2aff4c8491255be664f87671c089db4863f933989b10263818cf435","integrity":"sha256-Wf7gUcKv9MhJElW+Zk+HZxwInbSGP5M5ibECY4GM9DU="},"openseadragon/rotateleft_pressed-97d28095eb471109d0aee65f9f4dc5ee6dba6d7fed433e3a910dcda69ca4a977.png":{"logical_path":"openseadragon/rotateleft_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2036,"digest":"97d28095eb471109d0aee65f9f4dc5ee6dba6d7fed433e3a910dcda69ca4a977","integrity":"sha256-l9KAletHEQnQruZfn03F7m26bX/tQz46kQ3NppykqXc="},"openseadragon/rotateleft_rest-ab4731e3c7d7a4b40ea07c16269e8117ce58506177dc438cc00cdf837f513f09.png":{"logical_path":"openseadragon/rotateleft_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1779,"digest":"ab4731e3c7d7a4b40ea07c16269e8117ce58506177dc438cc00cdf837f513f09","integrity":"sha256-q0cx48fXpLQOoHwWJp6BF85YUGF33EOMwAzfg39RPwk="},"openseadragon/rotateright_grouphover-ebdaf54f82601db210a5ac2e0a54790c0decd8dea5bd115f7d6d0d2bf04c5e00.png":{"logical_path":"openseadragon/rotateright_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1800,"digest":"ebdaf54f82601db210a5ac2e0a54790c0decd8dea5bd115f7d6d0d2bf04c5e00","integrity":"sha256-69r1T4JgHbIQpawuClR5DA3s2N6lvRFffW0NK/BMXgA="},"openseadragon/rotateright_hover-a9124016ebe30ec16f3691a16cc57997174652f480f3002d45beaf918b1230c1.png":{"logical_path":"openseadragon/rotateright_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2158,"digest":"a9124016ebe30ec16f3691a16cc57997174652f480f3002d45beaf918b1230c1","integrity":"sha256-qRJAFuvjDsFvNpGhbMV5lxdGUvSA8wAtRb6vkYsSMME="},"openseadragon/rotateright_pressed-a75e74dab723a0587d365e4b076572d1440df9f31c424ef4a6be62f3a45d472b.png":{"logical_path":"openseadragon/rotateright_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2039,"digest":"a75e74dab723a0587d365e4b076572d1440df9f31c424ef4a6be62f3a45d472b","integrity":"sha256-p1502rcjoFh9Nl5LB2Vy0UQN+fMcQk70pr5i86RdRys="},"openseadragon/rotateright_rest-c201ce35f6651e824eee3eb5ca3e42fc40035d2070eec9ce1261c8b7bc126526.png":{"logical_path":"openseadragon/rotateright_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1812,"digest":"c201ce35f6651e824eee3eb5ca3e42fc40035d2070eec9ce1261c8b7bc126526","integrity":"sha256-wgHONfZlHoJO7j61yj5C/EADXSBw7snOEmHIt7wSZSY="},"openseadragon/zoomin_grouphover-ecd40589890cdfd81911752c4af02c691a201c21d74bbad5f3d9336463b52604.png":{"logical_path":"openseadragon/zoomin_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":1060,"digest":"ecd40589890cdfd81911752c4af02c691a201c21d74bbad5f3d9336463b52604","integrity":"sha256-7NQFiYkM39gZEXUsSvAsaRogHCHXS7rV89kzZGO1JgQ="},"openseadragon/zoomin_hover-6a2c08cf07b12162f73e80417d6e49e7da4b219981c9929abf89fbd1a18b58a2.png":{"logical_path":"openseadragon/zoomin_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":2116,"digest":"6a2c08cf07b12162f73e80417d6e49e7da4b219981c9929abf89fbd1a18b58a2","integrity":"sha256-aiwIzwexIWL3PoBBfW5J59pLIZmByZKav4n70aGLWKI="},"openseadragon/zoomin_pressed-b9eb902ca333aaabd8cf77c1184a6aa24311bcba0d836dc6ebded4c5d7146475.png":{"logical_path":"openseadragon/zoomin_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":2159,"digest":"b9eb902ca333aaabd8cf77c1184a6aa24311bcba0d836dc6ebded4c5d7146475","integrity":"sha256-ueuQLKMzqqvYz3fBGEpqokMRvLoNg23G697UxdcUZHU="},"openseadragon/zoomin_rest-674258f78d924bfe2454a637ecf912fe7069105ab68980f69674ff5c25521ed9.png":{"logical_path":"openseadragon/zoomin_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1262,"digest":"674258f78d924bfe2454a637ecf912fe7069105ab68980f69674ff5c25521ed9","integrity":"sha256-Z0JY942SS/4kVKY37PkS/nBpEFq2iYD2lnT/XCVSHtk="},"openseadragon/zoomout_grouphover-b582631f7ede7c640c46a29d74728814d3b7332b14748054ae460aa9be929e77.png":{"logical_path":"openseadragon/zoomout_grouphover.png","mtime":"2023-03-27T10:52:50-04:00","size":977,"digest":"b582631f7ede7c640c46a29d74728814d3b7332b14748054ae460aa9be929e77","integrity":"sha256-tYJjH37efGQMRqKddHKIFNO3MysUdIBUrkYKqb6Snnc="},"openseadragon/zoomout_hover-b752facaf76d197e235dd789929e86577339ffa280b6a51621388f2cad9900e1.png":{"logical_path":"openseadragon/zoomout_hover.png","mtime":"2023-03-27T10:52:50-04:00","size":1926,"digest":"b752facaf76d197e235dd789929e86577339ffa280b6a51621388f2cad9900e1","integrity":"sha256-t1L6yvdtGX4jXdeJkp6GV3M5/6KAtqUWITiPLK2ZAOE="},"openseadragon/zoomout_pressed-99ce17d25e10d07ebe3a21642eb350bfd80c603cbb6a4b0af705fbcdf8ca57dc.png":{"logical_path":"openseadragon/zoomout_pressed.png","mtime":"2023-03-27T10:52:50-04:00","size":1997,"digest":"99ce17d25e10d07ebe3a21642eb350bfd80c603cbb6a4b0af705fbcdf8ca57dc","integrity":"sha256-mc4X0l4Q0H6+OiFkLrNQv9gMYDy7aksK9wX7zfjKV9w="},"openseadragon/zoomout_rest-a4ff50ab46d8de87c720cb9cbccc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa.png":{"logical_path":"openseadragon/zoomout_rest.png","mtime":"2023-03-27T10:52:50-04:00","size":1153,"digest":"a4ff50ab46d8de87c720cb9cbccc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa","integrity":"sha256-pP9Qq0bY3ofHIMucvMybS+8c3aE5S5yKK05vsvY+E6o="},"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot":{"logical_path":"bootstrap/glyphicons-halflings-regular.eot","mtime":"2023-03-27T10:52:48-04:00","size":20127,"digest":"13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407","integrity":"sha256-E2NNqH2eI/jD7ZEIzhck0YOjmtBy5z4bPYy/ZG0tBAc="},"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg":{"logical_path":"bootstrap/glyphicons-halflings-regular.svg","mtime":"2023-03-27T10:52:48-04:00","size":108738,"digest":"42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5","integrity":"sha256-QvYGWdJlwaPDD5+kKry7Vr1KU69Ng9MW1t16NpA8Q+U="},"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf":{"logical_path":"bootstrap/glyphicons-halflings-regular.ttf","mtime":"2023-03-27T10:52:48-04:00","size":45404,"digest":"e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456","integrity":"sha256-45UEQJN1fYKvyxOJV9BqHqk2G9zwtELQahioBRr1dFY="},"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff","mtime":"2023-03-27T10:52:48-04:00","size":23424,"digest":"a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742","integrity":"sha256-omOU9+3hAMoRjv8u2ghZYnWpg5uVnCJuFUOVV6WoB0I="},"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2":{"logical_path":"bootstrap/glyphicons-halflings-regular.woff2","mtime":"2023-03-27T10:52:48-04:00","size":18028,"digest":"fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c","integrity":"sha256-/hhdEaSWdokNR7t4MxKgzaWkTEA5IUCU55V7TAQO8Rw="}},"assets":{"favicon.ico":"favicon-431b0dcc5a0e56bb22a8c13c087a885d06d64efe5b5b18a351641ad5506b53b1.ico","logo.png":"logo-0e6b1f8122c86e81273620122a5f3f278c9dad531951b680114733089f369794.png","logo_no_text.png":"logo_no_text-61c44db96a24f085a489d42b71caeecd1ebae9fc43cf0ab98ebcfe554368814c.png","tapaslogo-opaque.png":"tapaslogo-opaque-4e173fb972554829fc5040f6b0a551d8efb411b13be8d04c1afd4d9210a75b92.png","application.js":"application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js","application.css":"application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css","openseadragon/button_grouphover.png":"openseadragon/button_grouphover-2e64df18c27b1a51955c47cbe7535fa2a25548cefb7d1a2de625b59f31853cb6.png","openseadragon/button_hover.png":"openseadragon/button_hover-b1086485b0d055d468a729f5a6a79f78fc06fdfa814710dedb7021a7d6206fde.png","openseadragon/button_pressed.png":"openseadragon/button_pressed-01f1c05bdee216ec417e3475552cd053ce3199bfd2c9e1660f2c7cdc60d0be11.png","openseadragon/button_rest.png":"openseadragon/button_rest-5c693c3b03e6efc5c491ab2e8e1ba81800de423a16da8c7f348c19ae8924d142.png","openseadragon/fullpage_grouphover.png":"openseadragon/fullpage_grouphover-f96415fcf86eff56b664f2328ffd61972b98738874d995e077091344f59fc26b.png","openseadragon/fullpage_hover.png":"openseadragon/fullpage_hover-3cc954037484edb4a74d97a374605301b4da04c034981af70ec0ec3e1bb509a8.png","openseadragon/fullpage_pressed.png":"openseadragon/fullpage_pressed-7b3d188695ec59993a09cf27dde280b1da93fd43360f721642b42229b9e5e817.png","openseadragon/fullpage_rest.png":"openseadragon/fullpage_rest-1b7ae93b3fe5d0df99e196bfe22b93c7f05d2d5e0fdf97b8b8e957e5476ff586.png","openseadragon/home_grouphover.png":"openseadragon/home_grouphover-2f2dfd6ed6fd11c1aec5491c36f071cf51a96712ddac54b803a8fee917ce27d8.png","openseadragon/home_hover.png":"openseadragon/home_hover-170fc906037fe8707d3757775ea4ccb3ebbf883329c44473cd247d0f22c320d9.png","openseadragon/home_pressed.png":"openseadragon/home_pressed-e8a08eb8d9862e63c8df96fbe508956ae031b09d85533adf83e094c5b187833c.png","openseadragon/home_rest.png":"openseadragon/home_rest-6fd27483f507bf8b4a15d6c60d43e9bb3bd14b84959973d61a622bbb4777dfc9.png","openseadragon/next_grouphover.png":"openseadragon/next_grouphover-e7c76fb2c8a792a63efe2ad76da276fd079f50ec0df2b03b04bfc36cfc217103.png","openseadragon/next_hover.png":"openseadragon/next_hover-67210c1194693f480cfe9935281fd447a86c46b65e67ce182632cb518dfd2bb9.png","openseadragon/next_pressed.png":"openseadragon/next_pressed-95afb05783b4c599eec66a21a2b98ea09d6b0be41cce42ed512239cede37a1ab.png","openseadragon/next_rest.png":"openseadragon/next_rest-d9b1965f3bcddd3db23e63037a27152c1b7528811582c68b7b4bf25b8673fe07.png","openseadragon/previous_grouphover.png":"openseadragon/previous_grouphover-c7e82a94049ff615a7dc6f78ae3758d7d33eab41a69093d9c1101c164c07fe8b.png","openseadragon/previous_hover.png":"openseadragon/previous_hover-94126f0047e7901b3d2e408abb58b20744a7251786746d7508624db5b4c81bce.png","openseadragon/previous_pressed.png":"openseadragon/previous_pressed-b80145c436ff5cd94c3f672eed9f1723fcd13077870337874171e99dee9f9929.png","openseadragon/previous_rest.png":"openseadragon/previous_rest-56999fcbe41a0ebb5d701fb463caea0e3850478d1f869e2e7a73b7dc363ca2e2.png","openseadragon/rotateleft_grouphover.png":"openseadragon/rotateleft_grouphover-35d3cf9efe958bd88ae0c532648403824df252fa6835aa586301b19c80c264e3.png","openseadragon/rotateleft_hover.png":"openseadragon/rotateleft_hover-59fee051c2aff4c8491255be664f87671c089db4863f933989b10263818cf435.png","openseadragon/rotateleft_pressed.png":"openseadragon/rotateleft_pressed-97d28095eb471109d0aee65f9f4dc5ee6dba6d7fed433e3a910dcda69ca4a977.png","openseadragon/rotateleft_rest.png":"openseadragon/rotateleft_rest-ab4731e3c7d7a4b40ea07c16269e8117ce58506177dc438cc00cdf837f513f09.png","openseadragon/rotateright_grouphover.png":"openseadragon/rotateright_grouphover-ebdaf54f82601db210a5ac2e0a54790c0decd8dea5bd115f7d6d0d2bf04c5e00.png","openseadragon/rotateright_hover.png":"openseadragon/rotateright_hover-a9124016ebe30ec16f3691a16cc57997174652f480f3002d45beaf918b1230c1.png","openseadragon/rotateright_pressed.png":"openseadragon/rotateright_pressed-a75e74dab723a0587d365e4b076572d1440df9f31c424ef4a6be62f3a45d472b.png","openseadragon/rotateright_rest.png":"openseadragon/rotateright_rest-c201ce35f6651e824eee3eb5ca3e42fc40035d2070eec9ce1261c8b7bc126526.png","openseadragon/zoomin_grouphover.png":"openseadragon/zoomin_grouphover-ecd40589890cdfd81911752c4af02c691a201c21d74bbad5f3d9336463b52604.png","openseadragon/zoomin_hover.png":"openseadragon/zoomin_hover-6a2c08cf07b12162f73e80417d6e49e7da4b219981c9929abf89fbd1a18b58a2.png","openseadragon/zoomin_pressed.png":"openseadragon/zoomin_pressed-b9eb902ca333aaabd8cf77c1184a6aa24311bcba0d836dc6ebded4c5d7146475.png","openseadragon/zoomin_rest.png":"openseadragon/zoomin_rest-674258f78d924bfe2454a637ecf912fe7069105ab68980f69674ff5c25521ed9.png","openseadragon/zoomout_grouphover.png":"openseadragon/zoomout_grouphover-b582631f7ede7c640c46a29d74728814d3b7332b14748054ae460aa9be929e77.png","openseadragon/zoomout_hover.png":"openseadragon/zoomout_hover-b752facaf76d197e235dd789929e86577339ffa280b6a51621388f2cad9900e1.png","openseadragon/zoomout_pressed.png":"openseadragon/zoomout_pressed-99ce17d25e10d07ebe3a21642eb350bfd80c603cbb6a4b0af705fbcdf8ca57dc.png","openseadragon/zoomout_rest.png":"openseadragon/zoomout_rest-a4ff50ab46d8de87c720cb9cbccc9b4bef1cdda1394b9c8a2b4e6fb2f63e13aa.png","bootstrap/glyphicons-halflings-regular.eot":"bootstrap/glyphicons-halflings-regular-13634da87d9e23f8c3ed9108ce1724d183a39ad072e73e1b3d8cbf646d2d0407.eot","bootstrap/glyphicons-halflings-regular.svg":"bootstrap/glyphicons-halflings-regular-42f60659d265c1a3c30f9fa42abcbb56bd4a53af4d83d316d6dd7a36903c43e5.svg","bootstrap/glyphicons-halflings-regular.ttf":"bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf","bootstrap/glyphicons-halflings-regular.woff":"bootstrap/glyphicons-halflings-regular-a26394f7ede100ca118eff2eda08596275a9839b959c226e15439557a5a80742.woff","bootstrap/glyphicons-halflings-regular.woff2":"bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2"}} \ No newline at end of file diff --git a/public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css b/public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css new file mode 100644 index 000000000..aa2b33e62 --- /dev/null +++ b/public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css @@ -0,0 +1,8617 @@ +@charset "UTF-8"; +/* + * 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. + * + + + */ +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(/assets/bootstrap/glyphicons-halflings-regular.eot); + src: url(/assets/bootstrap/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"), url(/assets/bootstrap/glyphicons-halflings-regular.woff) format("woff"), url(/assets/bootstrap/glyphicons-halflings-regular.ttf) format("truetype"), url(/assets/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg"); } +.btn-light { + color: #222222; + background-color: #EBEBEB; + border-color: #FFF; } + .btn-light:hover, .btn-light:focus, .btn-light.focus, .btn-light:active, .btn-light.active, .open > .btn-light.dropdown-toggle { + color: #222222; + background-color: #d2d2d2; + border-color: #e0e0e0; } + .btn-light:active, .btn-light.active, .open > .btn-light.dropdown-toggle { + background-image: none; } + .btn-light.disabled, .btn-light.disabled:hover, .btn-light.disabled:focus, .btn-light.disabled.focus, .btn-light.disabled:active, .btn-light.disabled.active, .btn-light[disabled], .btn-light[disabled]:hover, .btn-light[disabled]:focus, .btn-light[disabled].focus, .btn-light[disabled]:active, .btn-light[disabled].active, fieldset[disabled] .btn-light, fieldset[disabled] .btn-light:hover, fieldset[disabled] .btn-light:focus, fieldset[disabled] .btn-light.focus, fieldset[disabled] .btn-light:active, fieldset[disabled] .btn-light.active { + background-color: #EBEBEB; + border-color: #FFF; } + .btn-light .badge { + color: #EBEBEB; + background-color: #222222; } + +.btn-tapas-blue { + color: #fff; + background-color: #6ea8e5; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-blue:hover, .btn-tapas-blue:focus, .btn-tapas-blue.focus, .btn-tapas-blue:active, .btn-tapas-blue.active, .open > .btn-tapas-blue.dropdown-toggle { + color: #fff; + background-color: #438edd; + border-color: rgba(224, 224, 224, 0); } + .btn-tapas-blue:active, .btn-tapas-blue.active, .open > .btn-tapas-blue.dropdown-toggle { + background-image: none; } + .btn-tapas-blue.disabled, .btn-tapas-blue.disabled:hover, .btn-tapas-blue.disabled:focus, .btn-tapas-blue.disabled.focus, .btn-tapas-blue.disabled:active, .btn-tapas-blue.disabled.active, .btn-tapas-blue[disabled], .btn-tapas-blue[disabled]:hover, .btn-tapas-blue[disabled]:focus, .btn-tapas-blue[disabled].focus, .btn-tapas-blue[disabled]:active, .btn-tapas-blue[disabled].active, fieldset[disabled] .btn-tapas-blue, fieldset[disabled] .btn-tapas-blue:hover, fieldset[disabled] .btn-tapas-blue:focus, fieldset[disabled] .btn-tapas-blue.focus, fieldset[disabled] .btn-tapas-blue:active, fieldset[disabled] .btn-tapas-blue.active { + background-color: #6ea8e5; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-blue .badge { + color: #6ea8e5; + background-color: #fff; } + +.btn-tapas-red { + color: #fff; + background-color: #b02c2c; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-red:hover, .btn-tapas-red:focus, .btn-tapas-red.focus, .btn-tapas-red:active, .btn-tapas-red.active, .open > .btn-tapas-red.dropdown-toggle { + color: #fff; + background-color: #872222; + border-color: rgba(224, 224, 224, 0); } + .btn-tapas-red:active, .btn-tapas-red.active, .open > .btn-tapas-red.dropdown-toggle { + background-image: none; } + .btn-tapas-red.disabled, .btn-tapas-red.disabled:hover, .btn-tapas-red.disabled:focus, .btn-tapas-red.disabled.focus, .btn-tapas-red.disabled:active, .btn-tapas-red.disabled.active, .btn-tapas-red[disabled], .btn-tapas-red[disabled]:hover, .btn-tapas-red[disabled]:focus, .btn-tapas-red[disabled].focus, .btn-tapas-red[disabled]:active, .btn-tapas-red[disabled].active, fieldset[disabled] .btn-tapas-red, fieldset[disabled] .btn-tapas-red:hover, fieldset[disabled] .btn-tapas-red:focus, fieldset[disabled] .btn-tapas-red.focus, fieldset[disabled] .btn-tapas-red:active, fieldset[disabled] .btn-tapas-red.active { + background-color: #b02c2c; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-red .badge { + color: #b02c2c; + background-color: #fff; } + +.btn-tapas-green { + color: #fff; + background-color: #b1dc16; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-green:hover, .btn-tapas-green:focus, .btn-tapas-green.focus, .btn-tapas-green:active, .btn-tapas-green.active, .open > .btn-tapas-green.dropdown-toggle { + color: #fff; + background-color: #8cae11; + border-color: rgba(224, 224, 224, 0); } + .btn-tapas-green:active, .btn-tapas-green.active, .open > .btn-tapas-green.dropdown-toggle { + background-image: none; } + .btn-tapas-green.disabled, .btn-tapas-green.disabled:hover, .btn-tapas-green.disabled:focus, .btn-tapas-green.disabled.focus, .btn-tapas-green.disabled:active, .btn-tapas-green.disabled.active, .btn-tapas-green[disabled], .btn-tapas-green[disabled]:hover, .btn-tapas-green[disabled]:focus, .btn-tapas-green[disabled].focus, .btn-tapas-green[disabled]:active, .btn-tapas-green[disabled].active, fieldset[disabled] .btn-tapas-green, fieldset[disabled] .btn-tapas-green:hover, fieldset[disabled] .btn-tapas-green:focus, fieldset[disabled] .btn-tapas-green.focus, fieldset[disabled] .btn-tapas-green:active, fieldset[disabled] .btn-tapas-green.active { + background-color: #b1dc16; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-green .badge { + color: #b1dc16; + background-color: #fff; } + +.btn-tapas-orange { + color: #fff; + background-color: #e69317; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-orange:hover, .btn-tapas-orange:focus, .btn-tapas-orange.focus, .btn-tapas-orange:active, .btn-tapas-orange.active, .open > .btn-tapas-orange.dropdown-toggle { + color: #fff; + background-color: #b87512; + border-color: rgba(224, 224, 224, 0); } + .btn-tapas-orange:active, .btn-tapas-orange.active, .open > .btn-tapas-orange.dropdown-toggle { + background-image: none; } + .btn-tapas-orange.disabled, .btn-tapas-orange.disabled:hover, .btn-tapas-orange.disabled:focus, .btn-tapas-orange.disabled.focus, .btn-tapas-orange.disabled:active, .btn-tapas-orange.disabled.active, .btn-tapas-orange[disabled], .btn-tapas-orange[disabled]:hover, .btn-tapas-orange[disabled]:focus, .btn-tapas-orange[disabled].focus, .btn-tapas-orange[disabled]:active, .btn-tapas-orange[disabled].active, fieldset[disabled] .btn-tapas-orange, fieldset[disabled] .btn-tapas-orange:hover, fieldset[disabled] .btn-tapas-orange:focus, fieldset[disabled] .btn-tapas-orange.focus, fieldset[disabled] .btn-tapas-orange:active, fieldset[disabled] .btn-tapas-orange.active { + background-color: #e69317; + border-color: rgba(255, 255, 255, 0); } + .btn-tapas-orange .badge { + color: #e69317; + background-color: #fff; } + +.img-rounded { + border-radius: 50%; } + +.btn-xlg { + padding: 24px 48px; + font-size: 26px; + line-height: 1.3333333; + border-radius: 0; } + +hr.inverse { + margin: 0; } + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?v=4.7.0); + src: url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"), url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2?v=4.7.0) format("woff2"), url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff?v=4.7.0) format("woff"), url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf?v=4.7.0) format("truetype"), url(//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg"); + font-weight: normal; + font-style: normal; } +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333em; + line-height: 0.75em; + vertical-align: -15%; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-fw { + width: 1.2857142857em; + text-align: center; } + +.fa-ul { + padding-left: 0; + margin-left: 2.1428571429em; + list-style-type: none; } + .fa-ul > li { + position: relative; } + +.fa-li { + position: absolute; + left: -2.1428571429em; + width: 2.1428571429em; + top: 0.1428571429em; + text-align: center; } + .fa-li.fa-lg { + left: -1.8571428571em; } + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eee; + border-radius: .1em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left { + margin-right: .3em; } +.fa.fa-pull-right { + margin-left: .3em; } + +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; } + +.pull-left { + float: left; } + +.fa.pull-left { + margin-right: .3em; } +.fa.pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; } + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; } + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; } + +.fa-music:before { + content: ""; } + +.fa-search:before { + content: ""; } + +.fa-envelope-o:before { + content: ""; } + +.fa-heart:before { + content: ""; } + +.fa-star:before { + content: ""; } + +.fa-star-o:before { + content: ""; } + +.fa-user:before { + content: ""; } + +.fa-film:before { + content: ""; } + +.fa-th-large:before { + content: ""; } + +.fa-th:before { + content: ""; } + +.fa-th-list:before { + content: ""; } + +.fa-check:before { + content: ""; } + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; } + +.fa-search-plus:before { + content: ""; } + +.fa-search-minus:before { + content: ""; } + +.fa-power-off:before { + content: ""; } + +.fa-signal:before { + content: ""; } + +.fa-gear:before, +.fa-cog:before { + content: ""; } + +.fa-trash-o:before { + content: ""; } + +.fa-home:before { + content: ""; } + +.fa-file-o:before { + content: ""; } + +.fa-clock-o:before { + content: ""; } + +.fa-road:before { + content: ""; } + +.fa-download:before { + content: ""; } + +.fa-arrow-circle-o-down:before { + content: ""; } + +.fa-arrow-circle-o-up:before { + content: ""; } + +.fa-inbox:before { + content: ""; } + +.fa-play-circle-o:before { + content: ""; } + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; } + +.fa-refresh:before { + content: ""; } + +.fa-list-alt:before { + content: ""; } + +.fa-lock:before { + content: ""; } + +.fa-flag:before { + content: ""; } + +.fa-headphones:before { + content: ""; } + +.fa-volume-off:before { + content: ""; } + +.fa-volume-down:before { + content: ""; } + +.fa-volume-up:before { + content: ""; } + +.fa-qrcode:before { + content: ""; } + +.fa-barcode:before { + content: ""; } + +.fa-tag:before { + content: ""; } + +.fa-tags:before { + content: ""; } + +.fa-book:before { + content: ""; } + +.fa-bookmark:before { + content: ""; } + +.fa-print:before { + content: ""; } + +.fa-camera:before { + content: ""; } + +.fa-font:before { + content: ""; } + +.fa-bold:before { + content: ""; } + +.fa-italic:before { + content: ""; } + +.fa-text-height:before { + content: ""; } + +.fa-text-width:before { + content: ""; } + +.fa-align-left:before { + content: ""; } + +.fa-align-center:before { + content: ""; } + +.fa-align-right:before { + content: ""; } + +.fa-align-justify:before { + content: ""; } + +.fa-list:before { + content: ""; } + +.fa-dedent:before, +.fa-outdent:before { + content: ""; } + +.fa-indent:before { + content: ""; } + +.fa-video-camera:before { + content: ""; } + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; } + +.fa-pencil:before { + content: ""; } + +.fa-map-marker:before { + content: ""; } + +.fa-adjust:before { + content: ""; } + +.fa-tint:before { + content: ""; } + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; } + +.fa-share-square-o:before { + content: ""; } + +.fa-check-square-o:before { + content: ""; } + +.fa-arrows:before { + content: ""; } + +.fa-step-backward:before { + content: ""; } + +.fa-fast-backward:before { + content: ""; } + +.fa-backward:before { + content: ""; } + +.fa-play:before { + content: ""; } + +.fa-pause:before { + content: ""; } + +.fa-stop:before { + content: ""; } + +.fa-forward:before { + content: ""; } + +.fa-fast-forward:before { + content: ""; } + +.fa-step-forward:before { + content: ""; } + +.fa-eject:before { + content: ""; } + +.fa-chevron-left:before { + content: ""; } + +.fa-chevron-right:before { + content: ""; } + +.fa-plus-circle:before { + content: ""; } + +.fa-minus-circle:before { + content: ""; } + +.fa-times-circle:before { + content: ""; } + +.fa-check-circle:before { + content: ""; } + +.fa-question-circle:before { + content: ""; } + +.fa-info-circle:before { + content: ""; } + +.fa-crosshairs:before { + content: ""; } + +.fa-times-circle-o:before { + content: ""; } + +.fa-check-circle-o:before { + content: ""; } + +.fa-ban:before { + content: ""; } + +.fa-arrow-left:before { + content: ""; } + +.fa-arrow-right:before { + content: ""; } + +.fa-arrow-up:before { + content: ""; } + +.fa-arrow-down:before { + content: ""; } + +.fa-mail-forward:before, +.fa-share:before { + content: ""; } + +.fa-expand:before { + content: ""; } + +.fa-compress:before { + content: ""; } + +.fa-plus:before { + content: ""; } + +.fa-minus:before { + content: ""; } + +.fa-asterisk:before { + content: ""; } + +.fa-exclamation-circle:before { + content: ""; } + +.fa-gift:before { + content: ""; } + +.fa-leaf:before { + content: ""; } + +.fa-fire:before { + content: ""; } + +.fa-eye:before { + content: ""; } + +.fa-eye-slash:before { + content: ""; } + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; } + +.fa-plane:before { + content: ""; } + +.fa-calendar:before { + content: ""; } + +.fa-random:before { + content: ""; } + +.fa-comment:before { + content: ""; } + +.fa-magnet:before { + content: ""; } + +.fa-chevron-up:before { + content: ""; } + +.fa-chevron-down:before { + content: ""; } + +.fa-retweet:before { + content: ""; } + +.fa-shopping-cart:before { + content: ""; } + +.fa-folder:before { + content: ""; } + +.fa-folder-open:before { + content: ""; } + +.fa-arrows-v:before { + content: ""; } + +.fa-arrows-h:before { + content: ""; } + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; } + +.fa-twitter-square:before { + content: ""; } + +.fa-facebook-square:before { + content: ""; } + +.fa-camera-retro:before { + content: ""; } + +.fa-key:before { + content: ""; } + +.fa-gears:before, +.fa-cogs:before { + content: ""; } + +.fa-comments:before { + content: ""; } + +.fa-thumbs-o-up:before { + content: ""; } + +.fa-thumbs-o-down:before { + content: ""; } + +.fa-star-half:before { + content: ""; } + +.fa-heart-o:before { + content: ""; } + +.fa-sign-out:before { + content: ""; } + +.fa-linkedin-square:before { + content: ""; } + +.fa-thumb-tack:before { + content: ""; } + +.fa-external-link:before { + content: ""; } + +.fa-sign-in:before { + content: ""; } + +.fa-trophy:before { + content: ""; } + +.fa-github-square:before { + content: ""; } + +.fa-upload:before { + content: ""; } + +.fa-lemon-o:before { + content: ""; } + +.fa-phone:before { + content: ""; } + +.fa-square-o:before { + content: ""; } + +.fa-bookmark-o:before { + content: ""; } + +.fa-phone-square:before { + content: ""; } + +.fa-twitter:before { + content: ""; } + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; } + +.fa-github:before { + content: ""; } + +.fa-unlock:before { + content: ""; } + +.fa-credit-card:before { + content: ""; } + +.fa-feed:before, +.fa-rss:before { + content: ""; } + +.fa-hdd-o:before { + content: ""; } + +.fa-bullhorn:before { + content: ""; } + +.fa-bell:before { + content: ""; } + +.fa-certificate:before { + content: ""; } + +.fa-hand-o-right:before { + content: ""; } + +.fa-hand-o-left:before { + content: ""; } + +.fa-hand-o-up:before { + content: ""; } + +.fa-hand-o-down:before { + content: ""; } + +.fa-arrow-circle-left:before { + content: ""; } + +.fa-arrow-circle-right:before { + content: ""; } + +.fa-arrow-circle-up:before { + content: ""; } + +.fa-arrow-circle-down:before { + content: ""; } + +.fa-globe:before { + content: ""; } + +.fa-wrench:before { + content: ""; } + +.fa-tasks:before { + content: ""; } + +.fa-filter:before { + content: ""; } + +.fa-briefcase:before { + content: ""; } + +.fa-arrows-alt:before { + content: ""; } + +.fa-group:before, +.fa-users:before { + content: ""; } + +.fa-chain:before, +.fa-link:before { + content: ""; } + +.fa-cloud:before { + content: ""; } + +.fa-flask:before { + content: ""; } + +.fa-cut:before, +.fa-scissors:before { + content: ""; } + +.fa-copy:before, +.fa-files-o:before { + content: ""; } + +.fa-paperclip:before { + content: ""; } + +.fa-save:before, +.fa-floppy-o:before { + content: ""; } + +.fa-square:before { + content: ""; } + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; } + +.fa-list-ul:before { + content: ""; } + +.fa-list-ol:before { + content: ""; } + +.fa-strikethrough:before { + content: ""; } + +.fa-underline:before { + content: ""; } + +.fa-table:before { + content: ""; } + +.fa-magic:before { + content: ""; } + +.fa-truck:before { + content: ""; } + +.fa-pinterest:before { + content: ""; } + +.fa-pinterest-square:before { + content: ""; } + +.fa-google-plus-square:before { + content: ""; } + +.fa-google-plus:before { + content: ""; } + +.fa-money:before { + content: ""; } + +.fa-caret-down:before { + content: ""; } + +.fa-caret-up:before { + content: ""; } + +.fa-caret-left:before { + content: ""; } + +.fa-caret-right:before { + content: ""; } + +.fa-columns:before { + content: ""; } + +.fa-unsorted:before, +.fa-sort:before { + content: ""; } + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; } + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; } + +.fa-envelope:before { + content: ""; } + +.fa-linkedin:before { + content: ""; } + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; } + +.fa-legal:before, +.fa-gavel:before { + content: ""; } + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; } + +.fa-comment-o:before { + content: ""; } + +.fa-comments-o:before { + content: ""; } + +.fa-flash:before, +.fa-bolt:before { + content: ""; } + +.fa-sitemap:before { + content: ""; } + +.fa-umbrella:before { + content: ""; } + +.fa-paste:before, +.fa-clipboard:before { + content: ""; } + +.fa-lightbulb-o:before { + content: ""; } + +.fa-exchange:before { + content: ""; } + +.fa-cloud-download:before { + content: ""; } + +.fa-cloud-upload:before { + content: ""; } + +.fa-user-md:before { + content: ""; } + +.fa-stethoscope:before { + content: ""; } + +.fa-suitcase:before { + content: ""; } + +.fa-bell-o:before { + content: ""; } + +.fa-coffee:before { + content: ""; } + +.fa-cutlery:before { + content: ""; } + +.fa-file-text-o:before { + content: ""; } + +.fa-building-o:before { + content: ""; } + +.fa-hospital-o:before { + content: ""; } + +.fa-ambulance:before { + content: ""; } + +.fa-medkit:before { + content: ""; } + +.fa-fighter-jet:before { + content: ""; } + +.fa-beer:before { + content: ""; } + +.fa-h-square:before { + content: ""; } + +.fa-plus-square:before { + content: ""; } + +.fa-angle-double-left:before { + content: ""; } + +.fa-angle-double-right:before { + content: ""; } + +.fa-angle-double-up:before { + content: ""; } + +.fa-angle-double-down:before { + content: ""; } + +.fa-angle-left:before { + content: ""; } + +.fa-angle-right:before { + content: ""; } + +.fa-angle-up:before { + content: ""; } + +.fa-angle-down:before { + content: ""; } + +.fa-desktop:before { + content: ""; } + +.fa-laptop:before { + content: ""; } + +.fa-tablet:before { + content: ""; } + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; } + +.fa-circle-o:before { + content: ""; } + +.fa-quote-left:before { + content: ""; } + +.fa-quote-right:before { + content: ""; } + +.fa-spinner:before { + content: ""; } + +.fa-circle:before { + content: ""; } + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; } + +.fa-github-alt:before { + content: ""; } + +.fa-folder-o:before { + content: ""; } + +.fa-folder-open-o:before { + content: ""; } + +.fa-smile-o:before { + content: ""; } + +.fa-frown-o:before { + content: ""; } + +.fa-meh-o:before { + content: ""; } + +.fa-gamepad:before { + content: ""; } + +.fa-keyboard-o:before { + content: ""; } + +.fa-flag-o:before { + content: ""; } + +.fa-flag-checkered:before { + content: ""; } + +.fa-terminal:before { + content: ""; } + +.fa-code:before { + content: ""; } + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; } + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; } + +.fa-location-arrow:before { + content: ""; } + +.fa-crop:before { + content: ""; } + +.fa-code-fork:before { + content: ""; } + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; } + +.fa-question:before { + content: ""; } + +.fa-info:before { + content: ""; } + +.fa-exclamation:before { + content: ""; } + +.fa-superscript:before { + content: ""; } + +.fa-subscript:before { + content: ""; } + +.fa-eraser:before { + content: ""; } + +.fa-puzzle-piece:before { + content: ""; } + +.fa-microphone:before { + content: ""; } + +.fa-microphone-slash:before { + content: ""; } + +.fa-shield:before { + content: ""; } + +.fa-calendar-o:before { + content: ""; } + +.fa-fire-extinguisher:before { + content: ""; } + +.fa-rocket:before { + content: ""; } + +.fa-maxcdn:before { + content: ""; } + +.fa-chevron-circle-left:before { + content: ""; } + +.fa-chevron-circle-right:before { + content: ""; } + +.fa-chevron-circle-up:before { + content: ""; } + +.fa-chevron-circle-down:before { + content: ""; } + +.fa-html5:before { + content: ""; } + +.fa-css3:before { + content: ""; } + +.fa-anchor:before { + content: ""; } + +.fa-unlock-alt:before { + content: ""; } + +.fa-bullseye:before { + content: ""; } + +.fa-ellipsis-h:before { + content: ""; } + +.fa-ellipsis-v:before { + content: ""; } + +.fa-rss-square:before { + content: ""; } + +.fa-play-circle:before { + content: ""; } + +.fa-ticket:before { + content: ""; } + +.fa-minus-square:before { + content: ""; } + +.fa-minus-square-o:before { + content: ""; } + +.fa-level-up:before { + content: ""; } + +.fa-level-down:before { + content: ""; } + +.fa-check-square:before { + content: ""; } + +.fa-pencil-square:before { + content: ""; } + +.fa-external-link-square:before { + content: ""; } + +.fa-share-square:before { + content: ""; } + +.fa-compass:before { + content: ""; } + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; } + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; } + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; } + +.fa-euro:before, +.fa-eur:before { + content: ""; } + +.fa-gbp:before { + content: ""; } + +.fa-dollar:before, +.fa-usd:before { + content: ""; } + +.fa-rupee:before, +.fa-inr:before { + content: ""; } + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; } + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; } + +.fa-won:before, +.fa-krw:before { + content: ""; } + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; } + +.fa-file:before { + content: ""; } + +.fa-file-text:before { + content: ""; } + +.fa-sort-alpha-asc:before { + content: ""; } + +.fa-sort-alpha-desc:before { + content: ""; } + +.fa-sort-amount-asc:before { + content: ""; } + +.fa-sort-amount-desc:before { + content: ""; } + +.fa-sort-numeric-asc:before { + content: ""; } + +.fa-sort-numeric-desc:before { + content: ""; } + +.fa-thumbs-up:before { + content: ""; } + +.fa-thumbs-down:before { + content: ""; } + +.fa-youtube-square:before { + content: ""; } + +.fa-youtube:before { + content: ""; } + +.fa-xing:before { + content: ""; } + +.fa-xing-square:before { + content: ""; } + +.fa-youtube-play:before { + content: ""; } + +.fa-dropbox:before { + content: ""; } + +.fa-stack-overflow:before { + content: ""; } + +.fa-instagram:before { + content: ""; } + +.fa-flickr:before { + content: ""; } + +.fa-adn:before { + content: ""; } + +.fa-bitbucket:before { + content: ""; } + +.fa-bitbucket-square:before { + content: ""; } + +.fa-tumblr:before { + content: ""; } + +.fa-tumblr-square:before { + content: ""; } + +.fa-long-arrow-down:before { + content: ""; } + +.fa-long-arrow-up:before { + content: ""; } + +.fa-long-arrow-left:before { + content: ""; } + +.fa-long-arrow-right:before { + content: ""; } + +.fa-apple:before { + content: ""; } + +.fa-windows:before { + content: ""; } + +.fa-android:before { + content: ""; } + +.fa-linux:before { + content: ""; } + +.fa-dribbble:before { + content: ""; } + +.fa-skype:before { + content: ""; } + +.fa-foursquare:before { + content: ""; } + +.fa-trello:before { + content: ""; } + +.fa-female:before { + content: ""; } + +.fa-male:before { + content: ""; } + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; } + +.fa-sun-o:before { + content: ""; } + +.fa-moon-o:before { + content: ""; } + +.fa-archive:before { + content: ""; } + +.fa-bug:before { + content: ""; } + +.fa-vk:before { + content: ""; } + +.fa-weibo:before { + content: ""; } + +.fa-renren:before { + content: ""; } + +.fa-pagelines:before { + content: ""; } + +.fa-stack-exchange:before { + content: ""; } + +.fa-arrow-circle-o-right:before { + content: ""; } + +.fa-arrow-circle-o-left:before { + content: ""; } + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; } + +.fa-dot-circle-o:before { + content: ""; } + +.fa-wheelchair:before { + content: ""; } + +.fa-vimeo-square:before { + content: ""; } + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; } + +.fa-plus-square-o:before { + content: ""; } + +.fa-space-shuttle:before { + content: ""; } + +.fa-slack:before { + content: ""; } + +.fa-envelope-square:before { + content: ""; } + +.fa-wordpress:before { + content: ""; } + +.fa-openid:before { + content: ""; } + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; } + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; } + +.fa-yahoo:before { + content: ""; } + +.fa-google:before { + content: ""; } + +.fa-reddit:before { + content: ""; } + +.fa-reddit-square:before { + content: ""; } + +.fa-stumbleupon-circle:before { + content: ""; } + +.fa-stumbleupon:before { + content: ""; } + +.fa-delicious:before { + content: ""; } + +.fa-digg:before { + content: ""; } + +.fa-pied-piper-pp:before { + content: ""; } + +.fa-pied-piper-alt:before { + content: ""; } + +.fa-drupal:before { + content: ""; } + +.fa-joomla:before { + content: ""; } + +.fa-language:before { + content: ""; } + +.fa-fax:before { + content: ""; } + +.fa-building:before { + content: ""; } + +.fa-child:before { + content: ""; } + +.fa-paw:before { + content: ""; } + +.fa-spoon:before { + content: ""; } + +.fa-cube:before { + content: ""; } + +.fa-cubes:before { + content: ""; } + +.fa-behance:before { + content: ""; } + +.fa-behance-square:before { + content: ""; } + +.fa-steam:before { + content: ""; } + +.fa-steam-square:before { + content: ""; } + +.fa-recycle:before { + content: ""; } + +.fa-automobile:before, +.fa-car:before { + content: ""; } + +.fa-cab:before, +.fa-taxi:before { + content: ""; } + +.fa-tree:before { + content: ""; } + +.fa-spotify:before { + content: ""; } + +.fa-deviantart:before { + content: ""; } + +.fa-soundcloud:before { + content: ""; } + +.fa-database:before { + content: ""; } + +.fa-file-pdf-o:before { + content: ""; } + +.fa-file-word-o:before { + content: ""; } + +.fa-file-excel-o:before { + content: ""; } + +.fa-file-powerpoint-o:before { + content: ""; } + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; } + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; } + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; } + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; } + +.fa-file-code-o:before { + content: ""; } + +.fa-vine:before { + content: ""; } + +.fa-codepen:before { + content: ""; } + +.fa-jsfiddle:before { + content: ""; } + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; } + +.fa-circle-o-notch:before { + content: ""; } + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; } + +.fa-ge:before, +.fa-empire:before { + content: ""; } + +.fa-git-square:before { + content: ""; } + +.fa-git:before { + content: ""; } + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; } + +.fa-tencent-weibo:before { + content: ""; } + +.fa-qq:before { + content: ""; } + +.fa-wechat:before, +.fa-weixin:before { + content: ""; } + +.fa-send:before, +.fa-paper-plane:before { + content: ""; } + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; } + +.fa-history:before { + content: ""; } + +.fa-circle-thin:before { + content: ""; } + +.fa-header:before { + content: ""; } + +.fa-paragraph:before { + content: ""; } + +.fa-sliders:before { + content: ""; } + +.fa-share-alt:before { + content: ""; } + +.fa-share-alt-square:before { + content: ""; } + +.fa-bomb:before { + content: ""; } + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; } + +.fa-tty:before { + content: ""; } + +.fa-binoculars:before { + content: ""; } + +.fa-plug:before { + content: ""; } + +.fa-slideshare:before { + content: ""; } + +.fa-twitch:before { + content: ""; } + +.fa-yelp:before { + content: ""; } + +.fa-newspaper-o:before { + content: ""; } + +.fa-wifi:before { + content: ""; } + +.fa-calculator:before { + content: ""; } + +.fa-paypal:before { + content: ""; } + +.fa-google-wallet:before { + content: ""; } + +.fa-cc-visa:before { + content: ""; } + +.fa-cc-mastercard:before { + content: ""; } + +.fa-cc-discover:before { + content: ""; } + +.fa-cc-amex:before { + content: ""; } + +.fa-cc-paypal:before { + content: ""; } + +.fa-cc-stripe:before { + content: ""; } + +.fa-bell-slash:before { + content: ""; } + +.fa-bell-slash-o:before { + content: ""; } + +.fa-trash:before { + content: ""; } + +.fa-copyright:before { + content: ""; } + +.fa-at:before { + content: ""; } + +.fa-eyedropper:before { + content: ""; } + +.fa-paint-brush:before { + content: ""; } + +.fa-birthday-cake:before { + content: ""; } + +.fa-area-chart:before { + content: ""; } + +.fa-pie-chart:before { + content: ""; } + +.fa-line-chart:before { + content: ""; } + +.fa-lastfm:before { + content: ""; } + +.fa-lastfm-square:before { + content: ""; } + +.fa-toggle-off:before { + content: ""; } + +.fa-toggle-on:before { + content: ""; } + +.fa-bicycle:before { + content: ""; } + +.fa-bus:before { + content: ""; } + +.fa-ioxhost:before { + content: ""; } + +.fa-angellist:before { + content: ""; } + +.fa-cc:before { + content: ""; } + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; } + +.fa-meanpath:before { + content: ""; } + +.fa-buysellads:before { + content: ""; } + +.fa-connectdevelop:before { + content: ""; } + +.fa-dashcube:before { + content: ""; } + +.fa-forumbee:before { + content: ""; } + +.fa-leanpub:before { + content: ""; } + +.fa-sellsy:before { + content: ""; } + +.fa-shirtsinbulk:before { + content: ""; } + +.fa-simplybuilt:before { + content: ""; } + +.fa-skyatlas:before { + content: ""; } + +.fa-cart-plus:before { + content: ""; } + +.fa-cart-arrow-down:before { + content: ""; } + +.fa-diamond:before { + content: ""; } + +.fa-ship:before { + content: ""; } + +.fa-user-secret:before { + content: ""; } + +.fa-motorcycle:before { + content: ""; } + +.fa-street-view:before { + content: ""; } + +.fa-heartbeat:before { + content: ""; } + +.fa-venus:before { + content: ""; } + +.fa-mars:before { + content: ""; } + +.fa-mercury:before { + content: ""; } + +.fa-intersex:before, +.fa-transgender:before { + content: ""; } + +.fa-transgender-alt:before { + content: ""; } + +.fa-venus-double:before { + content: ""; } + +.fa-mars-double:before { + content: ""; } + +.fa-venus-mars:before { + content: ""; } + +.fa-mars-stroke:before { + content: ""; } + +.fa-mars-stroke-v:before { + content: ""; } + +.fa-mars-stroke-h:before { + content: ""; } + +.fa-neuter:before { + content: ""; } + +.fa-genderless:before { + content: ""; } + +.fa-facebook-official:before { + content: ""; } + +.fa-pinterest-p:before { + content: ""; } + +.fa-whatsapp:before { + content: ""; } + +.fa-server:before { + content: ""; } + +.fa-user-plus:before { + content: ""; } + +.fa-user-times:before { + content: ""; } + +.fa-hotel:before, +.fa-bed:before { + content: ""; } + +.fa-viacoin:before { + content: ""; } + +.fa-train:before { + content: ""; } + +.fa-subway:before { + content: ""; } + +.fa-medium:before { + content: ""; } + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; } + +.fa-optin-monster:before { + content: ""; } + +.fa-opencart:before { + content: ""; } + +.fa-expeditedssl:before { + content: ""; } + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; } + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; } + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; } + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; } + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; } + +.fa-mouse-pointer:before { + content: ""; } + +.fa-i-cursor:before { + content: ""; } + +.fa-object-group:before { + content: ""; } + +.fa-object-ungroup:before { + content: ""; } + +.fa-sticky-note:before { + content: ""; } + +.fa-sticky-note-o:before { + content: ""; } + +.fa-cc-jcb:before { + content: ""; } + +.fa-cc-diners-club:before { + content: ""; } + +.fa-clone:before { + content: ""; } + +.fa-balance-scale:before { + content: ""; } + +.fa-hourglass-o:before { + content: ""; } + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; } + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; } + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; } + +.fa-hourglass:before { + content: ""; } + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; } + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; } + +.fa-hand-scissors-o:before { + content: ""; } + +.fa-hand-lizard-o:before { + content: ""; } + +.fa-hand-spock-o:before { + content: ""; } + +.fa-hand-pointer-o:before { + content: ""; } + +.fa-hand-peace-o:before { + content: ""; } + +.fa-trademark:before { + content: ""; } + +.fa-registered:before { + content: ""; } + +.fa-creative-commons:before { + content: ""; } + +.fa-gg:before { + content: ""; } + +.fa-gg-circle:before { + content: ""; } + +.fa-tripadvisor:before { + content: ""; } + +.fa-odnoklassniki:before { + content: ""; } + +.fa-odnoklassniki-square:before { + content: ""; } + +.fa-get-pocket:before { + content: ""; } + +.fa-wikipedia-w:before { + content: ""; } + +.fa-safari:before { + content: ""; } + +.fa-chrome:before { + content: ""; } + +.fa-firefox:before { + content: ""; } + +.fa-opera:before { + content: ""; } + +.fa-internet-explorer:before { + content: ""; } + +.fa-tv:before, +.fa-television:before { + content: ""; } + +.fa-contao:before { + content: ""; } + +.fa-500px:before { + content: ""; } + +.fa-amazon:before { + content: ""; } + +.fa-calendar-plus-o:before { + content: ""; } + +.fa-calendar-minus-o:before { + content: ""; } + +.fa-calendar-times-o:before { + content: ""; } + +.fa-calendar-check-o:before { + content: ""; } + +.fa-industry:before { + content: ""; } + +.fa-map-pin:before { + content: ""; } + +.fa-map-signs:before { + content: ""; } + +.fa-map-o:before { + content: ""; } + +.fa-map:before { + content: ""; } + +.fa-commenting:before { + content: ""; } + +.fa-commenting-o:before { + content: ""; } + +.fa-houzz:before { + content: ""; } + +.fa-vimeo:before { + content: ""; } + +.fa-black-tie:before { + content: ""; } + +.fa-fonticons:before { + content: ""; } + +.fa-reddit-alien:before { + content: ""; } + +.fa-edge:before { + content: ""; } + +.fa-credit-card-alt:before { + content: ""; } + +.fa-codiepie:before { + content: ""; } + +.fa-modx:before { + content: ""; } + +.fa-fort-awesome:before { + content: ""; } + +.fa-usb:before { + content: ""; } + +.fa-product-hunt:before { + content: ""; } + +.fa-mixcloud:before { + content: ""; } + +.fa-scribd:before { + content: ""; } + +.fa-pause-circle:before { + content: ""; } + +.fa-pause-circle-o:before { + content: ""; } + +.fa-stop-circle:before { + content: ""; } + +.fa-stop-circle-o:before { + content: ""; } + +.fa-shopping-bag:before { + content: ""; } + +.fa-shopping-basket:before { + content: ""; } + +.fa-hashtag:before { + content: ""; } + +.fa-bluetooth:before { + content: ""; } + +.fa-bluetooth-b:before { + content: ""; } + +.fa-percent:before { + content: ""; } + +.fa-gitlab:before { + content: ""; } + +.fa-wpbeginner:before { + content: ""; } + +.fa-wpforms:before { + content: ""; } + +.fa-envira:before { + content: ""; } + +.fa-universal-access:before { + content: ""; } + +.fa-wheelchair-alt:before { + content: ""; } + +.fa-question-circle-o:before { + content: ""; } + +.fa-blind:before { + content: ""; } + +.fa-audio-description:before { + content: ""; } + +.fa-volume-control-phone:before { + content: ""; } + +.fa-braille:before { + content: ""; } + +.fa-assistive-listening-systems:before { + content: ""; } + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; } + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; } + +.fa-glide:before { + content: ""; } + +.fa-glide-g:before { + content: ""; } + +.fa-signing:before, +.fa-sign-language:before { + content: ""; } + +.fa-low-vision:before { + content: ""; } + +.fa-viadeo:before { + content: ""; } + +.fa-viadeo-square:before { + content: ""; } + +.fa-snapchat:before { + content: ""; } + +.fa-snapchat-ghost:before { + content: ""; } + +.fa-snapchat-square:before { + content: ""; } + +.fa-pied-piper:before { + content: ""; } + +.fa-first-order:before { + content: ""; } + +.fa-yoast:before { + content: ""; } + +.fa-themeisle:before { + content: ""; } + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; } + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; } + +.fa-handshake-o:before { + content: ""; } + +.fa-envelope-open:before { + content: ""; } + +.fa-envelope-open-o:before { + content: ""; } + +.fa-linode:before { + content: ""; } + +.fa-address-book:before { + content: ""; } + +.fa-address-book-o:before { + content: ""; } + +.fa-vcard:before, +.fa-address-card:before { + content: ""; } + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; } + +.fa-user-circle:before { + content: ""; } + +.fa-user-circle-o:before { + content: ""; } + +.fa-user-o:before { + content: ""; } + +.fa-id-badge:before { + content: ""; } + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; } + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; } + +.fa-quora:before { + content: ""; } + +.fa-free-code-camp:before { + content: ""; } + +.fa-telegram:before { + content: ""; } + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; } + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; } + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; } + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; } + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; } + +.fa-shower:before { + content: ""; } + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; } + +.fa-podcast:before { + content: ""; } + +.fa-window-maximize:before { + content: ""; } + +.fa-window-minimize:before { + content: ""; } + +.fa-window-restore:before { + content: ""; } + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; } + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; } + +.fa-bandcamp:before { + content: ""; } + +.fa-grav:before { + content: ""; } + +.fa-etsy:before { + content: ""; } + +.fa-imdb:before { + content: ""; } + +.fa-ravelry:before { + content: ""; } + +.fa-eercast:before { + content: ""; } + +.fa-microchip:before { + content: ""; } + +.fa-snowflake-o:before { + content: ""; } + +.fa-superpowers:before { + content: ""; } + +.fa-wpexplorer:before { + content: ""; } + +.fa-meetup:before { + content: ""; } + +.sr-only, .view-type .caption { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; } + +body { + margin: 0; } + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; } + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; } + +audio:not([controls]) { + display: none; + height: 0; } + +[hidden], +template { + display: none; } + +a { + background-color: transparent; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: 1px dotted; } + +b, +strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +h1 { + font-size: 2em; + margin: 0.67em 0; } + +mark { + background: #ff0; + color: #000; } + +small { + font-size: 80%; } + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } + +pre { + overflow: auto; } + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } + +button { + overflow: visible; } + +button, +select { + text-transform: none; } + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], +html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; } + + a, + a:visited { + text-decoration: underline; } + + a[href]:after { + content: " (" attr(href) ")"; } + + abbr[title]:after { + content: " (" attr(title) ")"; } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + + thead { + display: table-header-group; } + + tr, + img { + page-break-inside: avoid; } + + img { + max-width: 100% !important; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; } + + h2, + h3 { + page-break-after: avoid; } + + select { + background: #fff !important; } + + .navbar { + display: none; } + + .btn > .caret, .facets-toggle > .caret, + .dropup > .btn > .caret, + .dropup > .facets-toggle > .caret { + border-top-color: #000 !important; } + + .label { + border: 1px solid #000; } + + .table { + border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; } } +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(/assets/bootstrap/glyphicons-halflings-regular.eot); + src: url(/assets/bootstrap/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"), url(/assets/bootstrap/glyphicons-halflings-regular.woff2) format("woff2"), url(/assets/bootstrap/glyphicons-halflings-regular.woff) format("woff"), url(/assets/bootstrap/glyphicons-halflings-regular.ttf) format("truetype"), url(/assets/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg"); } +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.glyphicon-asterisk:before { + content: "\2a"; } + +.glyphicon-plus:before { + content: "\2b"; } + +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; } + +.glyphicon-minus:before { + content: "\2212"; } + +.glyphicon-cloud:before { + content: "\2601"; } + +.glyphicon-envelope:before { + content: "\2709"; } + +.glyphicon-pencil:before { + content: "\270f"; } + +.glyphicon-glass:before { + content: "\e001"; } + +.glyphicon-music:before { + content: "\e002"; } + +.glyphicon-search:before { + content: "\e003"; } + +.glyphicon-heart:before { + content: "\e005"; } + +.glyphicon-star:before { + content: "\e006"; } + +.glyphicon-star-empty:before { + content: "\e007"; } + +.glyphicon-user:before { + content: "\e008"; } + +.glyphicon-film:before { + content: "\e009"; } + +.glyphicon-th-large:before { + content: "\e010"; } + +.glyphicon-th:before { + content: "\e011"; } + +.glyphicon-th-list:before { + content: "\e012"; } + +.glyphicon-ok:before { + content: "\e013"; } + +.glyphicon-remove:before { + content: "\e014"; } + +.glyphicon-zoom-in:before { + content: "\e015"; } + +.glyphicon-zoom-out:before { + content: "\e016"; } + +.glyphicon-off:before { + content: "\e017"; } + +.glyphicon-signal:before { + content: "\e018"; } + +.glyphicon-cog:before { + content: "\e019"; } + +.glyphicon-trash:before { + content: "\e020"; } + +.glyphicon-home:before { + content: "\e021"; } + +.glyphicon-file:before { + content: "\e022"; } + +.glyphicon-time:before { + content: "\e023"; } + +.glyphicon-road:before { + content: "\e024"; } + +.glyphicon-download-alt:before { + content: "\e025"; } + +.glyphicon-download:before { + content: "\e026"; } + +.glyphicon-upload:before { + content: "\e027"; } + +.glyphicon-inbox:before { + content: "\e028"; } + +.glyphicon-play-circle:before { + content: "\e029"; } + +.glyphicon-repeat:before { + content: "\e030"; } + +.glyphicon-refresh:before { + content: "\e031"; } + +.glyphicon-list-alt:before { + content: "\e032"; } + +.glyphicon-lock:before { + content: "\e033"; } + +.glyphicon-flag:before { + content: "\e034"; } + +.glyphicon-headphones:before { + content: "\e035"; } + +.glyphicon-volume-off:before { + content: "\e036"; } + +.glyphicon-volume-down:before { + content: "\e037"; } + +.glyphicon-volume-up:before { + content: "\e038"; } + +.glyphicon-qrcode:before { + content: "\e039"; } + +.glyphicon-barcode:before { + content: "\e040"; } + +.glyphicon-tag:before { + content: "\e041"; } + +.glyphicon-tags:before { + content: "\e042"; } + +.glyphicon-book:before { + content: "\e043"; } + +.glyphicon-bookmark:before { + content: "\e044"; } + +.glyphicon-print:before { + content: "\e045"; } + +.glyphicon-camera:before { + content: "\e046"; } + +.glyphicon-font:before { + content: "\e047"; } + +.glyphicon-bold:before { + content: "\e048"; } + +.glyphicon-italic:before { + content: "\e049"; } + +.glyphicon-text-height:before { + content: "\e050"; } + +.glyphicon-text-width:before { + content: "\e051"; } + +.glyphicon-align-left:before { + content: "\e052"; } + +.glyphicon-align-center:before { + content: "\e053"; } + +.glyphicon-align-right:before { + content: "\e054"; } + +.glyphicon-align-justify:before { + content: "\e055"; } + +.glyphicon-list:before { + content: "\e056"; } + +.glyphicon-indent-left:before { + content: "\e057"; } + +.glyphicon-indent-right:before { + content: "\e058"; } + +.glyphicon-facetime-video:before { + content: "\e059"; } + +.glyphicon-picture:before { + content: "\e060"; } + +.glyphicon-map-marker:before { + content: "\e062"; } + +.glyphicon-adjust:before { + content: "\e063"; } + +.glyphicon-tint:before { + content: "\e064"; } + +.glyphicon-edit:before { + content: "\e065"; } + +.glyphicon-share:before { + content: "\e066"; } + +.glyphicon-check:before { + content: "\e067"; } + +.glyphicon-move:before { + content: "\e068"; } + +.glyphicon-step-backward:before { + content: "\e069"; } + +.glyphicon-fast-backward:before { + content: "\e070"; } + +.glyphicon-backward:before { + content: "\e071"; } + +.glyphicon-play:before { + content: "\e072"; } + +.glyphicon-pause:before { + content: "\e073"; } + +.glyphicon-stop:before { + content: "\e074"; } + +.glyphicon-forward:before { + content: "\e075"; } + +.glyphicon-fast-forward:before { + content: "\e076"; } + +.glyphicon-step-forward:before { + content: "\e077"; } + +.glyphicon-eject:before { + content: "\e078"; } + +.glyphicon-chevron-left:before { + content: "\e079"; } + +.glyphicon-chevron-right:before { + content: "\e080"; } + +.glyphicon-plus-sign:before { + content: "\e081"; } + +.glyphicon-minus-sign:before { + content: "\e082"; } + +.glyphicon-remove-sign:before { + content: "\e083"; } + +.glyphicon-ok-sign:before { + content: "\e084"; } + +.glyphicon-question-sign:before { + content: "\e085"; } + +.glyphicon-info-sign:before { + content: "\e086"; } + +.glyphicon-screenshot:before { + content: "\e087"; } + +.glyphicon-remove-circle:before { + content: "\e088"; } + +.glyphicon-ok-circle:before { + content: "\e089"; } + +.glyphicon-ban-circle:before { + content: "\e090"; } + +.glyphicon-arrow-left:before { + content: "\e091"; } + +.glyphicon-arrow-right:before { + content: "\e092"; } + +.glyphicon-arrow-up:before { + content: "\e093"; } + +.glyphicon-arrow-down:before { + content: "\e094"; } + +.glyphicon-share-alt:before { + content: "\e095"; } + +.glyphicon-resize-full:before { + content: "\e096"; } + +.glyphicon-resize-small:before { + content: "\e097"; } + +.glyphicon-exclamation-sign:before { + content: "\e101"; } + +.glyphicon-gift:before { + content: "\e102"; } + +.glyphicon-leaf:before { + content: "\e103"; } + +.glyphicon-fire:before { + content: "\e104"; } + +.glyphicon-eye-open:before { + content: "\e105"; } + +.glyphicon-eye-close:before { + content: "\e106"; } + +.glyphicon-warning-sign:before { + content: "\e107"; } + +.glyphicon-plane:before { + content: "\e108"; } + +.glyphicon-calendar:before { + content: "\e109"; } + +.glyphicon-random:before { + content: "\e110"; } + +.glyphicon-comment:before { + content: "\e111"; } + +.glyphicon-magnet:before { + content: "\e112"; } + +.glyphicon-chevron-up:before { + content: "\e113"; } + +.glyphicon-chevron-down:before { + content: "\e114"; } + +.glyphicon-retweet:before { + content: "\e115"; } + +.glyphicon-shopping-cart:before { + content: "\e116"; } + +.glyphicon-folder-close:before { + content: "\e117"; } + +.glyphicon-folder-open:before { + content: "\e118"; } + +.glyphicon-resize-vertical:before { + content: "\e119"; } + +.glyphicon-resize-horizontal:before { + content: "\e120"; } + +.glyphicon-hdd:before { + content: "\e121"; } + +.glyphicon-bullhorn:before { + content: "\e122"; } + +.glyphicon-bell:before { + content: "\e123"; } + +.glyphicon-certificate:before { + content: "\e124"; } + +.glyphicon-thumbs-up:before { + content: "\e125"; } + +.glyphicon-thumbs-down:before { + content: "\e126"; } + +.glyphicon-hand-right:before { + content: "\e127"; } + +.glyphicon-hand-left:before { + content: "\e128"; } + +.glyphicon-hand-up:before { + content: "\e129"; } + +.glyphicon-hand-down:before { + content: "\e130"; } + +.glyphicon-circle-arrow-right:before { + content: "\e131"; } + +.glyphicon-circle-arrow-left:before { + content: "\e132"; } + +.glyphicon-circle-arrow-up:before { + content: "\e133"; } + +.glyphicon-circle-arrow-down:before { + content: "\e134"; } + +.glyphicon-globe:before { + content: "\e135"; } + +.glyphicon-wrench:before { + content: "\e136"; } + +.glyphicon-tasks:before { + content: "\e137"; } + +.glyphicon-filter:before { + content: "\e138"; } + +.glyphicon-briefcase:before { + content: "\e139"; } + +.glyphicon-fullscreen:before { + content: "\e140"; } + +.glyphicon-dashboard:before { + content: "\e141"; } + +.glyphicon-paperclip:before { + content: "\e142"; } + +.glyphicon-heart-empty:before { + content: "\e143"; } + +.glyphicon-link:before { + content: "\e144"; } + +.glyphicon-phone:before { + content: "\e145"; } + +.glyphicon-pushpin:before { + content: "\e146"; } + +.glyphicon-usd:before { + content: "\e148"; } + +.glyphicon-gbp:before { + content: "\e149"; } + +.glyphicon-sort:before { + content: "\e150"; } + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; } + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; } + +.glyphicon-sort-by-order:before { + content: "\e153"; } + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; } + +.glyphicon-sort-by-attributes:before { + content: "\e155"; } + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; } + +.glyphicon-unchecked:before { + content: "\e157"; } + +.glyphicon-expand:before { + content: "\e158"; } + +.glyphicon-collapse-down:before { + content: "\e159"; } + +.glyphicon-collapse-up:before { + content: "\e160"; } + +.glyphicon-log-in:before { + content: "\e161"; } + +.glyphicon-flash:before { + content: "\e162"; } + +.glyphicon-log-out:before { + content: "\e163"; } + +.glyphicon-new-window:before { + content: "\e164"; } + +.glyphicon-record:before { + content: "\e165"; } + +.glyphicon-save:before { + content: "\e166"; } + +.glyphicon-open:before { + content: "\e167"; } + +.glyphicon-saved:before { + content: "\e168"; } + +.glyphicon-import:before { + content: "\e169"; } + +.glyphicon-export:before { + content: "\e170"; } + +.glyphicon-send:before { + content: "\e171"; } + +.glyphicon-floppy-disk:before { + content: "\e172"; } + +.glyphicon-floppy-saved:before { + content: "\e173"; } + +.glyphicon-floppy-remove:before { + content: "\e174"; } + +.glyphicon-floppy-save:before { + content: "\e175"; } + +.glyphicon-floppy-open:before { + content: "\e176"; } + +.glyphicon-credit-card:before { + content: "\e177"; } + +.glyphicon-transfer:before { + content: "\e178"; } + +.glyphicon-cutlery:before { + content: "\e179"; } + +.glyphicon-header:before { + content: "\e180"; } + +.glyphicon-compressed:before { + content: "\e181"; } + +.glyphicon-earphone:before { + content: "\e182"; } + +.glyphicon-phone-alt:before { + content: "\e183"; } + +.glyphicon-tower:before { + content: "\e184"; } + +.glyphicon-stats:before { + content: "\e185"; } + +.glyphicon-sd-video:before { + content: "\e186"; } + +.glyphicon-hd-video:before { + content: "\e187"; } + +.glyphicon-subtitles:before { + content: "\e188"; } + +.glyphicon-sound-stereo:before { + content: "\e189"; } + +.glyphicon-sound-dolby:before { + content: "\e190"; } + +.glyphicon-sound-5-1:before { + content: "\e191"; } + +.glyphicon-sound-6-1:before { + content: "\e192"; } + +.glyphicon-sound-7-1:before { + content: "\e193"; } + +.glyphicon-copyright-mark:before { + content: "\e194"; } + +.glyphicon-registration-mark:before { + content: "\e195"; } + +.glyphicon-cloud-download:before { + content: "\e197"; } + +.glyphicon-cloud-upload:before { + content: "\e198"; } + +.glyphicon-tree-conifer:before { + content: "\e199"; } + +.glyphicon-tree-deciduous:before { + content: "\e200"; } + +.glyphicon-cd:before { + content: "\e201"; } + +.glyphicon-save-file:before { + content: "\e202"; } + +.glyphicon-open-file:before { + content: "\e203"; } + +.glyphicon-level-up:before { + content: "\e204"; } + +.glyphicon-copy:before { + content: "\e205"; } + +.glyphicon-paste:before { + content: "\e206"; } + +.glyphicon-alert:before { + content: "\e209"; } + +.glyphicon-equalizer:before { + content: "\e210"; } + +.glyphicon-king:before { + content: "\e211"; } + +.glyphicon-queen:before { + content: "\e212"; } + +.glyphicon-pawn:before { + content: "\e213"; } + +.glyphicon-bishop:before { + content: "\e214"; } + +.glyphicon-knight:before { + content: "\e215"; } + +.glyphicon-baby-formula:before { + content: "\e216"; } + +.glyphicon-tent:before { + content: "\26fa"; } + +.glyphicon-blackboard:before { + content: "\e218"; } + +.glyphicon-bed:before { + content: "\e219"; } + +.glyphicon-apple:before { + content: "\f8ff"; } + +.glyphicon-erase:before { + content: "\e221"; } + +.glyphicon-hourglass:before { + content: "\231b"; } + +.glyphicon-lamp:before { + content: "\e223"; } + +.glyphicon-duplicate:before { + content: "\e224"; } + +.glyphicon-piggy-bank:before { + content: "\e225"; } + +.glyphicon-scissors:before { + content: "\e226"; } + +.glyphicon-bitcoin:before { + content: "\e227"; } + +.glyphicon-btc:before { + content: "\e227"; } + +.glyphicon-xbt:before { + content: "\e227"; } + +.glyphicon-yen:before { + content: "\00a5"; } + +.glyphicon-jpy:before { + content: "\00a5"; } + +.glyphicon-ruble:before { + content: "\20bd"; } + +.glyphicon-rub:before { + content: "\20bd"; } + +.glyphicon-scale:before { + content: "\e230"; } + +.glyphicon-ice-lolly:before { + content: "\e231"; } + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; } + +.glyphicon-education:before { + content: "\e233"; } + +.glyphicon-option-horizontal:before { + content: "\e234"; } + +.glyphicon-option-vertical:before { + content: "\e235"; } + +.glyphicon-menu-hamburger:before { + content: "\e236"; } + +.glyphicon-modal-window:before { + content: "\e237"; } + +.glyphicon-oil:before { + content: "\e238"; } + +.glyphicon-grain:before { + content: "\e239"; } + +.glyphicon-sunglasses:before { + content: "\e240"; } + +.glyphicon-text-size:before { + content: "\e241"; } + +.glyphicon-text-color:before { + content: "\e242"; } + +.glyphicon-text-background:before { + content: "\e243"; } + +.glyphicon-object-align-top:before { + content: "\e244"; } + +.glyphicon-object-align-bottom:before { + content: "\e245"; } + +.glyphicon-object-align-horizontal:before { + content: "\e246"; } + +.glyphicon-object-align-left:before { + content: "\e247"; } + +.glyphicon-object-align-vertical:before { + content: "\e248"; } + +.glyphicon-object-align-right:before { + content: "\e249"; } + +.glyphicon-triangle-right:before { + content: "\e250"; } + +.glyphicon-triangle-left:before { + content: "\e251"; } + +.glyphicon-triangle-bottom:before { + content: "\e252"; } + +.glyphicon-triangle-top:before { + content: "\e253"; } + +.glyphicon-console:before { + content: "\e254"; } + +.glyphicon-superscript:before { + content: "\e255"; } + +.glyphicon-subscript:before { + content: "\e256"; } + +.glyphicon-menu-left:before { + content: "\e257"; } + +.glyphicon-menu-right:before { + content: "\e258"; } + +.glyphicon-menu-down:before { + content: "\e259"; } + +.glyphicon-menu-up:before { + content: "\e260"; } + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +body { + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.428571429; + color: #2B3E50; + background-color: #FFFFFF; } + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +a { + color: #DF691A; + text-decoration: none; } + a:hover, a:focus { + color: #DF691A; + text-decoration: underline; } + a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +figure { + margin: 0; } + +img { + vertical-align: middle; } + +.img-responsive { + display: block; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 0; } + +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #FFFFFF; + border: 1px solid #ddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; } + +.img-circle { + border-radius: 50%; } + +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #596a7b; } + +.sr-only, .view-type .caption { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +[role="button"] { + cursor: pointer; } + +h1, h2, h3, h4, .facets .facets-heading, h5, #documents .document .document-title-heading, h6, +.h1, .h2, .h3, .h4, .h5, span.constraints-label, .h6 { + font-family: inherit; + font-weight: 300; + line-height: 1.1; + color: inherit; } + h1 small, + h1 .small, h2 small, + h2 .small, h3 small, + h3 .small, h4 small, .facets .facets-heading small, + h4 .small, + .facets .facets-heading .small, h5 small, #documents .document .document-title-heading small, + h5 .small, + #documents .document .document-title-heading .small, h6 small, + h6 .small, + .h1 small, + .h1 .small, .h2 small, + .h2 .small, .h3 small, + .h3 .small, .h4 small, + .h4 .small, .h5 small, span.constraints-label small, + .h5 .small, + span.constraints-label .small, .h6 small, + .h6 .small { + font-weight: normal; + line-height: 1; + color: #2B3E50; } + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 21px; + margin-bottom: 10.5px; } + h1 small, + h1 .small, .h1 small, + .h1 .small, + h2 small, + h2 .small, .h2 small, + .h2 .small, + h3 small, + h3 .small, .h3 small, + .h3 .small { + font-size: 65%; } + +h4, .facets .facets-heading, .h4, +h5, +#documents .document .document-title-heading, .h5, span.constraints-label, +h6, .h6 { + margin-top: 10.5px; + margin-bottom: 10.5px; } + h4 small, .facets .facets-heading small, + h4 .small, + .facets .facets-heading .small, .h4 small, + .h4 .small, + h5 small, + #documents .document .document-title-heading small, + h5 .small, + #documents .document .document-title-heading .small, .h5 small, span.constraints-label small, + .h5 .small, + span.constraints-label .small, + h6 small, + h6 .small, .h6 small, + .h6 .small { + font-size: 75%; } + +h1, .h1 { + font-size: 39px; } + +h2, .h2 { + font-size: 32px; } + +h3, .h3 { + font-size: 26px; } + +h4, .facets .facets-heading, .h4 { + font-size: 19px; } + +h5, #documents .document .document-title-heading, .h5, span.constraints-label { + font-size: 15px; } + +h6, .h6 { + font-size: 13px; } + +p { + margin: 0 0 10.5px; } + +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; } + @media (min-width: 768px) { + .lead { + font-size: 22.5px; } } + +small, +.small { + font-size: 86%; } + +mark, +.mark { + background-color: rgba(240, 173, 78, 0.25); + padding: .2em; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.text-nowrap { + white-space: nowrap; } + +.text-lowercase { + text-transform: lowercase; } + +.text-uppercase, .initialism { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted, .appliedFilter .filterName:after, .facet-values .remove, .search_history .filterName, .search_history .filterSeparator { + color: #4E5D6C; } + +.text-primary { + color: #DF691A; } + +a.text-primary:hover { + color: #b15315; } + +.text-success, .facet-values li .selected { + color: #2B3E50; } + +a.text-success:hover, .facet-values li a.selected:hover { + color: #19242f; } + +.text-info { + color: #2B3E50; } + +a.text-info:hover { + color: #19242f; } + +.text-warning { + color: #2B3E50; } + +a.text-warning:hover { + color: #19242f; } + +.text-danger { + color: #2B3E50; } + +a.text-danger:hover { + color: #19242f; } + +.bg-primary { + color: #fff; } + +.bg-primary { + background-color: #DF691A; } + +a.bg-primary:hover { + background-color: #b15315; } + +.bg-success { + background-color: rgba(92, 184, 92, 0.25); } + +a.bg-success:hover { + background-color: rgba(68, 157, 68, 0.25); } + +.bg-info { + background-color: rgba(91, 192, 222, 0.25); } + +a.bg-info:hover { + background-color: rgba(49, 176, 213, 0.25); } + +.bg-warning { + background-color: rgba(240, 173, 78, 0.25); } + +a.bg-warning:hover { + background-color: rgba(236, 151, 31, 0.25); } + +.bg-danger { + background-color: rgba(217, 83, 79, 0.25); } + +a.bg-danger:hover { + background-color: rgba(201, 48, 44, 0.25); } + +.page-header { + padding-bottom: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #EBEBEB; } + +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; } + ul ul, + ul ol, + ol ul, + ol ol { + margin-bottom: 0; } + +.list-unstyled, ul.facet_extended_list, .facet_extended_list ul, .pivot-facet, .pivot-facet ul, .pivot-facet .pivot-facet { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; } + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; } + +dl { + margin-top: 0; + margin-bottom: 21px; } + +dt, +dd { + line-height: 1.428571429; } + +dt { + font-weight: bold; } + +dd { + margin-left: 0; } + +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; } +.dl-horizontal dd:after { + clear: both; } +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .dl-horizontal dd { + margin-left: 180px; } } + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #4E5D6C; } + +.initialism { + font-size: 90%; } + +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #4E5D6C; } + blockquote p:last-child, + blockquote ul:last-child, + blockquote ol:last-child { + margin-bottom: 0; } + blockquote footer, + blockquote small, + blockquote .small { + display: block; + font-size: 80%; + line-height: 1.428571429; + color: #2B3E50; } + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: '\2014 \00A0'; } + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #4E5D6C; + border-left: 0; + text-align: right; } + .blockquote-reverse footer:before, + .blockquote-reverse small:before, + .blockquote-reverse .small:before, + blockquote.pull-right footer:before, + blockquote.pull-right small:before, + blockquote.pull-right .small:before { + content: ''; } + .blockquote-reverse footer:after, + .blockquote-reverse small:after, + .blockquote-reverse .small:after, + blockquote.pull-right footer:after, + blockquote.pull-right small:after, + blockquote.pull-right .small:after { + content: '\00A0 \2014'; } + +address { + margin-bottom: 21px; + font-style: normal; + line-height: 1.428571429; } + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 0; } + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 0; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; } + +pre { + display: block; + padding: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 0; } + pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + .container:before, .container:after { + content: " "; + display: table; } + .container:after { + clear: both; } + @media (min-width: 768px) { + .container { + width: 750px; } } + @media (min-width: 992px) { + .container { + width: 970px; } } + @media (min-width: 1200px) { + .container { + width: 1170px; } } + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + .container-fluid:before, .container-fluid:after { + content: " "; + display: table; } + .container-fluid:after { + clear: both; } + +.row { + margin-left: -15px; + margin-right: -15px; } + .row:before, .row:after { + content: " "; + display: table; } + .row:after { + clear: both; } + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, #search-navbar .search-query-form, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; } + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } + +.col-xs-1 { + width: 8.3333333333%; } + +.col-xs-2 { + width: 16.6666666667%; } + +.col-xs-3 { + width: 25%; } + +.col-xs-4 { + width: 33.3333333333%; } + +.col-xs-5 { + width: 41.6666666667%; } + +.col-xs-6 { + width: 50%; } + +.col-xs-7 { + width: 58.3333333333%; } + +.col-xs-8 { + width: 66.6666666667%; } + +.col-xs-9 { + width: 75%; } + +.col-xs-10 { + width: 83.3333333333%; } + +.col-xs-11 { + width: 91.6666666667%; } + +.col-xs-12 { + width: 100%; } + +.col-xs-pull-0 { + right: auto; } + +.col-xs-pull-1 { + right: 8.3333333333%; } + +.col-xs-pull-2 { + right: 16.6666666667%; } + +.col-xs-pull-3 { + right: 25%; } + +.col-xs-pull-4 { + right: 33.3333333333%; } + +.col-xs-pull-5 { + right: 41.6666666667%; } + +.col-xs-pull-6 { + right: 50%; } + +.col-xs-pull-7 { + right: 58.3333333333%; } + +.col-xs-pull-8 { + right: 66.6666666667%; } + +.col-xs-pull-9 { + right: 75%; } + +.col-xs-pull-10 { + right: 83.3333333333%; } + +.col-xs-pull-11 { + right: 91.6666666667%; } + +.col-xs-pull-12 { + right: 100%; } + +.col-xs-push-0 { + left: auto; } + +.col-xs-push-1 { + left: 8.3333333333%; } + +.col-xs-push-2 { + left: 16.6666666667%; } + +.col-xs-push-3 { + left: 25%; } + +.col-xs-push-4 { + left: 33.3333333333%; } + +.col-xs-push-5 { + left: 41.6666666667%; } + +.col-xs-push-6 { + left: 50%; } + +.col-xs-push-7 { + left: 58.3333333333%; } + +.col-xs-push-8 { + left: 66.6666666667%; } + +.col-xs-push-9 { + left: 75%; } + +.col-xs-push-10 { + left: 83.3333333333%; } + +.col-xs-push-11 { + left: 91.6666666667%; } + +.col-xs-push-12 { + left: 100%; } + +.col-xs-offset-0 { + margin-left: 0%; } + +.col-xs-offset-1 { + margin-left: 8.3333333333%; } + +.col-xs-offset-2 { + margin-left: 16.6666666667%; } + +.col-xs-offset-3 { + margin-left: 25%; } + +.col-xs-offset-4 { + margin-left: 33.3333333333%; } + +.col-xs-offset-5 { + margin-left: 41.6666666667%; } + +.col-xs-offset-6 { + margin-left: 50%; } + +.col-xs-offset-7 { + margin-left: 58.3333333333%; } + +.col-xs-offset-8 { + margin-left: 66.6666666667%; } + +.col-xs-offset-9 { + margin-left: 75%; } + +.col-xs-offset-10 { + margin-left: 83.3333333333%; } + +.col-xs-offset-11 { + margin-left: 91.6666666667%; } + +.col-xs-offset-12 { + margin-left: 100%; } + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; } + + .col-sm-1 { + width: 8.3333333333%; } + + .col-sm-2 { + width: 16.6666666667%; } + + .col-sm-3 { + width: 25%; } + + .col-sm-4 { + width: 33.3333333333%; } + + .col-sm-5 { + width: 41.6666666667%; } + + .col-sm-6 { + width: 50%; } + + .col-sm-7 { + width: 58.3333333333%; } + + .col-sm-8 { + width: 66.6666666667%; } + + .col-sm-9 { + width: 75%; } + + .col-sm-10 { + width: 83.3333333333%; } + + .col-sm-11 { + width: 91.6666666667%; } + + .col-sm-12 { + width: 100%; } + + .col-sm-pull-0 { + right: auto; } + + .col-sm-pull-1 { + right: 8.3333333333%; } + + .col-sm-pull-2 { + right: 16.6666666667%; } + + .col-sm-pull-3 { + right: 25%; } + + .col-sm-pull-4 { + right: 33.3333333333%; } + + .col-sm-pull-5 { + right: 41.6666666667%; } + + .col-sm-pull-6 { + right: 50%; } + + .col-sm-pull-7 { + right: 58.3333333333%; } + + .col-sm-pull-8 { + right: 66.6666666667%; } + + .col-sm-pull-9 { + right: 75%; } + + .col-sm-pull-10 { + right: 83.3333333333%; } + + .col-sm-pull-11 { + right: 91.6666666667%; } + + .col-sm-pull-12 { + right: 100%; } + + .col-sm-push-0 { + left: auto; } + + .col-sm-push-1 { + left: 8.3333333333%; } + + .col-sm-push-2 { + left: 16.6666666667%; } + + .col-sm-push-3 { + left: 25%; } + + .col-sm-push-4 { + left: 33.3333333333%; } + + .col-sm-push-5 { + left: 41.6666666667%; } + + .col-sm-push-6 { + left: 50%; } + + .col-sm-push-7 { + left: 58.3333333333%; } + + .col-sm-push-8 { + left: 66.6666666667%; } + + .col-sm-push-9 { + left: 75%; } + + .col-sm-push-10 { + left: 83.3333333333%; } + + .col-sm-push-11 { + left: 91.6666666667%; } + + .col-sm-push-12 { + left: 100%; } + + .col-sm-offset-0 { + margin-left: 0%; } + + .col-sm-offset-1 { + margin-left: 8.3333333333%; } + + .col-sm-offset-2 { + margin-left: 16.6666666667%; } + + .col-sm-offset-3 { + margin-left: 25%; } + + .col-sm-offset-4 { + margin-left: 33.3333333333%; } + + .col-sm-offset-5 { + margin-left: 41.6666666667%; } + + .col-sm-offset-6 { + margin-left: 50%; } + + .col-sm-offset-7 { + margin-left: 58.3333333333%; } + + .col-sm-offset-8 { + margin-left: 66.6666666667%; } + + .col-sm-offset-9 { + margin-left: 75%; } + + .col-sm-offset-10 { + margin-left: 83.3333333333%; } + + .col-sm-offset-11 { + margin-left: 91.6666666667%; } + + .col-sm-offset-12 { + margin-left: 100%; } } +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, #search-navbar .search-query-form, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; } + + .col-md-1 { + width: 8.3333333333%; } + + .col-md-2 { + width: 16.6666666667%; } + + .col-md-3 { + width: 25%; } + + .col-md-4 { + width: 33.3333333333%; } + + .col-md-5 { + width: 41.6666666667%; } + + .col-md-6 { + width: 50%; } + + .col-md-7 { + width: 58.3333333333%; } + + .col-md-8, #search-navbar .search-query-form { + width: 66.6666666667%; } + + .col-md-9 { + width: 75%; } + + .col-md-10 { + width: 83.3333333333%; } + + .col-md-11 { + width: 91.6666666667%; } + + .col-md-12 { + width: 100%; } + + .col-md-pull-0 { + right: auto; } + + .col-md-pull-1 { + right: 8.3333333333%; } + + .col-md-pull-2 { + right: 16.6666666667%; } + + .col-md-pull-3 { + right: 25%; } + + .col-md-pull-4 { + right: 33.3333333333%; } + + .col-md-pull-5 { + right: 41.6666666667%; } + + .col-md-pull-6 { + right: 50%; } + + .col-md-pull-7 { + right: 58.3333333333%; } + + .col-md-pull-8 { + right: 66.6666666667%; } + + .col-md-pull-9 { + right: 75%; } + + .col-md-pull-10 { + right: 83.3333333333%; } + + .col-md-pull-11 { + right: 91.6666666667%; } + + .col-md-pull-12 { + right: 100%; } + + .col-md-push-0 { + left: auto; } + + .col-md-push-1 { + left: 8.3333333333%; } + + .col-md-push-2 { + left: 16.6666666667%; } + + .col-md-push-3 { + left: 25%; } + + .col-md-push-4 { + left: 33.3333333333%; } + + .col-md-push-5 { + left: 41.6666666667%; } + + .col-md-push-6 { + left: 50%; } + + .col-md-push-7 { + left: 58.3333333333%; } + + .col-md-push-8 { + left: 66.6666666667%; } + + .col-md-push-9 { + left: 75%; } + + .col-md-push-10 { + left: 83.3333333333%; } + + .col-md-push-11 { + left: 91.6666666667%; } + + .col-md-push-12 { + left: 100%; } + + .col-md-offset-0 { + margin-left: 0%; } + + .col-md-offset-1 { + margin-left: 8.3333333333%; } + + .col-md-offset-2 { + margin-left: 16.6666666667%; } + + .col-md-offset-3 { + margin-left: 25%; } + + .col-md-offset-4 { + margin-left: 33.3333333333%; } + + .col-md-offset-5 { + margin-left: 41.6666666667%; } + + .col-md-offset-6 { + margin-left: 50%; } + + .col-md-offset-7 { + margin-left: 58.3333333333%; } + + .col-md-offset-8 { + margin-left: 66.6666666667%; } + + .col-md-offset-9 { + margin-left: 75%; } + + .col-md-offset-10 { + margin-left: 83.3333333333%; } + + .col-md-offset-11 { + margin-left: 91.6666666667%; } + + .col-md-offset-12 { + margin-left: 100%; } } +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; } + + .col-lg-1 { + width: 8.3333333333%; } + + .col-lg-2 { + width: 16.6666666667%; } + + .col-lg-3 { + width: 25%; } + + .col-lg-4 { + width: 33.3333333333%; } + + .col-lg-5 { + width: 41.6666666667%; } + + .col-lg-6 { + width: 50%; } + + .col-lg-7 { + width: 58.3333333333%; } + + .col-lg-8 { + width: 66.6666666667%; } + + .col-lg-9 { + width: 75%; } + + .col-lg-10 { + width: 83.3333333333%; } + + .col-lg-11 { + width: 91.6666666667%; } + + .col-lg-12 { + width: 100%; } + + .col-lg-pull-0 { + right: auto; } + + .col-lg-pull-1 { + right: 8.3333333333%; } + + .col-lg-pull-2 { + right: 16.6666666667%; } + + .col-lg-pull-3 { + right: 25%; } + + .col-lg-pull-4 { + right: 33.3333333333%; } + + .col-lg-pull-5 { + right: 41.6666666667%; } + + .col-lg-pull-6 { + right: 50%; } + + .col-lg-pull-7 { + right: 58.3333333333%; } + + .col-lg-pull-8 { + right: 66.6666666667%; } + + .col-lg-pull-9 { + right: 75%; } + + .col-lg-pull-10 { + right: 83.3333333333%; } + + .col-lg-pull-11 { + right: 91.6666666667%; } + + .col-lg-pull-12 { + right: 100%; } + + .col-lg-push-0 { + left: auto; } + + .col-lg-push-1 { + left: 8.3333333333%; } + + .col-lg-push-2 { + left: 16.6666666667%; } + + .col-lg-push-3 { + left: 25%; } + + .col-lg-push-4 { + left: 33.3333333333%; } + + .col-lg-push-5 { + left: 41.6666666667%; } + + .col-lg-push-6 { + left: 50%; } + + .col-lg-push-7 { + left: 58.3333333333%; } + + .col-lg-push-8 { + left: 66.6666666667%; } + + .col-lg-push-9 { + left: 75%; } + + .col-lg-push-10 { + left: 83.3333333333%; } + + .col-lg-push-11 { + left: 91.6666666667%; } + + .col-lg-push-12 { + left: 100%; } + + .col-lg-offset-0 { + margin-left: 0%; } + + .col-lg-offset-1 { + margin-left: 8.3333333333%; } + + .col-lg-offset-2 { + margin-left: 16.6666666667%; } + + .col-lg-offset-3 { + margin-left: 25%; } + + .col-lg-offset-4 { + margin-left: 33.3333333333%; } + + .col-lg-offset-5 { + margin-left: 41.6666666667%; } + + .col-lg-offset-6 { + margin-left: 50%; } + + .col-lg-offset-7 { + margin-left: 58.3333333333%; } + + .col-lg-offset-8 { + margin-left: 66.6666666667%; } + + .col-lg-offset-9 { + margin-left: 75%; } + + .col-lg-offset-10 { + margin-left: 83.3333333333%; } + + .col-lg-offset-11 { + margin-left: 91.6666666667%; } + + .col-lg-offset-12 { + margin-left: 100%; } } +table { + background-color: #FFF; } + +caption { + padding-top: 6px; + padding-bottom: 6px; + color: #4E5D6C; + text-align: left; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; } + .table > thead > tr > th, + .table > thead > tr > td, + .table > tbody > tr > th, + .table > tbody > tr > td, + .table > tfoot > tr > th, + .table > tfoot > tr > td { + padding: 6px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #EBEBEB; } + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #EBEBEB; } + .table > caption + thead > tr:first-child > th, + .table > caption + thead > tr:first-child > td, + .table > colgroup + thead > tr:first-child > th, + .table > colgroup + thead > tr:first-child > td, + .table > thead:first-child > tr:first-child > th, + .table > thead:first-child > tr:first-child > td { + border-top: 0; } + .table > tbody + tbody { + border-top: 2px solid #EBEBEB; } + .table .table { + background-color: #FFFFFF; } + +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 3px; } + +.table-bordered { + border: 1px solid #EBEBEB; } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td, + .table-bordered > tbody > tr > th, + .table-bordered > tbody > tr > td, + .table-bordered > tfoot > tr > th, + .table-bordered > tfoot > tr > td { + border: 1px solid #EBEBEB; } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td { + border-bottom-width: 2px; } + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #EBEBEB; } + +.table-hover > tbody > tr:hover { + background-color: #e3e3e3; } + +table col[class*="col-"] { + position: static; + float: none; + display: table-column; } + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; } + +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.table > tfoot > tr.active > th { + background-color: #e3e3e3; } + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: #d7d7d7; } + +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: rgba(92, 184, 92, 0.25); } + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { + background-color: rgba(76, 174, 76, 0.25); } + +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: rgba(91, 192, 222, 0.25); } + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: rgba(70, 184, 218, 0.25); } + +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: rgba(240, 173, 78, 0.25); } + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: rgba(238, 162, 54, 0.25); } + +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: rgba(217, 83, 79, 0.25); } + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { + background-color: rgba(212, 63, 58, 0.25); } + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; } + @media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #EBEBEB; } + .table-responsive > .table { + margin-bottom: 0; } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; } + .table-responsive > .table-bordered { + border: 0; } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } } + +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; } + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #2B3E50; + border: 0; + border-bottom: 1px solid #4E5D6C; } + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } + +input[type="file"] { + display: block; } + +input[type="range"] { + display: block; + width: 100%; } + +select[multiple], +select[size] { + height: auto; } + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +output { + display: block; + padding-top: 9px; + font-size: 15px; + line-height: 1.428571429; + color: #2B3E50; } + +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 16px; + font-size: 15px; + line-height: 1.428571429; + color: #2B3E50; + background-color: #fff; + background-image: none; + border: 1px solid #EBEBEB; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } + .form-control:focus { + border-color: #6ea8e5; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(110, 168, 229, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(110, 168, 229, 0.6); } + .form-control::-moz-placeholder { + color: #999; + opacity: 1; } + .form-control:-ms-input-placeholder { + color: #999; } + .form-control::-webkit-input-placeholder { + color: #999; } + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #EBEBEB; + opacity: 1; } + .form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed; } + +textarea.form-control { + height: auto; } + +input[type="search"] { + -webkit-appearance: none; } + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] { + line-height: 39px; } + input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, + .input-group-sm > input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="date"].btn, + .input-group-sm > .input-group-btn > input[type="date"].facets-toggle, .input-group-sm input[type="date"], + input[type="time"].input-sm, + .input-group-sm > input[type="time"].form-control, + .input-group-sm > input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="time"].btn, + .input-group-sm > .input-group-btn > input[type="time"].facets-toggle, + .input-group-sm input[type="time"], + input[type="datetime-local"].input-sm, + .input-group-sm > input[type="datetime-local"].form-control, + .input-group-sm > input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, + .input-group-sm > .input-group-btn > input[type="datetime-local"].facets-toggle, + .input-group-sm input[type="datetime-local"], + input[type="month"].input-sm, + .input-group-sm > input[type="month"].form-control, + .input-group-sm > input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="month"].btn, + .input-group-sm > .input-group-btn > input[type="month"].facets-toggle, + .input-group-sm input[type="month"] { + line-height: 31px; } + input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, + .input-group-lg > input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="date"].btn, + .input-group-lg > .input-group-btn > input[type="date"].facets-toggle, .input-group-lg input[type="date"], input[type="time"].input-lg, .input-group-lg > input[type="time"].form-control, + .input-group-lg > input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="time"].btn, + .input-group-lg > .input-group-btn > input[type="time"].facets-toggle, .input-group-lg input[type="time"], input[type="datetime-local"].input-lg, .input-group-lg > input[type="datetime-local"].form-control, + .input-group-lg > input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, + .input-group-lg > .input-group-btn > input[type="datetime-local"].facets-toggle, .input-group-lg input[type="datetime-local"], input[type="month"].input-lg, .input-group-lg > input[type="month"].form-control, + .input-group-lg > input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="month"].btn, + .input-group-lg > .input-group-btn > input[type="month"].facets-toggle, .input-group-lg input[type="month"] { + line-height: 52px; } } +.form-group { + margin-bottom: 15px; } + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; } + .radio label, + .checkbox label { + min-height: 21px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; } + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; } + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + +input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], +input[type="checkbox"][disabled], +input[type="checkbox"].disabled, +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } + +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } + +.radio.disabled label, fieldset[disabled] .radio label, +.checkbox.disabled label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } + +.form-control-static { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; } + .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, + .input-group-lg > .form-control-static.input-group-addon, + .input-group-lg > .input-group-btn > .form-control-static.btn, + .input-group-lg > .input-group-btn > .form-control-static.facets-toggle, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, + .input-group-sm > .form-control-static.input-group-addon, + .input-group-sm > .input-group-btn > .form-control-static.btn, + .input-group-sm > .input-group-btn > .form-control-static.facets-toggle { + padding-left: 0; + padding-right: 0; } + +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn, +.input-group-sm > .input-group-btn > .facets-toggle { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; } + +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn, +.input-group-sm > .input-group-btn > select.facets-toggle { + height: 31px; + line-height: 31px; } + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +.input-group-sm > .input-group-btn > textarea.facets-toggle, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn, +.input-group-sm > .input-group-btn > select[multiple].facets-toggle { + height: auto; } + +.form-group-sm .form-control { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; } +.form-group-sm select.form-control { + height: 31px; + line-height: 31px; } +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; } +.form-group-sm .form-control-static { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + min-height: 34px; } + +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn, +.input-group-lg > .input-group-btn > .facets-toggle { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; } + +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn, +.input-group-lg > .input-group-btn > select.facets-toggle { + height: 52px; + line-height: 52px; } + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +.input-group-lg > .input-group-btn > textarea.facets-toggle, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn, +.input-group-lg > .input-group-btn > select[multiple].facets-toggle { + height: auto; } + +.form-group-lg .form-control { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; } +.form-group-lg select.form-control { + height: 52px; + line-height: 52px; } +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; } +.form-group-lg .form-control-static { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + min-height: 40px; } + +.has-feedback { + position: relative; } + .has-feedback .form-control { + padding-right: 48.75px; } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + text-align: center; + pointer-events: none; } + +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, +.input-group-lg > .input-group-btn > .facets-toggle + .form-control-feedback { + width: 52px; + height: 52px; + line-height: 52px; } + +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, +.input-group-sm > .input-group-btn > .facets-toggle + .form-control-feedback { + width: 31px; + height: 31px; + line-height: 31px; } + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { + color: #2B3E50; } +.has-success .form-control { + border-color: #2B3E50; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-success .form-control:focus { + border-color: #19242f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; } +.has-success .input-group-addon { + color: #2B3E50; + border-color: #2B3E50; + background-color: rgba(92, 184, 92, 0.25); } +.has-success .form-control-feedback { + color: #2B3E50; } + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { + color: #2B3E50; } +.has-warning .form-control { + border-color: #2B3E50; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-warning .form-control:focus { + border-color: #19242f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; } +.has-warning .input-group-addon { + color: #2B3E50; + border-color: #2B3E50; + background-color: rgba(240, 173, 78, 0.25); } +.has-warning .form-control-feedback { + color: #2B3E50; } + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { + color: #2B3E50; } +.has-error .form-control { + border-color: #2B3E50; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-error .form-control:focus { + border-color: #19242f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #4f7192; } +.has-error .input-group-addon { + color: #2B3E50; + border-color: #2B3E50; + background-color: rgba(217, 83, 79, 0.25); } +.has-error .form-control-feedback { + color: #2B3E50; } + +.has-feedback label ~ .form-control-feedback { + top: 26px; } +.has-feedback label.sr-only ~ .form-control-feedback, .has-feedback .view-type label.caption ~ .form-control-feedback, .view-type .has-feedback label.caption ~ .form-control-feedback { + top: 0; } + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #587ea3; } + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + .form-inline .form-control-static { + display: inline-block; } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; } + .form-inline .input-group > .form-control { + width: 100%; } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + .form-inline .has-feedback .form-control-feedback { + top: 0; } } + +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; } +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; } +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; } + .form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; } + .form-horizontal .form-group:after { + clear: both; } +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; } } +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; } +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 16.9999996px; } } +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; } } + +.btn, .facets-toggle { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 16px; + font-size: 15px; + line-height: 1.428571429; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .btn:focus, .facets-toggle:focus, .btn.focus, .focus.facets-toggle, .btn:active:focus, .facets-toggle:active:focus, .btn:active.focus, .facets-toggle:active.focus, .btn.active:focus, .active.facets-toggle:focus, .btn.active.focus, .active.focus.facets-toggle { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + .btn:hover, .facets-toggle:hover, .btn:focus, .facets-toggle:focus, .btn.focus, .focus.facets-toggle { + color: #fff; + text-decoration: none; } + .btn:active, .facets-toggle:active, .btn.active, .active.facets-toggle { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn.disabled, .disabled.facets-toggle, .btn[disabled], [disabled].facets-toggle, fieldset[disabled] .btn, fieldset[disabled] .facets-toggle { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; } + +.btn-default, .facets-toggle { + color: #fff; + background-color: #4E5D6C; + border-color: #fff; } + .btn-default:hover, .facets-toggle:hover, .btn-default:focus, .facets-toggle:focus, .btn-default.focus, .focus.facets-toggle, .btn-default:active, .facets-toggle:active, .btn-default.active, .active.facets-toggle, .open > .btn-default.dropdown-toggle, .open > .dropdown-toggle.facets-toggle { + color: #fff; + background-color: #39444e; + border-color: #e0e0e0; } + .btn-default:active, .facets-toggle:active, .btn-default.active, .active.facets-toggle, .open > .btn-default.dropdown-toggle, .open > .dropdown-toggle.facets-toggle { + background-image: none; } + .btn-default.disabled, .disabled.facets-toggle, .btn-default.disabled:hover, .disabled.facets-toggle:hover, .btn-default.disabled:focus, .disabled.facets-toggle:focus, .btn-default.disabled.focus, .disabled.focus.facets-toggle, .btn-default.disabled:active, .disabled.facets-toggle:active, .btn-default.disabled.active, .disabled.active.facets-toggle, .btn-default[disabled], [disabled].facets-toggle, .btn-default[disabled]:hover, [disabled].facets-toggle:hover, .btn-default[disabled]:focus, [disabled].facets-toggle:focus, .btn-default[disabled].focus, [disabled].focus.facets-toggle, .btn-default[disabled]:active, [disabled].facets-toggle:active, .btn-default[disabled].active, [disabled].active.facets-toggle, fieldset[disabled] .btn-default, fieldset[disabled] .facets-toggle, fieldset[disabled] .btn-default:hover, fieldset[disabled] .facets-toggle:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .facets-toggle:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .focus.facets-toggle, fieldset[disabled] .btn-default:active, fieldset[disabled] .facets-toggle:active, fieldset[disabled] .btn-default.active, fieldset[disabled] .active.facets-toggle { + background-color: #4E5D6C; + border-color: #fff; } + .btn-default .badge, .facets-toggle .badge { + color: #4E5D6C; + background-color: #fff; } + +.btn-primary { + color: #fff; + background-color: #DF691A; + border-color: #FFF; } + .btn-primary:hover, .btn-primary:focus, .btn-primary.focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #b15315; + border-color: #e0e0e0; } + .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + background-image: none; } + .btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { + background-color: #DF691A; + border-color: #FFF; } + .btn-primary .badge { + color: #DF691A; + background-color: #fff; } + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #FFF; } + .btn-success:hover, .btn-success:focus, .btn-success.focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #e0e0e0; } + .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + background-image: none; } + .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #FFF; } + .btn-success .badge { + color: #5cb85c; + background-color: #fff; } + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #FFF; } + .btn-info:hover, .btn-info:focus, .btn-info.focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #e0e0e0; } + .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + background-image: none; } + .btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #FFF; } + .btn-info .badge { + color: #5bc0de; + background-color: #fff; } + +.btn-warning { + color: #fff; + background-color: #eb9053; + border-color: #FFF; } + .btn-warning:hover, .btn-warning:focus, .btn-warning.focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #e67225; + border-color: #e0e0e0; } + .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + background-image: none; } + .btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { + background-color: #eb9053; + border-color: #FFF; } + .btn-warning .badge { + color: #eb9053; + background-color: #fff; } + +.btn-danger, .appliedFilter .remove:hover, .appliedFilter .remove:active { + color: #fff; + background-color: #d9534f; + border-color: #FFF; } + .btn-danger:hover, .appliedFilter .remove:hover, .btn-danger:focus, .appliedFilter .remove:focus:hover, .appliedFilter .remove:focus:active, .btn-danger.focus, .appliedFilter .focus.remove:hover, .appliedFilter .focus.remove:active, .btn-danger:active, .appliedFilter .remove:active, .btn-danger.active, .appliedFilter .active.remove:hover, .appliedFilter .active.remove:active, .open > .btn-danger.dropdown-toggle, .appliedFilter .open > .dropdown-toggle.remove:hover, .appliedFilter .open > .dropdown-toggle.remove:active { + color: #fff; + background-color: #c9302c; + border-color: #e0e0e0; } + .btn-danger:active, .appliedFilter .remove:active, .btn-danger.active, .appliedFilter .active.remove:hover, .appliedFilter .active.remove:active, .open > .btn-danger.dropdown-toggle, .appliedFilter .open > .dropdown-toggle.remove:hover, .appliedFilter .open > .dropdown-toggle.remove:active { + background-image: none; } + .btn-danger.disabled, .appliedFilter .disabled.remove:hover, .appliedFilter .disabled.remove:active, .btn-danger.disabled:hover, .appliedFilter .disabled.remove:hover, .btn-danger.disabled:focus, .appliedFilter .disabled.remove:focus:hover, .appliedFilter .disabled.remove:focus:active, .btn-danger.disabled.focus, .appliedFilter .disabled.focus.remove:hover, .appliedFilter .disabled.focus.remove:active, .btn-danger.disabled:active, .appliedFilter .disabled.remove:active, .btn-danger.disabled.active, .appliedFilter .disabled.active.remove:hover, .appliedFilter .disabled.active.remove:active, .btn-danger[disabled], .appliedFilter [disabled].remove:hover, .appliedFilter [disabled].remove:active, .btn-danger[disabled]:hover, .appliedFilter [disabled].remove:hover, .btn-danger[disabled]:focus, .appliedFilter [disabled].remove:focus:hover, .appliedFilter [disabled].remove:focus:active, .btn-danger[disabled].focus, .appliedFilter [disabled].focus.remove:hover, .appliedFilter [disabled].focus.remove:active, .btn-danger[disabled]:active, .appliedFilter [disabled].remove:active, .btn-danger[disabled].active, .appliedFilter [disabled].active.remove:hover, .appliedFilter [disabled].active.remove:active, fieldset[disabled] .btn-danger, fieldset[disabled] .appliedFilter .remove:hover, .appliedFilter fieldset[disabled] .remove:hover, fieldset[disabled] .appliedFilter .remove:active, .appliedFilter fieldset[disabled] .remove:active, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .appliedFilter .remove:hover, .appliedFilter fieldset[disabled] .remove:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .appliedFilter .remove:focus:hover, .appliedFilter fieldset[disabled] .remove:focus:hover, fieldset[disabled] .appliedFilter .remove:focus:active, .appliedFilter fieldset[disabled] .remove:focus:active, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .appliedFilter .focus.remove:hover, .appliedFilter fieldset[disabled] .focus.remove:hover, fieldset[disabled] .appliedFilter .focus.remove:active, .appliedFilter fieldset[disabled] .focus.remove:active, fieldset[disabled] .btn-danger:active, fieldset[disabled] .appliedFilter .remove:active, .appliedFilter fieldset[disabled] .remove:active, fieldset[disabled] .btn-danger.active, fieldset[disabled] .appliedFilter .active.remove:hover, .appliedFilter fieldset[disabled] .active.remove:hover, fieldset[disabled] .appliedFilter .active.remove:active, .appliedFilter fieldset[disabled] .active.remove:active { + background-color: #d9534f; + border-color: #FFF; } + .btn-danger .badge, .appliedFilter .remove:hover .badge, .appliedFilter .remove:active .badge { + color: #d9534f; + background-color: #fff; } + +.btn-link { + color: #DF691A; + font-weight: normal; + border-radius: 0; } + .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } + .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; } + .btn-link:hover, .btn-link:focus { + color: #DF691A; + text-decoration: underline; + background-color: transparent; } + .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #4E5D6C; + text-decoration: none; } + +.btn-lg, .btn-group-lg > .btn, .btn-group-lg > .facets-toggle { + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; } + +.btn-sm, .btn-group-sm > .btn, .btn-group-sm > .facets-toggle { + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; } + +.btn-xs, .btn-group-xs > .btn, .btn-group-xs > .facets-toggle { + padding: 1px 5px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; } + +.btn-block { + display: block; + width: 100%; } + +.btn-block + .btn-block { + margin-top: 5px; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } + .fade.in, .no-js #sidebar .fade.collapse { + opacity: 1; } + +.collapse { + display: none; } + .collapse.in, .no-js #sidebar .collapse { + display: block; } + +tr.collapse.in, .no-js #sidebar tr.collapse { + display: table-row; } + +tbody.collapse.in, .no-js #sidebar tbody.collapse { + display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } + +.dropup, +.dropdown { + position: relative; } + +.dropdown-toggle:focus { + outline: 0; } + +.dropdown-menu, .twitter-typeahead .tt-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #4E5D6C; + border: 1px solid #FFF; + border: 1px solid #FFF; + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; } + .dropdown-menu.pull-right, .twitter-typeahead .pull-right.tt-menu { + right: 0; + left: auto; } + .dropdown-menu .divider, .twitter-typeahead .tt-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #FFFFFF; } + .dropdown-menu > li > a, .twitter-typeahead .tt-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #FFF; + white-space: nowrap; } + +.dropdown-menu > li > a:hover, .twitter-typeahead .tt-menu > li > a:hover, .dropdown-menu > li > a:focus, .twitter-typeahead .tt-menu > li > a:focus { + text-decoration: none; + color: #f7f7f7; + background-color: #485563; } + +.dropdown-menu > .active > a, .twitter-typeahead .tt-menu > .active > a, .dropdown-menu > .active > a:hover, .twitter-typeahead .tt-menu > .active > a:hover, .dropdown-menu > .active > a:focus, .twitter-typeahead .tt-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #DF691A; } + +.dropdown-menu > .disabled > a, .twitter-typeahead .tt-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .twitter-typeahead .tt-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus, .twitter-typeahead .tt-menu > .disabled > a:focus { + color: #FFFFFF; } +.dropdown-menu > .disabled > a:hover, .twitter-typeahead .tt-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus, .twitter-typeahead .tt-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; } + +.open > .dropdown-menu, .twitter-typeahead .open > .tt-menu { + display: block; } +.open > a { + outline: 0; } + +.dropdown-menu-right { + left: auto; + right: 0; } + +.dropdown-menu-left { + left: 0; + right: auto; } + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 13px; + line-height: 1.428571429; + color: #FFFFFF; + white-space: nowrap; } + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; } + +.pull-right > .dropdown-menu, .twitter-typeahead .pull-right > .tt-menu { + right: 0; + left: auto; } + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; } +.dropup .dropdown-menu, .dropup .twitter-typeahead .tt-menu, .twitter-typeahead .dropup .tt-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu, +.navbar-fixed-bottom .dropdown .twitter-typeahead .tt-menu, +.twitter-typeahead .navbar-fixed-bottom .dropdown .tt-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; } + +@media (min-width: 768px) { + .navbar-right .dropdown-menu, .navbar-right .twitter-typeahead .tt-menu, .twitter-typeahead .navbar-right .tt-menu { + right: 0; + left: auto; } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; } } +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; } + .btn-group > .btn, .btn-group > .facets-toggle, + .btn-group-vertical > .btn, + .btn-group-vertical > .facets-toggle { + position: relative; + float: left; } + .btn-group > .btn:hover, .btn-group > .facets-toggle:hover, .btn-group > .btn:focus, .btn-group > .facets-toggle:focus, .btn-group > .btn:active, .btn-group > .facets-toggle:active, .btn-group > .btn.active, .btn-group > .active.facets-toggle, + .btn-group-vertical > .btn:hover, + .btn-group-vertical > .facets-toggle:hover, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .facets-toggle:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .facets-toggle:active, + .btn-group-vertical > .btn.active, + .btn-group-vertical > .active.facets-toggle { + z-index: 2; } + +.btn-group .btn + .btn, .btn-group .facets-toggle + .btn, .btn-group .btn + .facets-toggle, .btn-group .facets-toggle + .facets-toggle, +.btn-group .btn + .btn-group, +.btn-group .facets-toggle + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .facets-toggle, +.btn-group .btn-group + .btn-group { + margin-left: -1px; } + +.btn-toolbar { + margin-left: -5px; } + .btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; } + .btn-toolbar:after { + clear: both; } + .btn-toolbar .btn-group, + .btn-toolbar .input-group { + float: left; } + .btn-toolbar > .btn, .btn-toolbar > .facets-toggle, + .btn-toolbar > .btn-group, + .btn-toolbar > .input-group { + margin-left: 5px; } + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle), .btn-group > .facets-toggle:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; } + +.btn-group > .btn:first-child, .btn-group > .facets-toggle:first-child { + margin-left: 0; } + .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle), .btn-group > .facets-toggle:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), .btn-group > .facets-toggle:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + +.btn-group > .btn-group { + float: left; } + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group > .btn-group:not(:first-child):not(:last-child) > .facets-toggle { + border-radius: 0; } + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .facets-toggle:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group > .btn-group:last-child:not(:first-child) > .facets-toggle:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; } + +.btn-group > .btn + .dropdown-toggle, .btn-group > .facets-toggle + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; } + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle, .btn-group-lg.btn-group > .facets-toggle + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; } + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } + +.btn .caret, .facets-toggle .caret { + margin-left: 0; } + +.btn-lg .caret, .btn-group-lg > .btn .caret, .btn-group-lg > .facets-toggle .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret, .dropup .btn-group-lg > .facets-toggle .caret { + border-width: 0 5px 5px; } + +.btn-group-vertical > .btn, .btn-group-vertical > .facets-toggle, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn, +.btn-group-vertical > .btn-group > .facets-toggle { + display: block; + float: none; + width: 100%; + max-width: 100%; } +.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; } +.btn-group-vertical > .btn-group:after { + clear: both; } +.btn-group-vertical > .btn-group > .btn, .btn-group-vertical > .btn-group > .facets-toggle { + float: none; } +.btn-group-vertical > .btn + .btn, .btn-group-vertical > .facets-toggle + .btn, .btn-group-vertical > .btn + .facets-toggle, .btn-group-vertical > .facets-toggle + .facets-toggle, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .facets-toggle + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .facets-toggle, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; } + +.btn-group-vertical > .btn:not(:first-child):not(:last-child), .btn-group-vertical > .facets-toggle:not(:first-child):not(:last-child) { + border-radius: 0; } +.btn-group-vertical > .btn:first-child:not(:last-child), .btn-group-vertical > .facets-toggle:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } +.btn-group-vertical > .btn:last-child:not(:first-child), .btn-group-vertical > .facets-toggle:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .facets-toggle { + border-radius: 0; } + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .facets-toggle:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group-vertical > .btn-group:last-child:not(:first-child) > .facets-toggle:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + .btn-group-justified > .btn, .btn-group-justified > .facets-toggle, + .btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; } + .btn-group-justified > .btn-group .btn, .btn-group-justified > .btn-group .facets-toggle { + width: 100%; } + .btn-group-justified > .btn-group .dropdown-menu, .btn-group-justified > .btn-group .twitter-typeahead .tt-menu, .twitter-typeahead .btn-group-justified > .btn-group .tt-menu { + left: auto; } + +[data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .facets-toggle input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .facets-toggle input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .facets-toggle input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .facets-toggle input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: table; + border-collapse: separate; } + .input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; } + .input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; } + .input-group-addon:not(:first-child):not(:last-child), + .input-group-btn:not(:first-child):not(:last-child), + .input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; } + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; } + +.input-group-addon { + padding: 8px 16px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #2B3E50; + text-align: center; + background-color: #4E5D6C; + border: 1px solid #FFF; + border-radius: 0; } + .input-group-addon.input-sm, + .input-group-sm > .input-group-addon, + .input-group-sm > .input-group-btn > .input-group-addon.btn, + .input-group-sm > .input-group-btn > .input-group-addon.facets-toggle { + padding: 5px 10px; + font-size: 13px; + border-radius: 0; } + .input-group-addon.input-lg, + .input-group-lg > .input-group-addon, + .input-group-lg > .input-group-btn > .input-group-addon.btn, + .input-group-lg > .input-group-btn > .input-group-addon.facets-toggle { + padding: 12px 24px; + font-size: 19px; + border-radius: 0; } + .input-group-addon input[type="radio"], + .input-group-addon input[type="checkbox"] { + margin-top: 0; } + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .facets-toggle, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .btn-group > .facets-toggle, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .facets-toggle:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn, +.input-group-btn:last-child > .btn-group:not(:last-child) > .facets-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.input-group-addon:first-child { + border-right: 0; } + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .facets-toggle, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .btn-group > .facets-toggle, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .facets-toggle:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn, +.input-group-btn:first-child > .btn-group:not(:first-child) > .facets-toggle { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + +.input-group-addon:last-child { + border-left: 0; } + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; } + .input-group-btn > .btn, .input-group-btn > .facets-toggle { + position: relative; } + .input-group-btn > .btn + .btn, .input-group-btn > .facets-toggle + .btn, .input-group-btn > .btn + .facets-toggle, .input-group-btn > .facets-toggle + .facets-toggle { + margin-left: -1px; } + .input-group-btn > .btn:hover, .input-group-btn > .facets-toggle:hover, .input-group-btn > .btn:focus, .input-group-btn > .facets-toggle:focus, .input-group-btn > .btn:active, .input-group-btn > .facets-toggle:active { + z-index: 2; } + .input-group-btn:first-child > .btn, .input-group-btn:first-child > .facets-toggle, + .input-group-btn:first-child > .btn-group { + margin-right: -1px; } + .input-group-btn:last-child > .btn, .input-group-btn:last-child > .facets-toggle, + .input-group-btn:last-child > .btn-group { + margin-left: -1px; } + +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; } + .nav:before, .nav:after { + content: " "; + display: table; } + .nav:after { + clear: both; } + .nav > li { + position: relative; + display: block; } + .nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } + .nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #EBEBEB; } + .nav > li.disabled > a { + color: #4E5D6C; } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #4E5D6C; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; } + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #EBEBEB; + border-color: #DF691A; } + .nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; } + .nav > li > a > img { + max-width: none; } + +.nav-tabs { + border-bottom: 1px solid #EBEBEB; } + .nav-tabs > li { + float: left; + margin-bottom: -1px; } + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 0 0 0 0; } + .nav-tabs > li > a:hover { + border-color: #EBEBEB #EBEBEB #EBEBEB; } + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #2B3E50; + background-color: #FFFFFF; + border: 1px solid #EBEBEB; + border-bottom-color: transparent; + cursor: default; } + +.nav-pills > li { + float: left; } + .nav-pills > li > a { + border-radius: 0; } + .nav-pills > li + li { + margin-left: 2px; } + .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + color: #fff; + background-color: #DF691A; } + +.nav-stacked > li { + float: none; } + .nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; } + .nav-justified > li, .nav-tabs.nav-justified > li { + float: none; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; } + .nav-justified > .dropdown .dropdown-menu, .nav-justified > .dropdown .twitter-typeahead .tt-menu, .twitter-typeahead .nav-justified > .dropdown .tt-menu { + top: auto; + left: auto; } + @media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } } + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; } + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 0; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, + .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #4E5D6C; } + @media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #4E5D6C; + border-radius: 0 0 0 0; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #4E5D6C; } } + +.tab-content > .tab-pane { + display: none; } +.tab-content > .active { + display: block; } + +.nav-tabs .dropdown-menu, .nav-tabs .twitter-typeahead .tt-menu, .twitter-typeahead .nav-tabs .tt-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.navbar { + position: relative; + min-height: 40px; + margin-bottom: 21px; + border: 1px solid transparent; } + .navbar:before, .navbar:after { + content: " "; + display: table; } + .navbar:after { + clear: both; } + @media (min-width: 768px) { + .navbar { + border-radius: 0; } } + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; } +.navbar-header:after { + clear: both; } +@media (min-width: 768px) { + .navbar-header { + float: left; } } + +.navbar-collapse, #facet-panel-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; } + .navbar-collapse:before, #facet-panel-collapse:before, .navbar-collapse:after, #facet-panel-collapse:after { + content: " "; + display: table; } + .navbar-collapse:after, #facet-panel-collapse:after { + clear: both; } + .navbar-collapse.in, .no-js #sidebar .navbar-collapse.collapse, .no-js #sidebar .collapse#facet-panel-collapse, .in#facet-panel-collapse { + overflow-y: auto; } + @media (min-width: 768px) { + .navbar-collapse, #facet-panel-collapse { + width: auto; + border-top: 0; + box-shadow: none; } + .navbar-collapse.collapse, .collapse#facet-panel-collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; } + .navbar-collapse.in, .no-js #sidebar .navbar-collapse.collapse, .no-js #sidebar .collapse#facet-panel-collapse, .in#facet-panel-collapse { + overflow-y: visible; } + .navbar-fixed-top .navbar-collapse, .navbar-fixed-top #facet-panel-collapse, .navbar-static-top .navbar-collapse, .navbar-static-top #facet-panel-collapse, .navbar-fixed-bottom .navbar-collapse, .navbar-fixed-bottom #facet-panel-collapse { + padding-left: 0; + padding-right: 0; } } + +.navbar-fixed-top .navbar-collapse, .navbar-fixed-top #facet-panel-collapse, +.navbar-fixed-bottom .navbar-collapse, +.navbar-fixed-bottom #facet-panel-collapse { + max-height: 340px; } + @media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, .navbar-fixed-top #facet-panel-collapse, + .navbar-fixed-bottom .navbar-collapse, + .navbar-fixed-bottom #facet-panel-collapse { + max-height: 200px; } } + +.container > .navbar-header, +.container > .navbar-collapse, +.container > #facet-panel-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse, +.container-fluid > #facet-panel-collapse { + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container > #facet-panel-collapse, + .container-fluid > .navbar-header, + .container-fluid > .navbar-collapse, + .container-fluid > #facet-panel-collapse { + margin-right: 0; + margin-left: 0; } } + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; } + @media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; } } + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; } + @media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; } } + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; } + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } + +.navbar-brand { + float: left; + padding: 9.5px 15px; + font-size: 19px; + line-height: 21px; + height: 40px; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + .navbar-brand > img { + display: block; } + @media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; } } + +.navbar-toggle, .facets-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 3px; + margin-bottom: 3px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; } + .navbar-toggle:focus, .facets-toggle:focus { + outline: 0; } + .navbar-toggle .icon-bar, .facets-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; } + .navbar-toggle .icon-bar + .icon-bar, .facets-toggle .icon-bar + .icon-bar { + margin-top: 4px; } + @media (min-width: 768px) { + .navbar-toggle, .facets-toggle { + display: none; } } + +.navbar-nav { + margin: 4.75px -15px; } + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; } + @media (max-width: 767px) { + .navbar-nav .open .dropdown-menu, .navbar-nav .open .twitter-typeahead .tt-menu, .twitter-typeahead .navbar-nav .open .tt-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; } + .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .twitter-typeahead .tt-menu > li > a, .twitter-typeahead .navbar-nav .open .tt-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header, + .navbar-nav .open .twitter-typeahead .tt-menu .dropdown-header, + .twitter-typeahead .navbar-nav .open .tt-menu .dropdown-header { + padding: 5px 15px 5px 25px; } + .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .twitter-typeahead .tt-menu > li > a, .twitter-typeahead .navbar-nav .open .tt-menu > li > a { + line-height: 21px; } + .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .twitter-typeahead .tt-menu > li > a:hover, .twitter-typeahead .navbar-nav .open .tt-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-nav .open .twitter-typeahead .tt-menu > li > a:focus, .twitter-typeahead .navbar-nav .open .tt-menu > li > a:focus { + background-image: none; } } + @media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; } + .navbar-nav > li { + float: left; } + .navbar-nav > li > a { + padding-top: 9.5px; + padding-bottom: 9.5px; } } + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 0.5px; + margin-bottom: 0.5px; } + @media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + .navbar-form .form-control-static { + display: inline-block; } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; } + .navbar-form .input-group > .form-control { + width: 100%; } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + .navbar-form .has-feedback .form-control-feedback { + top: 0; } } + @media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; } + .navbar-form .form-group:last-child { + margin-bottom: 0; } } + @media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; } } + +.navbar-nav > li > .dropdown-menu, .twitter-typeahead .navbar-nav > li > .tt-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu, .navbar-fixed-bottom .twitter-typeahead .navbar-nav > li > .tt-menu, .twitter-typeahead .navbar-fixed-bottom .navbar-nav > li > .tt-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.navbar-btn { + margin-top: 0.5px; + margin-bottom: 0.5px; } + .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn, .btn-group-sm > .navbar-btn.facets-toggle { + margin-top: 4.5px; + margin-bottom: 4.5px; } + .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn, .btn-group-xs > .navbar-btn.facets-toggle { + margin-top: 9px; + margin-bottom: 9px; } + +.navbar-text { + margin-top: 9.5px; + margin-bottom: 9.5px; } + @media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; } } + +@media (min-width: 768px) { + .navbar-left { + float: left !important; } + + .navbar-right { + float: right !important; + margin-right: -15px; } + .navbar-right ~ .navbar-right { + margin-right: 0; } } +.navbar-default { + background-color: #4E5D6C; + border-color: #FFF; } + .navbar-default .navbar-brand { + color: #EBEBEB; } + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #EBEBEB; + background-color: #FFF; } + .navbar-default .navbar-text { + color: #2B3E50; } + .navbar-default .navbar-nav > li > a { + color: #EBEBEB; } + .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #EBEBEB; + background-color: #485563; } + .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #EBEBEB; + background-color: #485563; } + .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: #FFF; } + .navbar-default .navbar-toggle, .navbar-default .facets-toggle { + border-color: #FFF; } + .navbar-default .navbar-toggle:hover, .navbar-default .facets-toggle:hover, .navbar-default .navbar-toggle:focus, .navbar-default .facets-toggle:focus { + background-color: #485563; } + .navbar-default .navbar-toggle .icon-bar, .navbar-default .facets-toggle .icon-bar { + background-color: #2B3E50; } + .navbar-default .navbar-collapse, .navbar-default #facet-panel-collapse, + .navbar-default .navbar-form { + border-color: #FFF; } + .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #485563; + color: #EBEBEB; } + @media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > li > a, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > li > a { + color: #EBEBEB; } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > li > a:hover, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > li > a:focus, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > li > a:focus { + color: #EBEBEB; + background-color: #485563; } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .active > a, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .active > a:hover, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .active > a:focus, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .active > a:focus { + color: #EBEBEB; + background-color: #485563; } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a:hover, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus, .navbar-default .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a:focus, .twitter-typeahead .navbar-default .navbar-nav .open .tt-menu > .disabled > a:focus { + color: #ccc; + background-color: #FFF; } } + .navbar-default .navbar-link { + color: #EBEBEB; } + .navbar-default .navbar-link:hover { + color: #EBEBEB; } + .navbar-default .btn-link { + color: #EBEBEB; } + .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #EBEBEB; } + .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #DF691A; + border-color: #FFF; } + .navbar-inverse .navbar-brand { + color: #2B3E50; } + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #2B3E50; + background-color: #FFF; } + .navbar-inverse .navbar-text { + color: #2B3E50; } + .navbar-inverse .navbar-nav > li > a { + color: #2B3E50; } + .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #2B3E50; + background-color: #c85e17; } + .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #2B3E50; + background-color: #c85e17; } + .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: #FFF; } + .navbar-inverse .navbar-toggle, .navbar-inverse .facets-toggle { + border-color: #FFF; } + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .facets-toggle:hover, .navbar-inverse .navbar-toggle:focus, .navbar-inverse .facets-toggle:focus { + background-color: #c85e17; } + .navbar-inverse .navbar-toggle .icon-bar, .navbar-inverse .facets-toggle .icon-bar { + background-color: #2B3E50; } + .navbar-inverse .navbar-collapse, .navbar-inverse #facet-panel-collapse, + .navbar-inverse .navbar-form { + border-color: #bf5a16; } + .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #c85e17; + color: #2B3E50; } + @media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .dropdown-header, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .dropdown-header { + border-color: #FFF; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu .divider, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu .divider { + background-color: #FFF; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > li > a, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > li > a { + color: #2B3E50; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > li > a:hover, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > li > a:focus, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > li > a:focus { + color: #2B3E50; + background-color: #c85e17; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .active > a, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .active > a:hover, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .active > a:focus, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .active > a:focus { + color: #2B3E50; + background-color: #c85e17; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a:hover, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus, .navbar-inverse .navbar-nav .open .twitter-typeahead .tt-menu > .disabled > a:focus, .twitter-typeahead .navbar-inverse .navbar-nav .open .tt-menu > .disabled > a:focus { + color: #444; + background-color: #FFF; } } + .navbar-inverse .navbar-link { + color: #2B3E50; } + .navbar-inverse .navbar-link:hover { + color: #2B3E50; } + .navbar-inverse .btn-link { + color: #2B3E50; } + .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #2B3E50; } + .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #EBEBEB; + border-radius: 0; } + .breadcrumb > li { + display: inline-block; } + .breadcrumb > li + li:before { + content: "/ "; + padding: 0 5px; + color: #2B3E50; } + .breadcrumb > .active { + color: #2B3E50; } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; } + .pagination > li { + display: inline; } + .pagination > li > a, + .pagination > li > span { + position: relative; + float: left; + padding: 8px 16px; + line-height: 1.428571429; + text-decoration: none; + color: #2B3E50; + background-color: #EBEBEB; + border: 1px solid #FFF; + margin-left: -1px; } + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .pagination > li > a:hover, .pagination > li > a:focus, + .pagination > li > span:hover, + .pagination > li > span:focus { + color: #2B3E50; + background-color: #e3e3e3; + border-color: #FFF; } + .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, + .pagination > .active > span, + .pagination > .active > span:hover, + .pagination > .active > span:focus { + z-index: 2; + color: #2B3E50; + background-color: rgba(230, 147, 23, 0.3); + border-color: #FFF; + cursor: default; } + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #cacaca; + background-color: #4E5D6C; + border-color: #FFF; + cursor: not-allowed; } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 12px 24px; + font-size: 19px; } +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 13px; } +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; } + .pager:before, .pager:after { + content: " "; + display: table; } + .pager:after { + clear: both; } + .pager li { + display: inline; } + .pager li > a, + .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #EBEBEB; + border: 1px solid #FFF; + border-radius: 15px; } + .pager li > a:hover, + .pager li > a:focus { + text-decoration: none; + background-color: #e3e3e3; } + .pager .next > a, + .pager .next > span { + float: right; } + .pager .previous > a, + .pager .previous > span { + float: left; } + .pager .disabled > a, + .pager .disabled > a:hover, + .pager .disabled > a:focus, + .pager .disabled > span { + color: #cacaca; + background-color: #EBEBEB; + cursor: not-allowed; } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + .label:empty { + display: none; } + .btn .label, .facets-toggle .label { + position: relative; + top: -1px; } + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label-default { + background-color: #4E5D6C; } + .label-default[href]:hover, .label-default[href]:focus { + background-color: #39444e; } + +.label-primary { + background-color: #DF691A; } + .label-primary[href]:hover, .label-primary[href]:focus { + background-color: #b15315; } + +.label-success { + background-color: #5cb85c; } + .label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; } + +.label-info { + background-color: #5bc0de; } + .label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; } + +.label-warning { + background-color: #eb9053; } + .label-warning[href]:hover, .label-warning[href]:focus { + background-color: #e67225; } + +.label-danger { + background-color: #d9534f; } + .label-danger[href]:hover, .label-danger[href]:focus { + background-color: #c9302c; } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 13px; + font-weight: 300; + color: #2B3E50; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #EBEBEB; + border-radius: 10px; } + .badge:empty { + display: none; } + .btn .badge, .facets-toggle .badge { + position: relative; + top: -1px; } + .btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .facets-toggle .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .facets-toggle .badge { + top: 0; + padding: 1px 5px; } + .list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #DF691A; + background-color: #fff; } + .list-group-item > .badge { + float: right; } + .list-group-item > .badge + .badge { + margin-right: 5px; } + .nav-pills > li > a > .badge { + margin-left: 3px; } + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #4E5D6C; } + .jumbotron h1, + .jumbotron .h1 { + color: inherit; } + .jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; } + .jumbotron > hr { + border-top-color: #39444e; } + .container .jumbotron, .container-fluid .jumbotron { + border-radius: 0; } + .jumbotron .container { + max-width: 100%; } + @media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; } + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; } + .jumbotron h1, + .jumbotron .h1 { + font-size: 67.5px; } } + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.428571429; + background-color: #FFFFFF; + border: 1px solid #ddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; } + .thumbnail > img, + .thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; } + .thumbnail .caption { + padding: 9px; + color: #2B3E50; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #DF691A; } + +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; } + .alert h4, .alert .facets .facets-heading, .facets .alert .facets-heading { + margin-top: 0; + color: inherit; } + .alert .alert-link { + font-weight: bold; } + .alert > p, + .alert > ul { + margin-bottom: 0; } + .alert > p + p { + margin-top: 5px; } + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; } + .alert-dismissable .close, + .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.alert-success { + background-color: rgba(92, 184, 92, 0.25); + border-color: #FFF; + color: #2B3E50; } + .alert-success hr { + border-top-color: #f2f2f2; } + .alert-success .alert-link { + color: #19242f; } + +.alert-info { + background-color: rgba(91, 192, 222, 0.25); + border-color: #FFF; + color: #2B3E50; } + .alert-info hr { + border-top-color: #f2f2f2; } + .alert-info .alert-link { + color: #19242f; } + +.alert-warning { + background-color: rgba(240, 173, 78, 0.25); + border-color: #FFF; + color: #2B3E50; } + .alert-warning hr { + border-top-color: #f2f2f2; } + .alert-warning .alert-link { + color: #19242f; } + +.alert-danger { + background-color: rgba(217, 83, 79, 0.25); + border-color: #FFF; + color: #2B3E50; } + .alert-danger hr { + border-top-color: #f2f2f2; } + .alert-danger .alert-link { + color: #19242f; } + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } +.progress { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #4E5D6C; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 13px; + line-height: 21px; + color: #fff; + text-align: center; + background-color: #DF691A; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; } + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; } + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } + +.progress-bar-success { + background-color: #5cb85c; } + .progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-info { + background-color: #5bc0de; } + .progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-warning { + background-color: #eb9053; } + .progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-danger { + background-color: #d9534f; } + .progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.media { + margin-top: 15px; } + .media:first-child { + margin-top: 0; } + +.media, +.media-body { + zoom: 1; + overflow: hidden; } + +.media-body { + width: 10000px; } + +.media-object { + display: block; } + +.media-right, +.media > .pull-right { + padding-left: 10px; } + +.media-left, +.media > .pull-left { + padding-right: 10px; } + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; } + +.media-middle { + vertical-align: middle; } + +.media-bottom { + vertical-align: bottom; } + +.media-heading { + margin-top: 0; + margin-bottom: 5px; } + +.media-list { + padding-left: 0; + list-style: none; } + +.list-group { + margin-bottom: 20px; + padding-left: 0; } + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #4E5D6C; + border: 1px solid #FFF; } + .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +a.list-group-item { + color: #2B3E50; } + a.list-group-item .list-group-item-heading { + color: #2B3E50; } + a.list-group-item:hover, a.list-group-item:focus { + text-decoration: none; + color: #2B3E50; + background-color: #e3e3e3; } + +.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + background-color: #EBEBEB; + color: #4E5D6C; + cursor: not-allowed; } + .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } + .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: #4E5D6C; } +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #DF691A; + border-color: #DF691A; } + .list-group-item.active .list-group-item-heading, + .list-group-item.active .list-group-item-heading > small, + .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, + .list-group-item.active:hover .list-group-item-heading > small, + .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, + .list-group-item.active:focus .list-group-item-heading > small, + .list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } + .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: #f9decc; } + +.list-group-item-success { + color: #2B3E50; + background-color: rgba(92, 184, 92, 0.25); } + +a.list-group-item-success { + color: #2B3E50; } + a.list-group-item-success .list-group-item-heading { + color: inherit; } + a.list-group-item-success:hover, a.list-group-item-success:focus { + color: #2B3E50; + background-color: rgba(76, 174, 76, 0.25); } + a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus { + color: #fff; + background-color: #2B3E50; + border-color: #2B3E50; } + +.list-group-item-info { + color: #2B3E50; + background-color: rgba(91, 192, 222, 0.25); } + +a.list-group-item-info { + color: #2B3E50; } + a.list-group-item-info .list-group-item-heading { + color: inherit; } + a.list-group-item-info:hover, a.list-group-item-info:focus { + color: #2B3E50; + background-color: rgba(70, 184, 218, 0.25); } + a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus { + color: #fff; + background-color: #2B3E50; + border-color: #2B3E50; } + +.list-group-item-warning { + color: #2B3E50; + background-color: rgba(240, 173, 78, 0.25); } + +a.list-group-item-warning { + color: #2B3E50; } + a.list-group-item-warning .list-group-item-heading { + color: inherit; } + a.list-group-item-warning:hover, a.list-group-item-warning:focus { + color: #2B3E50; + background-color: rgba(238, 162, 54, 0.25); } + a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus { + color: #fff; + background-color: #2B3E50; + border-color: #2B3E50; } + +.list-group-item-danger { + color: #2B3E50; + background-color: rgba(217, 83, 79, 0.25); } + +a.list-group-item-danger { + color: #2B3E50; } + a.list-group-item-danger .list-group-item-heading { + color: inherit; } + a.list-group-item-danger:hover, a.list-group-item-danger:focus { + color: #2B3E50; + background-color: rgba(212, 63, 58, 0.25); } + a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus { + color: #fff; + background-color: #2B3E50; + border-color: #2B3E50; } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; } + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; } + +.panel { + margin-bottom: 21px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } + +.panel-body { + padding: 15px; } + .panel-body:before, .panel-body:after { + content: " "; + display: table; } + .panel-body:after { + clear: both; } + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; } + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + color: inherit; } + .panel-title > a, + .panel-title > small, + .panel-title > .small, + .panel-title > small > a, + .panel-title > .small > a { + color: inherit; } + +.panel-footer { + padding: 10px 15px; + background-color: #e3e3e3; + border-top: 1px solid #FFF; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; } + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; } + .panel > .list-group .list-group-item, + .panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } + .panel > .list-group:first-child .list-group-item:first-child, + .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: -1; + border-top-left-radius: -1; } + .panel > .list-group:last-child .list-group-item:last-child, + .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; } + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } + +.list-group + .panel-footer { + border-top-width: 0; } + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; } + .panel > .table caption, + .panel > .table-responsive > .table caption, + .panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; } +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; } + .panel > .table:first-child > thead:first-child > tr:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: -1; + border-top-right-radius: -1; } + .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: -1; } + .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: -1; } +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; } + .panel > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: -1; + border-bottom-right-radius: -1; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: -1; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: -1; } +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #EBEBEB; } +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; } +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; } + .panel > .table-bordered > thead > tr > th:first-child, + .panel > .table-bordered > thead > tr > td:first-child, + .panel > .table-bordered > tbody > tr > th:first-child, + .panel > .table-bordered > tbody > tr > td:first-child, + .panel > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-bordered > tfoot > tr > td:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + .panel > .table-bordered > thead > tr > th:last-child, + .panel > .table-bordered > thead > tr > td:last-child, + .panel > .table-bordered > tbody > tr > th:last-child, + .panel > .table-bordered > tbody > tr > td:last-child, + .panel > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-bordered > tfoot > tr > td:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + .panel > .table-bordered > thead > tr:first-child > td, + .panel > .table-bordered > thead > tr:first-child > th, + .panel > .table-bordered > tbody > tr:first-child > td, + .panel > .table-bordered > tbody > tr:first-child > th, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } + .panel > .table-bordered > tbody > tr:last-child > td, + .panel > .table-bordered > tbody > tr:last-child > th, + .panel > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-bordered > tfoot > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } +.panel > .table-responsive { + border: 0; + margin-bottom: 0; } + +.panel-group { + margin-bottom: 21px; } + .panel-group .panel { + margin-bottom: 0; + border-radius: 0; } + .panel-group .panel + .panel { + margin-top: 5px; } + .panel-group .panel-heading { + border-bottom: 0; } + .panel-group .panel-heading + .panel-collapse > .panel-body, + .panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #FFF; } + .panel-group .panel-footer { + border-top: 0; } + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #FFF; } + +.panel-default { + border-color: #EBEBEB; } + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #EBEBEB; } + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #EBEBEB; } + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; } + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #EBEBEB; } + +.panel-primary { + border-color: #FFF; } + .panel-primary > .panel-heading { + color: #fff; + background-color: #DF691A; + border-color: #FFF; } + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #FFF; } + .panel-primary > .panel-heading .badge { + color: #DF691A; + background-color: #fff; } + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #FFF; } + +.panel-success, .facet_limit-active { + border-color: #FFF; } + .panel-success > .panel-heading, .facet_limit-active > .panel-heading { + color: #2B3E50; + background-color: rgba(92, 184, 92, 0.25); + border-color: #FFF; } + .panel-success > .panel-heading + .panel-collapse > .panel-body, .facet_limit-active > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #FFF; } + .panel-success > .panel-heading .badge, .facet_limit-active > .panel-heading .badge { + color: rgba(92, 184, 92, 0.25); + background-color: #2B3E50; } + .panel-success > .panel-footer + .panel-collapse > .panel-body, .facet_limit-active > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #FFF; } + +.panel-info { + border-color: #FFF; } + .panel-info > .panel-heading { + color: #2B3E50; + background-color: rgba(91, 192, 222, 0.25); + border-color: #FFF; } + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #FFF; } + .panel-info > .panel-heading .badge { + color: rgba(91, 192, 222, 0.25); + background-color: #2B3E50; } + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #FFF; } + +.panel-warning { + border-color: #FFF; } + .panel-warning > .panel-heading { + color: #2B3E50; + background-color: rgba(240, 173, 78, 0.25); + border-color: #FFF; } + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #FFF; } + .panel-warning > .panel-heading .badge { + color: rgba(240, 173, 78, 0.25); + background-color: #2B3E50; } + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #FFF; } + +.panel-danger { + border-color: #FFF; } + .panel-danger > .panel-heading { + color: #2B3E50; + background-color: rgba(217, 83, 79, 0.25); + border-color: #FFF; } + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #FFF; } + .panel-danger > .panel-heading .badge { + color: rgba(217, 83, 79, 0.25); + background-color: #2B3E50; } + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #FFF; } + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; } + +.embed-responsive-16by9 { + padding-bottom: 56.25%; } + +.embed-responsive-4by3 { + padding-bottom: 75%; } + +.well, .constraints-container { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: transparent; + border: 1px solid #EBEBEB; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } + .well blockquote, .constraints-container blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); } + +.well-lg { + padding: 24px; + border-radius: 0; } + +.well-sm { + padding: 9px; + border-radius: 0; } + +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #2B3E50; + text-shadow: none; + opacity: 0.2; + filter: alpha(opacity=20); } + .close:hover, .close:focus { + color: #2B3E50; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; } + +.modal-open { + overflow: hidden; } + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + -webkit-overflow-scrolling: touch; + outline: 0; } + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; } + .modal.in .modal-dialog, .no-js #sidebar .modal.collapse .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); } + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; } + +.modal-content { + position: relative; + background-color: #FFF; + border: 1px solid #FFF; + border: 1px solid #FFF; + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); } + .modal-backdrop.in, .no-js #sidebar .modal-backdrop.collapse { + opacity: 0.5; + filter: alpha(opacity=50); } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #FFFFFF; + min-height: 16.428571429px; } + +.modal-header .close { + margin-top: -2px; } + +.modal-title { + margin: 0; + line-height: 1.428571429; } + +.modal-body { + position: relative; + padding: 20px; } + +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #FFFFFF; } + .modal-footer:before, .modal-footer:after { + content: " "; + display: table; } + .modal-footer:after { + clear: both; } + .modal-footer .btn + .btn, .modal-footer .facets-toggle + .btn, .modal-footer .btn + .facets-toggle, .modal-footer .facets-toggle + .facets-toggle { + margin-left: 5px; + margin-bottom: 0; } + .modal-footer .btn-group .btn + .btn, .modal-footer .btn-group .facets-toggle + .btn, .modal-footer .btn-group .btn + .facets-toggle, .modal-footer .btn-group .facets-toggle + .facets-toggle { + margin-left: -1px; } + .modal-footer .btn-block + .btn-block { + margin-left: 0; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } + + .modal-sm { + width: 300px; } } +@media (min-width: 992px) { + .modal-lg { + width: 900px; } } +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); } + .tooltip.in, .no-js #sidebar .tooltip.collapse { + opacity: 0.9; + filter: alpha(opacity=90); } + .tooltip.top { + margin-top: -3px; + padding: 5px 0; } + .tooltip.right { + margin-left: 3px; + padding: 0 5px; } + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; } + .tooltip.left { + margin-left: -3px; + padding: 0 5px; } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 0; } + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + font-weight: normal; + line-height: 1.428571429; + text-align: left; + background-color: #4E5D6C; + background-clip: padding-box; + border: 1px solid #FFF; + border: 1px solid #FFF; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; } + .popover.top { + margin-top: -10px; } + .popover.right { + margin-left: 10px; } + .popover.bottom { + margin-top: 10px; } + .popover.left { + margin-left: -10px; } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #e3e3e3; + border-bottom: 1px solid #d7d7d7; + border-radius: -1 -1 0 0; } + +.popover-content { + padding: 9px 14px; } + +.popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.popover > .arrow { + border-width: 11px; } + +.popover > .arrow:after { + border-width: 10px; + content: ""; } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #FFF; + border-top-color: #FFF; + bottom: -11px; } + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #4E5D6C; } +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #FFF; + border-right-color: #FFF; } + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #4E5D6C; } +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #FFF; + border-bottom-color: #FFF; + top: -11px; } + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #4E5D6C; } +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #FFF; + border-left-color: #FFF; } + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #4E5D6C; + bottom: -10px; } + +.carousel { + position: relative; } + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; } + .carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; } + .carousel-inner > .item > img, + .carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; } + @media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + -moz-perspective: 1000; + perspective: 1000; } + .carousel-inner > .item.next, .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; } } + .carousel-inner > .active, + .carousel-inner > .next, + .carousel-inner > .prev { + display: block; } + .carousel-inner > .active { + left: 0; } + .carousel-inner > .next, + .carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; } + .carousel-inner > .next { + left: 100%; } + .carousel-inner > .prev { + left: -100%; } + .carousel-inner > .next.left, + .carousel-inner > .prev.right { + left: 0; } + .carousel-inner > .active.left { + left: -100%; } + .carousel-inner > .active.right { + left: 100%; } + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } + .carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); } + .carousel-control .icon-prev, + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; } + .carousel-control .icon-prev, + .carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; } + .carousel-control .icon-prev:before { + content: '\2039'; } + .carousel-control .icon-next:before { + content: '\203a'; } + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; } + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); } + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + .carousel-caption .btn, .carousel-caption .facets-toggle { + text-shadow: none; } + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; } + + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; } + + .carousel-indicators { + bottom: 20px; } } +.clearfix:before, .pagination-search-widgets:before, .no-js #sortAndPerPage:before, #documents .document:before, #sidebar:before, #facets:before, .facet_pagination:before, #ajax-modal .modal-content:before, .clearfix:after, .pagination-search-widgets:after, .no-js #sortAndPerPage:after, #documents .document:after, #sidebar:after, #facets:after, .facet_pagination:after, #ajax-modal .modal-content:after { + content: " "; + display: table; } +.clearfix:after, .pagination-search-widgets:after, .no-js #sortAndPerPage:after, #documents .document:after, #sidebar:after, #facets:after, .facet_pagination:after, #ajax-modal .modal-content:after { + clear: both; } + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; } + +.pull-right { + float: right !important; } + +.pull-left { + float: left !important; } + +.hide { + display: none !important; } + +.show { + display: block !important; } + +.invisible { + visibility: hidden; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.hidden { + display: none !important; } + +.affix { + position: fixed; } + +@-ms-viewport { + width: device-width; } +.visible-xs { + display: none !important; } + +.visible-sm { + display: none !important; } + +.visible-md { + display: none !important; } + +.visible-lg { + display: none !important; } + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; } + +@media (max-width: 767px) { + .visible-xs { + display: block !important; } + + table.visible-xs { + display: table; } + + tr.visible-xs { + display: table-row !important; } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; } } +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; } } + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } } + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; } + + table.visible-sm { + display: table; } + + tr.visible-sm { + display: table-row !important; } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; } + + table.visible-md { + display: table; } + + tr.visible-md { + display: table-row !important; } + + th.visible-md, + td.visible-md { + display: table-cell !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; } } + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; } + + table.visible-lg { + display: table; } + + tr.visible-lg { + display: table-row !important; } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; } } +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } } + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } } + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; } } + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; } } +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; } } +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; } } +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; } } +.visible-print { + display: none !important; } + +@media print { + .visible-print { + display: block !important; } + + table.visible-print { + display: table; } + + tr.visible-print { + display: table-row !important; } + + th.visible-print, + td.visible-print { + display: table-cell !important; } } +.visible-print-block { + display: none !important; } + @media print { + .visible-print-block { + display: block !important; } } + +.visible-print-inline { + display: none !important; } + @media print { + .visible-print-inline { + display: inline !important; } } + +.visible-print-inline-block { + display: none !important; } + @media print { + .visible-print-inline-block { + display: inline-block !important; } } + +@media print { + .hidden-print { + display: none !important; } } +/* This is the default blacklight theme. */ +/* This file is generated by Blacklight. You probably don't want to edit + this file directly, or you'll have to manually merge your changes if later + versions of Blacklight change this file. Instead, use your own CSS file + which over-rides things in this file. Or of course you can choose + not to use the Blacklight CSS file at all in your local app. */ +/* Warning! If you want to change these, just copy them into your own theme css. But you want to remove the !default, which only will set them if not already set. */ +/* label (field names) */ +/* Generic layout stuff */ +.navbar + .navbar { + margin-top: -21px; } + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .facets-toggle:focus, .navbar-inverse .navbar-toggle:hover, .navbar-inverse .facets-toggle:hover { + border-color: #4E5D6C; } + +/* + Header bar at top (Bootstrap nav-bar) +*/ +#header-navbar .navbar-brand { + /* The main logo image for the Blacklight instance */ + width: 150px; + height: 50px; + background: transparent "logo.png" no-repeat top left; + background: transparent url(/assets/logo-0e6b1f8122c86e81273620122a5f3f278c9dad531951b680114733089f369794.png) no-repeat top left; + display: inline-block; + text-indent: 100%; + white-space: nowrap; + overflow: hidden; + padding-right: 0; + margin-right: 20px; + padding-left: 0; } + +#search-navbar { + z-index: 1; } + #search-navbar .input-group { + width: 100%; } + #search-navbar .input-group-addon.for-search-field { + background-color: #fff; + border-radius: 0 0 0 0; + width: 15ch; } + #search-navbar .search_field { + background: transparent; + border: none; } + #search-navbar .search-query-form { + border: 0; + padding-left: 0; } + @media screen and (max-width: 480px) { + #search-navbar .submit-search-text { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } } + +.constraints-container { + line-height: 2.5; + padding: 16px 19px; } + +.appliedFilter .constraint-value { + cursor: default; + text-overflow: ellipsis; + overflow: hidden; } + @media (max-width: 767px) { + .appliedFilter .constraint-value { + max-width: 240px; } } + @media (min-width: 768px) and (max-width: 991px) { + .appliedFilter .constraint-value { + max-width: 384px; } } + @media (min-width: 992px) and (max-width: 1199px) { + .appliedFilter .constraint-value { + max-width: 496px; } } + @media (min-width: 1200px) { + .appliedFilter .constraint-value { + max-width: 600px; } } + .appliedFilter .constraint-value:hover, .appliedFilter .constraint-value:active { + background-color: #4E5D6C; + border-color: #fff; + box-shadow: none; } +.appliedFilter .filterName:after { + font-family: 'Glyphicons Halflings'; + /* glyphicon-chevron-right */ + content: "\e080"; + font-size: 70%; + padding-left: 4px; } + +#sortAndPerPage, .pagination-search-widgets { + border-bottom: 1px solid #FFF; + margin-bottom: 1em; + padding-bottom: 1em; } + +.pagination-search-widgets { + padding-top: 1px; + padding-bottom: 8px; } + +#sortAndPerPage .dropdown-toggle { + cursor: pointer; } + +.no-js #sortAndPerPage .dropdown-menu, .no-js #sortAndPerPage .twitter-typeahead .tt-menu, .twitter-typeahead .no-js #sortAndPerPage .tt-menu { + background: none; + box-shadow: none; + border: none; + position: relative; + display: block; + float: none; } + +.view-type { + display: inline-block; } + +#sort-dropdown .dropdown-toggle, #per_page-dropdown .dropdown-toggle { + color: #DF691A; } + #sort-dropdown .dropdown-toggle .caret, #per_page-dropdown .dropdown-toggle .caret { + color: #2B3E50; } + +.search-input-group { + width: 80%; } + +@media (max-width: 768px) { + .search-input-group { + width: auto; } } +.ajax_form { + margin-bottom: 0; } + +#documents .document { + margin-top: 8px; + padding-top: 8px; + border-bottom: 1px dotted #EBEBEB; } + #documents .document .index-document-functions { + margin-bottom: 10.5px; } + @media (min-width: 768px) { + #documents .document .index-document-functions { + margin-bottom: 0; } } + #documents .document .document-thumbnail { + float: right; + padding-left: 21px; + margin-bottom: 21px; } + +.page_links { + display: inline-block; + border: 1px solid transparent; + padding: 8px 16px; + padding-left: 0; } + +.pagination { + text-align: center; } + +.pagination-xs li a, +.pagination-xs li span { + border: none; + padding: 1px 5px; } + +.group-key { + border-bottom: 1px solid #525252; + clear: right; } + +.grouped-documents .document { + border-bottom: 0; } + +.more-in-group { + float: right; } + +.clear-bookmarks { + margin-left: 0; } + +label.toggle_bookmark { + font-weight: inherit; + min-width: 8.5em; } + +.show-tools .bookmark_toggle { + padding: 10px 15px; } + +.dl-horizontal dd { + margin-bottom: 8px; } + .dl-horizontal dd:after { + clear: none; } + +.dl-invert dt { + font-weight: normal; + color: #4E5D6C; } + +#sidebar, #facets { + padding-bottom: 12px; } + +#facet-panel-collapse { + padding-left: 0; + padding-right: 0; + border-top: none; + box-shadow: none; + max-height: none; } + +.facets-toggle { + border-color: #FFF; } + .facets-toggle .icon-bar { + background-color: #2B3E50; } + +.facet-values { + display: table; + table-layout: fixed; + width: 100%; } + .facet-values li { + display: table-row; } + .facet-values .remove { + text-indent: 16px; } + .facet-values .remove .glyphicon { + top: 0.1em; + vertical-align: text-top; } + .facet-values .remove:hover { + color: #d9534f; } + .facet-values .facet-label { + display: table-cell; + padding-right: 1em; + text-indent: -15px; + padding-left: 15px; + padding-bottom: 8px; + overflow-wrap: break-word; + -webkit-hyphens: auto; + -o-hyphens: auto; + hyphens: auto; } + .facet-values .facet-count { + display: table-cell; + vertical-align: top; + text-align: right; + width: 5em; } + +.facet_extended_list .sort_options { + text-align: right; } +.facet_extended_list .prev_next_links { + float: left; } + +/* deprecated in Blacklight 5.x */ +.collapse-toggle { + cursor: pointer; } + +.panel-heading.collapse-toggle .panel-title:after { + /* symbol for "opening" panels */ + font-family: 'Glyphicons Halflings'; + /* essential for enabling glyphicon */ + content: "\e114"; + /* adjust as needed, taken from bootstrap.css */ + float: right; + /* adjust as needed */ + color: grey; + /* adjust as needed */ + font-size: 0.8em; + line-height: normal; } + +.panel-heading.collapse-toggle.collapsed .panel-title:after { + /* symbol for "collapsed" panels */ + content: "\e080"; + /* adjust as needed, taken from bootstrap.css */ } + +/* Sidenav +-------------------------------------------------- */ +.facet_pagination.top { + padding: 20px; } + +.alpha-filter .btn, .alpha-filter .facets-toggle { + vertical-align: top; } +.alpha-filter .pagination { + margin: 0; } + +@media (max-width: 768px) { + .facets-toggle { + margin-top: 3px; } + + #facets .top-panel-heading { + border: 1px solid #2B3E50; + margin-bottom: 1em; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; } } +/* style for pivot facet's nested list */ +.pivot-facet ul, .pivot-facet .pivot-facet { + padding-bottom: 8px; + padding-left: 24px; } + +/* Search History */ +.search_history .constraint { + display: block; + text-indent: -24px; + padding-left: 24px; } + +#ajax-modal #email_form { + width: auto; } +#ajax-modal .facet_pagination.top { + display: none; } +#ajax-modal #sidebar { + display: none; } +#ajax-modal button.close { + display: block; } + +/* app/views/catalog/facet.html.erb may be rendered as a modal or a whole page. + When it's a whole page, don't show the close button. */ +button.ajax-modal-close.close { + display: none; } + +.twitter-typeahead { + float: left; + width: 100%; + z-index: 1000; } + .twitter-typeahead input.tt-input.form-control { + width: 100%; } + .twitter-typeahead input.tt-hint.form-control { + width: 100%; } + .twitter-typeahead .tt-menu { + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + width: 100%; } + .twitter-typeahead .tt-cursor { + background-color: #485563; + color: #f7f7f7; + text-decoration: none; } + .twitter-typeahead .tt-suggestion { + font-size: 14px; + padding: 5px 5px 5px 10px; } + +.document-thumbnail { + max-width: 250px; } + +#toolbar { + z-index: 1600; + position: fixed; + top: 176px; } + #toolbar .fa { + color: #FFF; + background: #DF691A; } + #toolbar .toolbar-link { + display: block; + text-decoration: none; + background: #DF691A; + color: #FFF; + width: 2.5em; + height: 2.5em; + overflow: hidden; } + #toolbar .toolbar-link:hover, #toolbar .toolbar-link:focus { + width: auto; } + #toolbar .toolbar-link:hover .toolbar-title, #toolbar .toolbar-link:focus .toolbar-title { + opacity: 1; + visibility: visible; + margin-left: 0; } + #toolbar .toolbar-title { + visibility: hidden; + opacity: 0; + transition: all, 0.2s, linear; + color: #FFFFFF; + margin-left: -100px; + padding-right: 10px; } + #toolbar #tools, #toolbar #feed, #toolbar #bookbag, #toolbar #search_tool { + background: #FFFFFF; + border: 1px solid #4E5D6C; + margin-bottom: 0; } + +#header-navbar .navbar-brand { + background-size: cover; + width: 260px; } + +.tabbable { + margin-bottom: 20px; } + +.tabs-below > .nav-tabs, .tabs-left > .nav-tabs, .tabs-right > .nav-tabs { + border-bottom: 0; } + .tabs-below > .nav-tabs .summary, .tabs-left > .nav-tabs .summary, .tabs-right > .nav-tabs .summary { + color: #4E5D6C; + font-size: 13px; } + +.tab-pane > .panel-heading { + display: none; } + +.tab-content > .active { + display: block; } + +.tabs-below > .nav-tabs { + border-top: 1px solid #EBEBEB; } + .tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; } + .tabs-below > .nav-tabs > li > a { + border-radius: 0 0 0 0; } + .tabs-below > .nav-tabs > li > a:hover, .tabs-below > .nav-tabs > li > a:focus { + border-top-color: #EBEBEB; + border-bottom-color: transparent; } + .tabs-below > .nav-tabs > .active > a, + .tabs-below > .nav-tabs > .active > a:hover, + .tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #EBEBEB #EBEBEB #EBEBEB; } + +.tabs-left > .nav-tabs, +.tabs-right > .nav-tabs { + padding-bottom: 20px; + width: 220px; } + .tabs-left > .nav-tabs > li, + .tabs-right > .nav-tabs > li { + float: none; } + .tabs-left > .nav-tabs > li:focus, + .tabs-right > .nav-tabs > li:focus { + outline: 0; } + .tabs-left > .nav-tabs > li > a, + .tabs-right > .nav-tabs > li > a { + margin-right: 0; + margin-bottom: 3px; } + .tabs-left > .nav-tabs > li > a:focus, + .tabs-right > .nav-tabs > li > a:focus { + outline: 0; } +.tabs-left > .tab-content, +.tabs-right > .tab-content { + border-radius: 0 0 0 0; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid #EBEBEB; + overflow: hidden; + padding: 10px 15px; } + +.tabs-left > .nav-tabs { + float: left; + margin-right: -1px; } + .tabs-left > .nav-tabs > li > a { + border-radius: 0 0 0 0; } + .tabs-left > .nav-tabs > li > a:hover, .tabs-left > .nav-tabs > li > a:focus { + border-color: #EBEBEB #EBEBEB #EBEBEB #EBEBEB; } + .tabs-left > .nav-tabs > .active > a, + .tabs-left > .nav-tabs > .active > a:hover, + .tabs-left > .nav-tabs > .active > a:focus { + border-color: #EBEBEB transparent #EBEBEB #EBEBEB; + -webkit-box-shadow: none; + box-shadow: none; } + +.tabs-right > .nav-tabs { + float: right; + margin-left: -1px; } + .tabs-right > .nav-tabs > li > a { + border-radius: 0 0 0 0; } + .tabs-right > .nav-tabs > li > a:hover, .tabs-right > .nav-tabs > li > a:focus { + border-color: #EBEBEB #EBEBEB #EBEBEB #EBEBEB; + -webkit-box-shadow: none; + box-shadow: none; } + .tabs-right > .nav-tabs > .active > a, + .tabs-right > .nav-tabs > .active > a:hover, + .tabs-right > .nav-tabs > .active > a:focus { + border-color: #EBEBEB #EBEBEB #EBEBEB transparent; } + +.tabs-left .vertical-tab-button { + padding-right: 0; } +.tabs-left .vertical-tabs-list { + padding-right: 0; } + +.vertical-tabs-panes { + min-height: 250px; } + +dd { + margin-left: 10px; } + +#toggle_word_wrap, #toggle_invisibles { + margin-left: 0px; + position: relative; } + +.bootstrap-wysihtml5-insert-link-modal.fade.in, .no-js #sidebar .bootstrap-wysihtml5-insert-link-modal.fade.collapse, .bootsy-modal.fade.in, .no-js #sidebar .bootsy-modal.fade.collapse { + z-index: 1041; } + +#documents.row.gallery { + display: block; + display: -moz-box; + display: -ms-flexbox; + display: flex; } + #documents.row.gallery .document { + display: flex; + flex: none; + align-items: stretch; } + #documents.row.gallery .document .thumbnail { + width: 100%; } + +#sort-dropdown .dropdown-toggle, #per_page-dropdown .dropdown-toggle { + color: #fff; } + #sort-dropdown .dropdown-toggle .caret, #per_page-dropdown .dropdown-toggle .caret { + color: #fff; } + +.navbar-nav > li > a { + line-height: 31px; } + +.text-muted, .appliedFilter .filterName:after, .facet-values .remove, .search_history .filterName, .search_history .filterSeparator, .appliedFilter .filterName:after, .search_history .filterName, .search_history .filterSeparator { + color: #EBEBEB; } + +#main-container img { + width: 100%; } + +.carousel-caption { + position: static; } + +.carousel-indicators { + bottom: -10px; } + +.list-unstyled, ul.facet_extended_list, .facet_extended_list ul, .pivot-facet, .pivot-facet ul, .pivot-facet .pivot-facet { + border-bottom: 1px solid #EBEBEB; } diff --git a/public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css.gz b/public/assets/application-6d49160faa1377bc9e7707f6918c1c4fa7d61282a24f3c1840100cf350f2fe5e.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..7d677b6c25ec08a06cd1aaae6ea41af65c840ba3 GIT binary patch literal 35203 zcmZshQ+p-M5=LWN6Wg|J+qN~aZQHiBW7|$9wli^dCdT=Gz`0y~Q(fJC(NDdLC>91} z?3>aY4E(y!CY7u!nfP5G5VCUXy;@eG#mkZsATO{SSK&Es&(3GLoOPosr-Wq=k-CIw zu8cY~J-v3D^S7ToyJ3kT`&Q4VyL{>2;aBm?FTx-gac&S#kRfwBB(-$)d>m&_ZhWN3 z5m4^EE^SC1Ld<--pU3`npUQPdf?dB4mGhhYm-?gLk?&t_YeSTVlHN-?<1(u>nj#PF zDNiK}g7;2$TlyZ~&wY0{5V=i2!|%|l7g9#ehX@n4f?@7hEQuTg51in) zIby5Nb1vXfii&~6^||A@Vk_(l0^N~D84lv2OlH1A3tu8voP4jjeUmNLP(%lJY=#P! z16JHA=0`DL=6H?=T?LDx?$EPjo|9U$h2V#6w=aH(9uOrHKShO59Ov_k1zlQ)i3tl4 zo#FJxQndR-)e=S}$vs3gs$RMykMEhR(kQmj%$*NtuoNBJaheabMz@e(&Wt-QiDFgs zPnHlFlJ?|WlF*sSz>M1Bdn4VI47ntGUYINOWL!~L(u0bv0v?tsR=ztBP-R->cYJl6 zxXiqB?4INgAg5RiZxs&QV1ds7#&oPQDb~xS&uw&1B(UtA3f8&%(nl{Xmfjd)TLRLs zxEi8<)|tkZSo?iLn{(GeXtMO@H%*ZKB|P6IQz&2jWA2Ze%Yj0TIFX-9wBFb@oVo0 zE-dd-UQZ1VeBga+VN~c~TeuI|HTI3$c<>_r0ciM8O?ThVuo_&uyp}up@xWvGO;QX0 zquTqOuVtc=Rld#KxA7G7^vO@7fo=!CmE%16qd8{lTLSuH$9{=23o3c!?o62P&Us0> zT>CfjH{t9i_pK?B!X~FgMUsU|A>**FW@)xX<4ga zT1)T>2B?=*^T`&Hdb2g;-w%*{?+5+1S#?5J`S&>4XET(7D{zTo6HS$PGRc}&T!|*c z$36Z{iI_`m#>}u??u3vPYul~(Yd=DLB8AFbMc~2#)InFZj0(*?j;%bfD=|>h9VV!> z6gzGEM*fd;>t*T#O|E;>Ee)PfPLs#_k8->a{k|eP1WlC(3=N47REM;*_r8iECn1+I zVvtFB6KRO=u%QWv|F6O9RH4c@+ay0@{fJq7LC48{u9NIQv%K+o7JMycg3dWL>0AyV zOFd3+ocEuAXGcM72FcjI8-oa>8UzAa9Nr*SzYTNerYy?PUw2NIib_EpZHeW4>?;M9 ziYSA1`1FGxBbLX;zxNI0+qNtZw0TVS)6nvqYTebQKN23i%GAri= z`5O(g-Fa}w>zWZfcOZ8vs8RcFwgTx*!KYVh5J$%Dy_{+(Yeb)#KOO&OzwS}>oB3#w zYRgN&Izz&Dz?2-`!(rXlo9wR4YmhU`Rbr|5n*%&(h4&$aX9g{S5D+H+T3KrlHD@YC zp7K$w94Q5E3I`v-9s$AAMUNmiAE5U<^h$w!UFk7t=}JethWL;C1t@llJ#-d47oO| z#P5nQvDEf!%@8EBrH0b&qqfBEN&R>yv!QBAcseC-B5yh}?p1Gt&w7IeZ8jMzs+?zM zvQW@m>2SYetK-(s1ys}-!s#Sih~qrpbgX#2x>%|`Q(Zv;h{Mc#d4=whsW-dxCvLtk z89Tz$$6T9L_yn1SDPHLRG?Sy^JtDq-zny33#KX)I)wcxnn&jtY#_K?DdiN%WbM1d? z`Ek_&ace7p4YAZp>nc{uLYK(Az?pfzkpo3HLi^zv#YO;a%+2OpZeDQ_#PtNt$G76W z#Nzve7pjA{1H|-P8STJ4oxoM^3(xnw|)@UkqGtURH8s8BU&}H@#IAzQ4af_tJwLgOQ)uvMa`iZ3;zV3Dq69ZN~v0=_H zZ}67ysKPsR? z%iy0R!`!{BUFP<&57-UnTMb$C!=zNP%Fn9qp7nfuj)He69zVVK+6 zxLmX2Ezv9x=Q|ONhc7fdFk4GFGp?0dIqfft0$CY^*j#l+<1z`&KJ##9_MCNf>?J+j zv?}>bwOicm(-K53N2&9JmaA2GAWUNi*=)Qu#+QV2ghDNj?iYSxayMSmm8bvLqR*=Foic+V+ha8GmWu51GT@)WoB@?}xm*GW+2@qKE zxo=WVMX{q3*+zkcBNnQr`L2o~F=@XOiD~aCLmFo2;gtdvhxgqBm;C1(i5BHSWH>9V zW^Y#3|5hspS_Cgfc0o>A@OF>D0bq@KUn&vIy~uW{lqEDMm7Ypt)$`tu;QM?j36irNU(hK?xGz6(ypIS~rEU56;66ZjGPiPe!>jbH?C{UFV{g}HWn#tx94YN5(RcNSR*eH?IdRPe{biU?#eTo+uD z3fgXP;}3{tW*;a>5Mv$H8TsC`rVZA>ltI#oay_;i-xc@F@@$FXuu1ox8C@mG8g5?} zt*S0*eqm^JswW>dn}8f&j%iI)$1%MbqlFaCngNhZP4tBBO6OJMO1o4#IV~;aDQSAD z8V0L_W4+QN!G6Bm&0khX%%_TM)Q;eg@roB|MBJ>5t9Sc`eLy3jZjJ^I#IW5nkB`!`SQ-Mw1R&oE3cU2MqwzrgQI z&)oyM2-cSDi@3&(|)ku-Ywb%KC#K5Y#Akivb-(^;Wu zoe{oMl|9?8-vtof0i20hy0RJB_OB^dTR$(!iTbsAZF|imqC>lO2QFuR^qLq4Ur@}Z zrm`C;1DUFW$hZfXrMk+_$c;naQ`AjTwAcoB$52WCkY(;D7RzuzM*Zirp_483I_Q!n^!#bhUEffTQ z%0l#kyEek~Z;6Xt2njfi$c*^Jzu07lp=ny+GWIK^XbuV}21VRB@mkUw-3(!)W2UKN zO406N2nUwi4VKKW^kD2{1}ir4R8uMp1)k>I4yVs>Z`{mkN`mq<^utZeq~K_{)CGLu z!cd&}y^}--fCp7PX@5~Fr;rn;1NCAq5jyBNds0jPZX@0ka3(j9Z8yCqfZAWZ-r+8~ zMFutoe<_bsiNW1}ARh2HiGG8`spx78sTWDJe8H&aR+uAyX+!Ek*2_f1O?WEX9f^Le&Z4F1De0|2;Soj3`b|=;J)`)o0WpUkT&+H<2Y+bWIZ8YEs1{! zx1{k7hz7aiMyTB{mWYB)8KKlsk5A9w|9gay)m$G0E}WsZ35od4 ze|EtQtxz8Kia>(bbrwgi3GcZ|nKk)J%zH8et$%6b`XG0g&>>xldX>FdD~3&Msmo^9 z`YILm;5qpE9lwxHRxJe}zgEu#&1o>cS}nqDixk$Xu|qVCo5fbHphOr^Fy zh=WVq0sYqD9^Uvn2>Q)qaCLJqDD<_+I6bDJ%Qyb3$V9&a$@-w+F$x8*>$hY=Ez_Yw zxzu&$!}v0cQ7~DoOZ~0C#!I!s^dkqsMh&geda+F9%^sJVax9nEUG8Exn_Uf3o}(Ej z4cK6P{HklTv30HnSP@~trQstZDA>ltfY$X7Xug|${_k2@{pmjy0V*jKxihLw>! zF3KhckZ-I8{n*&3v!neYvQ)G-^D3yaX*KP!Olje53fp#)z;rc zosAu2(^K95{c=4{eL7=V?O%v+Y7|2RBS@xqeG0b01YQb>7qKY%f7D}-AMIfjs4sbTb2y&yrt=>ORrN7Lvk znsFC61Jc2L^fKTeyb|%i2URymACMW;_h#Jj?Q>P9;DML$$tX7bl!?)1^NO0y}iry^o0G*P%KoLK=;W|6TFROC*c{*b_H zXA39k3l1Um_e?_GJR!(SID`HMO2XvEeW(&iQ-UF+;;eU0OS%n?GJwn1ABlGF4CV<>9dniZ~b}*<@i(%J;XdRrSV3R`_!m9^I+<8sVBq*uc0n%6rhY`&3AsG>Yyw zLo&!$GUrH-q7VOTbAqwKrod~ok9AE4B}rh7eIZ7zI(cbXQSf=%-O=!oxxi~zH*S#@ z_I}V-o4Fl!%n=hN7iBc-GRluEUoV+Q`&7UOhyKxMbmy)p*bfvT(R7C&T>(@?&#GMo z|B$6fJJRUunu-@6qA8HA!S#q?a+U z0$Y)TB8nmPkoVbVvMCNeNCK5SL@~^MtB{ZwkY4u7{c11wrOsxo4A=fZ7J`i}F6NpE z{1rr=B*FmE^GvYMvi7eGiR}|rp_dG0%G<-rxFX`d2>(|bwppd%0H|HmqC=BWCkH<2 zHx#etnK-H>Vv+$61rq->APGVrJ;pi%(4=)MpG7HD_8WJ?Z8v zEx&zwz1chd^+@B8PBQ<0JGsijV$qP6R{%3YWZf4odF`|AV^EK`pU&W`kEw{lSm#O? zOF#7}i5gIb*;iErOIo|wuBm#J-R0T3Fsbq1+g`%b6geUc9S5 zC!}WfJI@aJ26Y>1SIJ;%@sdmUBoe*oBEaG2+gwWjJ?HR%`zQ^BxQrCu1{uFGsKvgC?fecpo?uFA?vgUQmo}$-YpXRRKGP_Ch{E1^typM8g0z zEC>H5X`uki^CK1{MWi+*C^z|h@<_MW4x%vyJYixCp%n!@X%Lv@-*UERJ(V^dVzu-WwF)}fUpqw_(eSZ#}8q_U-Bx*9QfehDOx&2NNv(ds%b#ZDZNRxY{(z+E6u}A z_?pFSP;G{%Z(`cNY>c*FjP)CW(UIEj4ZCyOvnp%a?7-4U{J*Qa<>9~Uoti|MF+2Uc z;HjqUxh$q7dkm?sWEc$ug`ceqBeD`<@0qAGUM?L0b63@-F* zjwuO~>YzS;e_gp(JmQtTY5(_NRm3pwIKiV7ploDP$5}ju*gf$Rb4#+M@J1gu01bb} zQRg8cf-HCNeFp2_{qk_0jDYj*{7}MqUb4Bq4YpSKNXO8@!Xin9Ah$rlgLO z-1CH|iWhI%zgJ)9fIWvPhscS+Lw_=b^^>8PiF<1ZwvL{l_D-QNt2&xrM-Pd!23~L& zgb~_f=Dja0y-P&O1^>*vz)W+OzrNYLK7;fl`M(}yo7JCbrV<#dTn(Pvccw z@~>S)8H&@~40D%X@-JP~t?;pIHLwD~WzMT5rLOH$78i{}3kK@lQxIS{9r78{T`Pp*&^p!I`3aT)9Y}VhQ{~Lscgxqo;Of z);2-@!UR3q6s*T>zX>r!;A6pqSr1 zr(8RgiaLlK)S3ej-rVY0raG>aX3?FJr*IzhEj2 z)1~1D{pKfHE@w>@eFsG#VWiQznnF%@#n6|A>^l8Eky2)3x-6eaCBpM$Wz^@lL>Xw6i!OQ#ajAYLa$4?C4TO)aFkH_2mK=6hQF=mI0CBeRVLp8SFtSb(b`h6+qTK38W<0#c&`u8dsP|Es#gg*{|Gf)iWs!5QlB#3%VP^^faWew%A?y z;4Ruk5b`&Mpt+0-RU*n6T)qDHgqj9$7DQnX zyx>h$qQ)nnp(vQDxV7RmIF!NQQD*i1l*Knd1323$HMRyhI%Oc#@8K)^I$Ig7R4Lq ztOd#;u4NE>UN#;Ww2S5ro}F++R1QQeRe(Skol+9V)h`n3}5}ndP6Bp=lLc=K$r*)*}MV99U zPebZGGFA45p%UlJ@gdz(Sclu$?VPa8$y;r-8r)Yn=SQqg(HjK`G!44r)P$g*)9UT? zpBgDnV+njl2&Y^RTPUEjTj9b=3w^l`Z%^7|hWyKbwoK;tta6&ehSTEv%(5{g(?!u< zlz7Si!QJZCBhL>I>9|A3Zmo%$d)aAWc)Cu-E=Lua;$#&JN5w@CBVBg&d$tKfg8aZ? zI9~F`nr*AfeJ$8D6!3a(#KkNi$1XKRRuK58Q>>8H7c=uy9Facaa#;T^@HcEUv2$4e z#eP4{y$EBpib@)g6b|u|!s;H8OyT|oU>eEa1ZFL$pIm=k)5-dv z5~$|^H`j@izDCCYjU(e@+r+)-dUX`{hbzvhduOse(N1a)Q&#)r2RFZytoB11$bk>` zT%85}coDKr6Mm#tLMn^QQ26wrapqq=_ts*P14@tAzJLF#pSWR#Gb=F1wH`#qCU=&L}SNP`%DxG`^}Acj|FuMg$A%?U}| zg2tFxlfw&%F;Dj>ki&UwHp#0flzf7T&@eG3QxB-`;cuKiW%pPOr~=-cWSl-X8#Sa0 zCQ{fD2UJXCBm-*)Rg`}$&2x%9{R_X4z$g!`NjQWH zg;YbL{^hP?bUr@*I%O3M1S@oq86j{@(BfkS0)dtHE=LC2Ecxe)42I?pc@TaL0_nzu zp9KShLo##z4Fb&v#6K(;IThc($-AEN{0h(CsFd&X3TO+(sJJJ!p0WMR(hb}4Re!0TJhYnP=c`x~eC38%i4yHaX(;o&oH8h?!= zhCt=*oS84uCrGIm{OX=QpqgK2wjN-%J?roJU~l4r3pXZ``b4@2*5i0*jws?l#BvYCvRf)a98QC8XCSllryX~$JJxerG)iXP%A zZKIAx{3FqbGN#YF@xK;+`+%nuIAk7=!H*RV6xDuJwN$szdi>pu^W*;0p-sL2H8ycD zGjteIU}NZ~Kd?Frq!_dNp5+RDfJGgF4-d~^%0~s*nl+DHgRC4J+gYin`-cqV;0tZ zUPrFePwjj}{a|R=X4p6B0-xvjmq_61n^FGD=g0@|kM?}$HCOxR-NfY_ZaeTfSBhUR z`#`-jd&c-bxgu`UI29;{|B$l2u6J%RewarxHKEKmGIU_^U${5tGyw@Y#FJNfSYB0T zgZDE_8J^|Mxm!wX1>bn9f{kg7K|rlz*!-&#Pv9*27WTSjQdbntWcyb}q9#z4eCM=R2xd?+K=P&MCLhMYk@1 z_A6Vx&WkJokTF?zfE0LcF*JhyS#K!GF*#QM9dW-&$uK7s2tl=(gvyiJ-P#Kn?un?;6q=oHu(~7df zG-sMU-@KC0Ctre=Z4rIQHZs7t)J3RQoD4`9ZlTN8*Gc6(k6+eTk3UEhfX{O7vXT8y zr-_eJd>aK&8zPF(6pr(jTGv|#{JfIuYF$4#h}L)gCxv9lvGCV;46tLT4f3d6i&qBd z+L-ho&)&8ByiKWJG+!K6h@}nXN z7<$MBoaWpIys1uC@{qA(}qb{|Z4CBIKE~P3n@bGcU@1J^qVsrv9C#Nf%?aR7K zVO7g^*VEc%RU@K$w)aSNoRbhKTvz7JtyMVaROYIm@LzBW?Wy{jYs*;nn=PA?@$A`q zO1x0-V*M$yLbEE(OHA#76dE#|V->|YLIh$Qi>9axRy|jeH?~P`>1YS)7;HB0Oh^A7 z4=pg3m(?~=h8$@G^4t)tPlwnMRpqGoTU1ceJ|)V_t+9OQK5JWOh2C(&vHlKjR9i;N zF(RC}RPT8T3SZCeI{+xZf`(_m+tJj*3B+X#G17p%Z)PiFvV{K=hv__8qF-#)%nu5; zbma#vM`&;Xvn8%si_I6QaE+(}vs7x7IbN-@aj3dg)zE_A{PgnlxB;(&OqYlJAO*TB zEwP}H>|)Y}97tw&|I-CV?Ju>tQEHV_DBbzYnEAK9)U-ThrT^Br6gE;?(qzlVE0Z%KB{1*bkOy&qQl50 z@q0ZV&B{fra#{FDZ2f&Rf7BYsUKfU1sw4rtb6|lbK&^+IeKRD^;UrqMMiol--~eu*(W!Ru8!I+X$BvZj6g(V!iSz&L@{6cj zuJA7;&$r_3(CQz8^{c>ShcGq1_wPENm)qdF;0O9qnO|Du)%@d08D$)1kWd{fq>q?B zM)BzYn{^lzO4NUH*~0th)NbzM6BM1P;zwf4hrUi@8YvQ>kg`xs)xAMoTMy|N z6$0Mv>zR>R4OrXiO;LcRE8gjiGJq=M8UBF5{>fT7Qw7k-lgziQF)xh~l~`xL@JUWYJHC;sfcF_|LxbN;7X_G4?(b4jpbaw!WeqHy*dXl38 zb_A`CwLD> z51vbCr2yjkDjkbckf8tUrLoavsukSG*y1xN_Bo zx9e|hR5o*3MM4+Q2S$^=To4umwn)=r;1>SejJYU>I0$VQRMT4>32N9gl-^(zYB%(& zGXPxD1c;f3 zikHL$Xt7k4t7ES_qI?9)3Tp8NH(WCtV{OI!0U=ys`+85Fe@GNk%y@=A+w9{TgD5X( zHeuB|5+dbINB0xdy$)0nX8G9Ke2+LtNP)J4OvmO5Bf0rnbw0D4%6Pd5R@}nQ))yqY z;NBlOrCEJa4%V*Lfb$mX{Jmy&V^iba>0MTuOt_a?`d69HdRJ zIQFqlYy{|D*?l(XVDV1PDN}+xM;L83?4K;Ai(-Ug?XkyUqOPs*zyEm!h0PUNP|Dz< zKWxm{=aNr1R}+0YA`=B>5b{a-bnk3ZvW!Q`8RIBVSe{Fo-&!Ljdfm7^awHgg)NEK3 zqt4#8@|I3iPIeP-J$uDngz)1`qFPD+0BF{uy;y}U!GF!8{1dSD0-TSHVd0v@MUj+K z4W+`Gdb9cBRdf#Kc};jB^E}8aM7=8b;~rwHa6AMR{0YgMmFDk(xf>r5_Ge$Vy4>B0;mLZD3!aj=d&tJSd2hr^=BrfI zvd8Y9c%xXG(~JL#VDGFZ`6STOMBQa4mz@BNF5gFaIOEV~W5DU&OE=9wEE7xRs7h-} zh=;gaY~gO>bBKd^SYYAI_;HJecz{i=#Q1lg4tHi*$H(OmlHnWv$xt~2^E;#Y3^x#;}jM;>VV zF5y{Z2{%#Cx>W4z63Jsg0}&};q%^|9X#0BN(~o3W5UDPFMHct~A}1DtJyRpUiFrqe zG;^b5tF|F|QD)hB2E*dv1Il(l@k?051X(NGOvWV&?2ki9?B5E!`0%&%*j3ZjCT3${ z=*tLcjK#l5q$0wK`@<+`7e-DF86dDfESLZj;@<=OEmbG5YlpKh{U>)si;_67UmDgP zsCjWT{2w0QDDaS+n9J5`aC2L2((EYaN+nB*O>-{_{jD1c^n{&sDb%G_%H$ZJs_KBSjRG&nFJxR}c29S(w(wH)cvqmV`1F!)&3BM#`xp$Hq zQ~HH)5mDGsmKVj`0sw?BI3&rE$>3uNVf3)C=vY|$mSJJ|T{(;QlQltwKV_&1$qc7a z1wK;JuT1ZYiuxp!e6C^QAWo?^Mckh#+pk5Htk+%_oSjXBWRc9KgbAfAvjv@f%@U-N z(t}Qfvu}Uy?fc}waFKPYSDKfX9+vqB=~Ov&e~pll&vGTwA6RxkZ!=Wi%&e4qvvN+; z2M3{|ExMBb4*0R=XHO)fGS`JMjNZH>VKZLy+JlKccQ^(D%V?BHe2tG(Y`HlO*np|5|{`9>;=8j>7z6hL#fco7t7j!rw|IP>4dewg9sW3*bt*j#6D>*Gsc{B|=5H(YqO3-)S)J4r{vb8EDGs?= zeJOpRMq<1hf^7o*3(z_1Yd$eL&nPQz7n>Yp9e;5_PmZNqy5(jbQ*X@aZOhWA4U$$# zSko|?Vy$N1bt%d_9-nRyN5!2|x~}+}Ua!eD41y0b#e#(xJl{#naeYMxC5|1;mPLis zw(8Dx=;Of2BHs3IF)eVyxVDUsI>f;_T+E3jfWs|nwx@b0?Fy$y|zGvm?zy1 z*PFZ26U9*m;q$^0gVFv~qV9Z8mR+T8-DR@L)mC%azQOgvIK@h;ktu5^wxzgl%TG_W zWKWPT%8#7a6>{?nTO7&OFiKgu)>cYPyMx-{{Leje_!R!$kGA8@dxMUIq?xD3N45b^ zre#R?O=JZ|y10ld*#N0h<#WO#E^G@!lD05dJ##aV4l?iYWO@9Y0|e^(PeU=nW~>)U zjbS`;l6m1NKq=L|PVD-@O!AcR>svSj!1f^@MvlPUT;F3L+yab-=3y_!VC)O{_*=ykabfvgqzq4 zw&}E`27o%*7(|Z6*o)HT$r)3Kmcwr}06Vk(g*|OVBv4neqs&KjnW+tPMZZQ*R$@FY z=Yom4d|83FKvOMvPW@gbU=-?2h0oUn053J0wb~9k-G){q*5b63Ro>c#pYRbs4vuuu zVJ)A22Fijd7+ODt0Xv@9?}f8qK0oH7jdQvz5nhT|F~py7ip0U8so*|VZ^ak;jN2w} z!7#BErj?#p`&j?i4=@m~N%RjrJ1NGwpLh)YeoD|+ahgQUg0H9FGK_BjdV(Zoq&u$48RWsGc%o4QdMYb6xlnbBB7s5{9w)zvK!D5Eso?!n#L@geDUI*$ zer=ftZHZLt7Tx0eL=ed^N(ABuOyTqw6~v}TwxC+Z6x^Uc|2=&frk0}XomdThaniQ@ zNxzYS5y^Wtq)!;?9994$B=&#d-{&|x-QFnamqNeflAZF#nlYUt)7|>_!&t0?^q==fwQ&fcC8G4-*Nc&g-5v zp803KrG<>(ThHZx5hzwu``i()YjgV<7Q7E6ocVKl6Y$WDKMySAO_9H}tb-z&ryTK!KyA=8P&V3um)vqM!MylWCiY(R2Ri-$kN;8gR zE=??U{c^H1Pa>SsWQ4vS#L!94vR~6z7f&4z`K_~5+EoKMV}F^HV@yMf)w(EnCSkNF zQt7+s#q{^0;umGB3>lcicWQUuZFT7X8Rr<9{8^tncL9`=`L`}MqKCV{yq5T4L|B$s zVK>kp+Up!+HY&?XMls0`ew$SGlZt}`{_T=qE~?t$%05&V|4e{xfv)kvMOi7Q8`+f}Yy@+RDIt&U@XpgpKNQTFa;!>d zQhgd(5xGGQed^qO%w(nxAtW0*2rYv)L{1v&)=0B=+B8I0-X)wn2fuxm?Rqw>5%+0{!lp{_qkDtCkzKjl8cXj8V=cdn|=U`mrAV z)T~bwaz8D+rc1?yKQss;dX)fj_8fIe$NfzB+d5UQrpZYkU+a;0;O5KzJ;!ZN2)ozr zzTNhyF4Yb%iqQ2d$#5hz&O&U9i zkq)7v5&W>8>+i_WXOzkAs@w8*UVTHV@k)Gq$P)*)T`GaHVVQBbq;EK{N0@DftWMwC zd4kD>w@JNg>Haa!T{Nf6)=e+fE(HAZ{s3kr6Igpw&vVBmV=T_c4~Bt$D3hJ^R?VN2 zz1`8K1i-SmG`^Ji=%L z&PSq$s_^?rK9ZGEOVwSy4K!NWCVL+i`+DD_bc{{PP_Koewt_mg%Rw`$-_WRPg`|~6 zI?i%x8RG%lz~{V>aCG7rQB7jyCsT8FuQq+v-mmOyzP2?TNCeKQCMtb)u81Yfxi0rG zE7C|N;-T5|t#&@DR3_Gd6=h19bG&)g?&B$8f7ZH*{ZX`g3c(H}5&A;m>Nw$u8-Gn; zAd$I-7UW>7K;Etcm4Yod-fwbN z@!CA1bZ9Vg-gyHBYjQ)7h>H|0q3(dmO{L)3MSxcI)?Jt z8BD<2kOAkjF{VPiE(^}*Y+8Zx*cw#C+c<`L?hF=iG)~0ZNQHVX3l^|3R>Iv_fqHHY zwh-!9@0(W>a8Z#ceGAX2>y2AZ;&Ygs!*u~f?9>J4b2N>BUNnMUG=W|;g9b%@!Si81 zGhZB$TpW{JoRD0c9!{p572?5vdP@&H*iln1@)ci>A_fZ~ZX9sd5&{^n6R97l0v*MO&La^|O`%N6aMN~*iY9-d0o zZ5vDz?Y5{yxy^FiL>SJuX23(jU|CkcqkSw`a=@!WBeJeXhfi!-mKR!r5{WS|#q}_G- zYyGNxS)5&ZD%O@LUq7jpt_jjO5`+x~lWUKC0TZOF5i*njT33yVUCk!GLs|0%8Tsp=E;v3TD1;cl|x^zNvota%aCsuCdCP9tNu2oYcIifOH z3@aU5J&cphjfGg9G)|e)K#O@Y8rFItAI{E^Oh2tgLXa!1rY}zgQ>La^Nx9strpShV z36Z&ia(SXwSrj3ixR95EYwFMFzR=uP{B}Bc17*nJoD-~spl^7v1Qv?H=6}kRV3+K8Jt&D1oe-T@dRz%>MN9S2^ewA-k_p}w)gDHCiA^sz(q{o7P80lY>Zy>usTj@@9p%2nJ|HcESrb+M z6l5=Lu5cNpf;L1$AxO*ORRec58tOD{qB_R;I&DH;f_vzcWwrZml_sfpEtRcOJi^Dw zG)LW6KVqR=1QCwCr?Lf&{2H}q)pL>jH)${%=O>FU6XvHJ7A?|G@&Y&2=2Bqkjp6iDl)DgBA`yaW7 zt(}0}VD2%Ldbmn2r?4MO;liRt!biR_lth6Ot`QU^>Ni9c3+{g?2Pl8yvLhiPI~~*B zV+!>^QN0AF;XA-4%;I_&=cS8QbBjZRXVz$q_LkfZ?q8qAcp&9f`KHE|7Mw`JxQ= z_8;v1A85KoG0ymv>o`>(*{;OFiLRA;{L#zC7KGM+fmOH;7pB_U@N!+*<569V={ zdfkzTrgAS$B2T}OMPAz7kU=fw{&POtJ&_Nm;QX%$uIobMU7MJY+WUqYI5%3M@aBz$ zaBeY2{0}S>Gu^)bI}6}M*NgkN7qD)g$f>mvI8lCd_4&J5CtrwB-sn70ZhIYYyle9B zTAb?5$D`zzzX0FHT$t5_upd7k?Ag_(jF;1bBI$+zAMEMPrVPaYfu3%?UV$Fmk!?UN z3w}X>-v2*vcY5{l;0S57(jxn>0MyytCdc3ne-Bh+ zxz#%HyO#%|o7_T!i2dazN0eZJ0r>7Rzz#*v#{;n>(F(e|qudIb`9A_#Io!njH)P2# zqwUQEQc+ctFciHVF!6VZ+q3^pG6fTZPLDJ+M~GqOSITQ_r^lqZs;YOJ+I?;P z=Ro#rxm;$rZT2Lt^Z|_pF5!Tm=pl{8IA*AsH*g^UQBFy9qFaJzv7wU8uHkUmv|4*f zCeuZuYQ4lmofz{1Q~A#(>-=AMrwBJcW_2AlhvUCJ4r;G`#e z-v6FL8;&^kfu_YOlkKEK)`I`Rp4yffon3Ei;a3Hz4akRDhNzmBt#<>dGsdj>9{_Mb zkH11AJgCFM2B7fZ08n^PhXPWCI-qO-6b~4{%0ul)#f7X^S$FKfD;2my0xNJzhtlKc z)sChdK6J_UhbR26U0G$yB3fIUq(+D~%B(lEz5)oF!XkWVVz)u4e7GQNN{iH@X{`-{ zPd*``R9Q?nC!>$0XgUX-mu;hBeqCrl{(2VE$LcJri07S$HT zsMd;9O0-hTVw*9hx??uPrxP#zE|aTS)Vl&e zb+^jvMk{v%VAE}r2dx_{016Kd0GnQ$RcLB$0ibxm09Jcs!E>lI%#Y{PXa(4!c1qGc zZ+%vk#fPp#9!!ysnLMW05ZB(SsPk3a1*r_cMd(3)Fnn1_@sKaFDB5&_P1v~(La!&s zCm_87T9>|CTYb_K{Y~qHTQH3oPpAPCnelgI@;Z~5Or68O@n$ec9)>P6aLj{D;y9ui zIPb5j@iICgmy-Y*9chgf`eK>!qt;m7b(s;S)>t7Buq7FtovIqWQ+wUBn=H{R7^>}F ziBxzcQfkj0j?~q-Qgz^Pq|}f(R1z)a+LgOk&B}L`-n{}Pt#c1W=}J6lU3(}>p_%JY z>DcN>#y&mUOthd1U)$tG=?ZPXGEWpGRElt#Dj&Rxk}y|O(kcmCm7IsNq&e|d=EO>( z^Jo(iS^>5`fd9YHR#w_Jq2k_%!74es!?^e9j8JtB1JlI3^p7Hx*f_*O)E^+m{W^`BDqk?Wbv=BcS#X%MOxYF3s;zui1FN)$yfO}RTmQxR@4XzylO?g zNZ0N?I`TC-R=^mrCj%@yW@cvoYya+`SQ_vPJ$$>g$kN1bK-Y=yX4+$8r>ybA<3n&p zWEeCOKE~_d9HhXeU3|wwc34(OPK5toPYXFXncko>NxE>bhx01FL?hvgcMNSf&AXr; zvlMw?@2cbuMyuQ-hU%p}?g(kKzCDhD(`c%_?pP&&+_#syB2VV2EFJP=<3s-7z-T1G z1;;nctegj;i!}aBSamkE7SW2$5g;{QDS_FnI?a=^bx&Me@;A89mODuF(lu+IWLmSv@-Zr2U{>5O^(9}6_jdS?;=mO9z}!v*9164aZoSYT z44YE;OSd?#@?~CZaB{5RY6Pmcw2JinJc-PvBOPSOuk55oejdW8P}<5+sp;x6tjO&z zL)i>PhA1gSsZl+Iirq@02J$}oiPU}=O;reAO=s0cwv)VJI*dN3%ttHHOPsb6SL?dE zpe4Qie;AA^@~u(W~BYeXY6(KiY+v9SeD7x!*Gzg6?pUvKwxyVcw{5^V4kPRu0WnP z8>xa8!k?6ZO3HY-tsg&j!kLR?P4UOiO4Yl<0mQ5=Hifq)omhkB|9XkWvYVSVQ}XSuax2a%n+n7wA%#+V zIaTQX(voaBWri-=o7l0f>1co%<4>d3zWFr)e*rYisX+~WzZHahs9poWe%)+P-?zg7 zp|)KQnI@H>d0C-ZQE1K!f_F~O*jPGS6rkC zcObY$heZht6OK3C$AqhZ`!?TV!ks97COkQ(d(F>;;|N#laH|RTMr~=r8C}|by~QI= zqP9oG6fQNg~Ryn6e8q;ge+#kJ}Os`BswGtFH*u%l5`$V^LhrAlWLrjCyIP5?Q3kw}LKz=cF{&sR3fu(qP#js@ zfyGM5O)XI)Y8aY~{@JhK8Is1*%oMtssj-_9n4YX1!HrV)g{<4s|(>U zYcSMdrUI+O%)n8HSyhY-Gg*QTGX)JBW;(X_Fsu3f4?oOMPXE&nv$|Dp)i5J&($gaK z8)s3Lr5Q5Hs_)nstBT+VlhEq;f`IDi(%{vxB?^&|Rendu6+pp8m5S*-rYbJ~!;dJ0 z&;Rt}scO?(Hk!~o{FF5PhEfewD%St8(I|5!R-1_kc0bR0{BS!-rK>M7@5IrCNJv)^ zkZCL}1R4~K0~dj&9a09h4I!@dz`gw`eQpJaczSvg1!JEFKn07{z}Ao9SPn^0hgpat z5n$(6sY_kjTWYH~mzfXttq2A`sQM5RU^Ee^;^L>9GaF&@q?aE?bFPbqM`W&w*3tG? zQ4-n>K%Iax6{@L?_g0>24mGNR=Y@QpS2+?u^gA7 zjzsA>&oNf$_?&9sfQf5DbE`Cq-(=81(zroJ0dR(Jq{by8aeYokDIIMbb*ZDMt#~dg zgnL>8iWYw4u{t$3RLy)9o$Sejkg`*7dS~;9{Zbz%A%KEq0j`p5ifF@XxYoILOC36; zVRP51kV~Q<6WOO%xA3QEj2TD~CSovP{8UK8HfE8|M7zLOm*smCmGs-TM+?Sd%~LoY z9`|SB&#`3v3N`YLTxX4SMMq*!2ixAXT)a2CfH?k$2f^u6ltsE*ta?26D7RGWU=we5 z+*+j@>@a1^%f{mB>^8_4A0nuaWU)EWb!ppO=3UN8$_<`|S#kH2D9P~x^J6(=S$9_V z<+V<&zcPq^4Z;6w97^Lfssyk&DXp-9@7v(}kOPf`gdjQANWfpwgJV=KfVSBH=zIW` zux08om38^`%H5&e{jDz9S3@g|7OA+Gx-oR1PVtNNgd$Ty`nnt|Q%jFH`x<%7ggr$T zx5LrYa?jg}RW}wK^sRrylo}pt84bl zI4QUR3zF?BxLyIg<5)@ylXXMS_$p03Q<-J3OA6HF)0rI1XF{|%0!OL)LssG*8#SbJ zj7Uhg>8fdZ41t=ebttgU={AzPZ#7PsrCTQ9jR~cd_>E{p+~e6~GKp?sv8ial{~|K~ zkKJm*d>GB}9nuDTtz9@4rhE;q)GY!RQ^y9>z;!8TQ*Yf5M8#<5)vzWu(VYO>&lKVq zQic>BCS!nI35vuj&7X6ItI?Yo4*QG=+nlMe!oIB#Z>KqzfKny15c(bC)wK9{Y2R9UW@o7H8tD~= z6ToF7HEnl*_5HxkJh_+e(2&-r8ODAC88>kPTb5?rG}X? zzGJ)+X2vM(TT9RE3^~nA{RoW%z-4AMZFhk6{lLyVxp$hGW*GYoWZcXsR2*hTyanTF zW9ExN7&&c>@~lh!0V)Uo(APhx3L-$zK`To3wS*tpry3;VW0yq&oHs7ehJVtmJVB@BsC+P9XT*%@+Ll={6T2Y}12 zXxi=o>-&M7d2;WxG0iac8_2ksQK&e~O#SXpu-ztc6uu_*VmkdSTBqPuPP`N}$8Dm* z*>pTvI!%=J%#ocffKYFjq6nhYL9~QX!=i$ApP*fa_Uw{UU=Z5PH=Br6b|{o8j%Q~` z1w!p&RgJm*p^>6?L+lJVu#_RGo^!J zVmBsH&#EvI#3U}2>FZCy&k(w0`MWq6K1#4|4 zoV6ZrDyC*3j**LqO}8j$EBk$C%^vDSLE8mK=tfKV_uXWCbc_Ud?vGXe54tbb!X-je z+$jkDH4q}PRN>dk_M9BDt){Q$&xdW?Sh!Kp+Sb;-7gRjE4Ep{u@EF1L#&c^O#4SL} z>OA$)x+(o<9UA=>toYa?%Qk!K9wBDUwiUY8p3VBqYlYTq>sw5R3#j4=UBxQ=I99Pq zyixDrH5+`yd2K8kPSrk6tlRvk&R_gX-}vHs2}a=&YmRned!Iv(1ozNy5g%Zf2DA^o z7Yf-@t03rF_F0W%ysY_A#!uYd@(_wzI}x$ciX6ck*bFNS)-rfdg*>2KDd%~`9?S?+ z-bK*Ann!Tns#I&`=G9u^p-iHpb5`Yrp*cHL0#8xr-CU{sZjP~3ezgg!JWPEMj%>GA z^#=k0!YdsOTfgaQyydi;uj8W3VlS`VE7#&8rk`~2d{-3d2A0F5HVuc%Ago^9t`A~U z55iRt zj@071gMdwx0C*J|b>y|kBD0eK;C=Nrpe*>Y${65X8z6ptN1?65$sg>qpdY zftS|dGv;Q`_qJKOjWRCf61&^E6X)?fPMGA?o^^sE)We;$lY{mtCO2I|n^Q!Dh{Wd@t&*JKBH$Je?b6r8AC$dUnf9=M z0y}#W3ZF{g#ndx#*{gXw1>PyPKbvB^irM(4m73ufKg~g1b6)$>9<6LHpWvkAD#M3V zV|;K=8g4J1@W0fkJe^LD$9N0n)~iQ1s-PA^e)7T)Y(%{zXCPpku%tBAn~wA;TU?U$ z6CFOX)PSwTJmra^*a`c|)I?FF+E|GHl+7Tu!5NL9FT%>3o6HM5kHfQf|Brv*NB@^6Wn2ote$8_mC>Q8 zy#rPR&|`;r#AE|&AG{Q>%r0`RHVnL0y;<@*J#z83*LW3>vmI*1PH+o9M_8eY9OxV& zKsjcbWM1VOK+CKllNLLYfmF4Zx?spyEp01l4ZDpqYhkM~2+F|GjRIGlI=s~dKlkLy za-Y}UtU0IZDv$u15nbyl7!6bMVF|Jnedvft&;*xyG6$8;r4sJNdBs6sb_xqF3Zf*L zupr|wO8N<<1ieqIwOf~U)jAs#CJh(Wvfchv-S9wY{$xE6fH-YnmOHIV7W_JDTcwe! za*pc*!ptLXK*((6$n9*3hSu{qAEr^jxxwI?A77DAz)+=jUKA>HYA=}-odXqVn((lu z2{wgUWh7ja*$aN$Ba;`2u4e91Ar%SgMP`ab!&E5CGUi22LI0|?clYKDyF}yE>$X~5@nX|Z58L5S$Zlm0 zrq;$Vk`7J-QwAZ$r>Znd5{rDmb(y&nr745BUT z2Ff1o7>>|}3`a&wEM0Jwba4A8gR`-vA354HiJFX`7|C0jc!@dJ%407LGIIKbE+lKJ z#*=&wsgjWyqv_Rqw@M^PX9|8NnWKO_nH)$qHC-~6&|d4Ku7!dvcJL~)-1h>sudfZvl|dU~>Po>^qMiLD3gu_54Ow+sVlA&Y znX;}{?UcQ>l3bfQIrrA*SA6yPmDZz)TEkvrdo2@G>i}s}GwLZG4roXYvi+CAFA#x-V@i@w(k_?2ci@>&JbFf_; zuRQDI(Kg6}!q^W1^&vw=DYWg8=v1)yVdH>n2R#>2k|>YE3}1G#38J-KA2=*DZa#P7 zrlW7exiQ*q&3RB%w(GR5;Mc>T2>4@eIMdwQf}!BORgK3vkG#^(7FD;iy? zCjnz+y$9oz7kedAdkVyp9qn}({B&x06f%nz1z2m}@Oi|z8Pkrf+1gmS%n+da`huC? z{Ozm}Y0|5ow=qnI{>BdWlJvl&jz2(6Y|X0AMjNMc4I7L+ouNw&eV*NTbsganGnGc` zO6oq&wvOoOqg$ov>zh-)l82a-%N;LUUiqL80UQx8>G{43LYz`n&m-MJpXS3~OS#fP zYvU@P(YX3WY@^SK2dq8ds#m7Xy5zBlJ<-u~6WE0-^hj81nIz{1v&7r!9&oK>(gNKo z6XkjwdO^-#DCBEoc1YtTGWB&XW7^Oj=LC*9GBPdYnp@ul_#8lbFvLw$k07?eXjz*c z^*0e3W2%H!+O{3=HL@VT8U=D0zW?T%RR@)ozH%UzR&iyGZBi$TQCYO> zMt|wH?vD0#xpmtdNa$94n*qKL0ZS~Xy%F$;ARJ;>)uvaFz7np*oGaWH1{2G`a-O<_ z&S~Y+94YWTCMi!v;-s69zq1A#B(XE#LlZx3hn^9$w4*-2>8jEO2+w;u=~w`jv!6~v zN-72YoFTH%K&I_Z%W2z-Dt2tFet5G!jpw$xopv_YhbDcZtvOD(3GTq%7xZ;gu>3Xd zde+CZo2^Cu%N~ad4K(9WA?H=xY_qSZ&8sP5MAX>LMM9bee#sCz#RI-lm^LF$tDzo1 z%14;)f=+Ky7bB~-zxx~h*JzY-GpVjXTk4sd;y0!6Qk{1!UB_N+G7_{<&)+p#P~SD` zYQHOOXud+;X`y2Id7A5bvTF8E?=8J98%_CNUFUhfzS@b`=k<85cmJEv8Rw0Ssob3H zmDN2|q6P;HEh7k}nFnR6Q3*i(Q_bN>ipO=?*5ln(Y|UBzRkd7Ytje6!=&;t=rCjv? z;tf@=vQkA*A8`P6Sefx0`<-f1UW!iZo*zB%GI4UfH0cZsl1)_qex4l2UfX zl>2z*EjIhryZw8|vbSmMZXTxV(9H*B=J8cgZE_lDlhIY!RA-&REteHC>cdUDsSW_l zhgNf6%!?)hPJ-5V#{4KN?vOckKzGqgcdy!GHeW?`FYR;wA-l6xhqmt0R-L*}w-Qr+ z)3;*OGLpS&c_uD^vtPHthRFD(LxUALlH9BDcu*5vmh5AZD@tvvuRjlt_D~wRCEWG8ctf2S2p@(7W>u8@LEt^l6P9UW!(}K>t{M_msF^Q@+ z!S5k6akwA*R^8T5xYV1lcf&3utD_C=hcNOy~sdYQgHAR)U9ZMe~)b%E#? z3Ttnj-G@FFA%djv#DqFfqXA?NLzEX0vZIv-sLf?tZ_rmUfuq;BpGck!ICd+XMoOM#p`XF6#)$CNQ22aMFEiSAn^Nf}X1)&Q?KNeF!-n`8DjQWy5$lPAd3V zxCH88XT@Q3CtgHy%uh}Se9Q-%uyZ}lc>bm;T$->?`6AdxxrH~B1V~VO_d-dG z2BjpboT{vi@g@>i?v+Wpix+~8646F6Il!FsT#ACM(~;O0v;e?veHcq}s$UTl?o+#YSF6Iq1Fi=hVKs0!z!~Zq&d&Ho&2zww6@-lE4NyP zQ@gyGfDmwR-=rCa;j`~aka?(M1 z{z~2eodEM2S^xCd2lMi`EU~1zt<+;w?-tZrO`OIY>dI|Y_KFuvuNdsXKAW^Pv=-%3 znqCblsF&)g1y*%sTxk>J1M1)3zRm=%@1FJUkj{$@7YC zc~{?UIbhK`)eC`+T9LVU-wLZGt)pI)jF}nHM6WMkx_Pvb$1g;+z^U#)IWW+kP{r+( z#H$1ue#~IKxY>4n7)l~6t7idtc`c_ zgGdAm4z?D`Ve-Pruvv9+sij{6(CJ4ZRTw(}7Aa9;Fpc-BaW$d2Lf?h7aAg3vxSA0> z&9uld52hMoo)Kc6wRit&`qt%!c5cHoJ|Ir&cM=6WQ~+w#cCd}t4itp)lfG$=EiAN| zs6_lfC~ecKmd_sC~<3RYidhJv^damBiJWwL- zu)Y-yS$(!^I(50o3A?8tnis!ZJQ?RJy+Hli;5w+U+}ycRBed7F{DD0iLf)m4ye<|C z+Y5RQt(38Jy&SX6)OdA~CtHeN9ktWa!dV0@?MSP=hh6+Dn;dpQ=^Gtr-9F>qJfa~X z$gO#b6!4_mTHHzp)mw8OfS$VTd(W=wEYkYQ(J+v6BmJ^?4 z4ydcPAJDl{tNUtBD!bv^tLODl+P?km5lZvwWg?WOIsjK_sn1wFXeg~kt6T8q7fQQg zH4*-}`adB9wNBwjM~`50D4$ z>iX{QsvkC#<~ftM<*rpI?I5i@nC9=vX{%7$VOo4B{r3o^)eAY_P?}yd64mmH5m-WL z*0l-|N^?|7h0;s_tEF&}r$cErPHLj5N zH*jUE?IBjyBv{0i5hQCQ0QQKtMq~c>mi@$!Qk}X)po;L8;`t;A5Z)wLIVBSf3JOMl z49!nanLvPs7@e{P_<;wwFgg4Ls&Hzy3i z${w!@fttk40ZjHyfhl|V_?iCnnbz8hj9v6N(BVZd>#>O*g*m9`t7U?h!-RRGNLuXL zCc*rg<*$3>Sws+x1d3%le0;SMOqs#uCuP32UN=-#Z_;>US9G291SnJ0d8&C=67nhq z>Pp1w{LwQvlxcs%x4MB@2j76elmt2o{x*y5#OW^AX@Ku09gv{E0>@?;{kuA~7^TYO zrIi8}Jf|DjujI7STnW`x5*o1nC|Y;=$NZmhwARen$@FF8Y0Y_>g!YFutCs-qob{gX zg3g0HlDuk~*&j_Aqh$w)Hl9W6ZE>j&Kaf?5UqvfH%}hP;;w-f)YO*AA!3I^Wl}9Ll zZL}Yg12zz3&sER*f?o5yM+9UbF3>%ycn7oh}q+Dh!kvwaj%Ce=-YYSfxadH_MddWWE@L zk-`ZFN7(=cuHG5W2caU6iy+&ukxa1>&1Zw@SYe~WKsiy%9Lz+=C!>+VOc-qBq>jLc zv*~!URMl1>;93idT$}o{@nBRP9-9Z@d1Q~!fV+p%d8-W~^V~WoxI?F#!f}~E(Ohwv zw$Wza2$SgjDlr*=8#XEWgi!npr2sVzWg}KkLs`<}S6^$A`h{4fKD`jD{}43b10?GE z2F*XGxCr(7IWK*Y&|CazHSk2GOSV=ENe}k$l2HYu4!@9uJA}ii)aUU!4+9 z1!0X)0$$^KGAuQ#o(#)h4>TFRv0F1oJJVkR9}no@^|%_(RlV_M6=iX8%VQpGDq9V^ z>WBVnsP?2Jt7B>}2iD1krpQasqp|YwqRIbjkbSkY%G85bd{t%6*h(hb2EU6Ww^T(- z#-o7@8p_6NYEAZ*>hx5;$f9UdW@;v{nCmQn9-f?vWnXh3W#49*xloP=Fj- zmvEgyf0TD3HghqDrI+r?bXln{qz_oBbdA773fQjtEwCkqMK$wCPorL9aML`{vDk#UML3+w z#2Y0aOzqZjE|&0J?VEUN;lt)zC*x+aHE1x6O491^tx2pb^zyyxe6}*d#b~JMBoMA- z+`gs~TLrUGw=+CtUC)1D!*+UuxOZ_x?6s;j*`~AQi2p^=OeK&=!`WyuTEa$I)@Egk zhO9-rHKWm$nk4FJ*&cz@rZM(KUb&ew;hQ-p<8J5V^eXLuRxV)bOO+ zIpuAdU8PM`MJ=0DVR^OaopRc|9bGQ7U>)V1ZI+&AOlx~(hWsqvM&%G&W_3<^(ClVh z^UUhfE)}T_av<~1yz}3u+PT><{iL*&$&)9*Ie1{dt@ELZ4siYOrDQDaQwD z+u0JTlpGtm%XkwPa^UTUxCfSDBU?r3?c-Y^^HI~P z|DwzPPP*J?%g~|Dkknr^`Y#&&@1)T!_MIIH4JiFZpZ}uIe?EOKH_r4_&fs+}0iYZV z#p37@TA$SNOA>(m3Ey+xEH*hvj0S4g>hut5-@-*RZ`s$X<8 z4uFUv2n=^ejJ*;3ae}(Jab8d-X^nHU<#C<*xB!+#el)9kQr7O-2DU>{<_1nYu?Dx$V$(k%D(NU@y$FWqzHlZnpY2fOqg7 z+`G^S){&%V&EXy5pjMYU!9}V@Rop0sdbvuA(6>oRryi2U&y|rqy$23IR=#GsxhHPF zM79fXABG*69&EcQxR|$(4qMfZapl3hlS0XSn;}Z|CNa|NQnVxa56Yfcxmx0fU_a+0h8+Fx!JayU8WyZlTJ{D)c&7EWqo=z?&vY??>I zB-*mnVV5J}^?JS5I#TMdBgl~sTuCU}gec4N8i!C1PKg$@DBV{v2Gsx=4No1K!K<;T z1t_+&`e#-M7;E&_3G7%5t`ipWgdFQLFNe^KiWn_%39zSrjK-|}!(%ourW1#LR5e*t zM1^qj{AX4a5X1A=6Z51It|l~bLYndz(IJ$iq(#fSD&JQ{hDZCD3=Bg^fPED=mi*s!@7Mk z;4gD7SkhD(Tq!|TTLjjhTW^v^P#25iV*TnnXf?h-wAT^|ZqZObf@(8cgqF3&I@P$g zQLk8)$LIneOnD^M*lu{GV~%JNua;g>-Lz0Y^s*@5rklLFm1zK(G8Z6T&!Bc8+CxutZIp6Ok}-3_Mhl*@~?IZu3Y-JjJ6Oc4Kew* zq|r(Yd-B<~4re>e{VHALPCM6Rak)~jbc#@K{2_?0S`&54Y!6O7h`KpFxQ6+(A)3Q{S%x0I>4B5&HJr8 zs~tg)&Nwi^R@3!C#>=0#z5}=K>K%0O!9u$smI+3W)QH`TSIBUZQVd#PxGhbni=$YB zR|=#Sf>9#Y&FimvWuBf|cTdF7;A((y(JKL>&?{6|Lj&4WB(8z2TyMdn_{9~HAu+=? zn4)L)s#C#iRVUZ@{pwUOL;s-FA>`eP+Ld{0*DtN8U75Fb{nv_GNCyeQY5i8i$i6(V z^q@bY)>(TZwy9C;f;|yK@3qqbB;9iST#Z<(9%(sxu12g?&$S#o)JnD5WN9;Y^m)^N z@E8Fl??KSIP7-r;%q$9HsY7*)iEV4SYfs&Oj{w(0Q$={4aV=6V~aj)zQn?*28`kDT%MaVN}o%JUxFY2&)Lm ze#P3NMla09$Zl2MXrSLcgP@K+wH>@w@|e@_!#nD`LT|RHh3HDy1V=Jfl^2BImJ3ACo*Bw42FVEIm!O$+xGCN)O-JFx`^9uPev{bTyg@+M}l_4i4JU zR3)~4CK}}1&3cuG?B!@Zk3xMJ>YL+5-g_D-310?O)*;p)qdMbDbIrkkjYZyTyi9z+ zi^>c}c-fsej8Y@relTY%s$Buo?N=(RyaBB(p!ICfFsstbP=)KYywUdI@%(b8r1z*9h(wx%|G&Fu?QPsh^1FWpGseO*yP}4YE!n<70&I41Nr1b( z1rlKIfB*wpqAX@8QcF^{we#n%-(A&R-K1paKHN-#v76Pe>gww1s_Lp0tI)T3S@&Iv zlf3ZMEhbF0n<#5`Plxo*Lho_N*Hn~s^URpvBVVBcrNxJ6z>HR>S6$K-r}5W3l;sx*!st4d;Ng99;wg z(zw?_fSP^2DtpE?7~>PImsQVcA+Pq^{Jr}6?L5;fAqH#0w#eUx9=XOM5IM=FL?IZH zy5iHLTF6mdJRBIo*8q>0*Aac#EfL%dh|u%>zQ`He3We_4HS4@en|)E!QTHtn4s&L3 zPlV~WTy9go6k=^HgKGgl$Io0X-!p-7X4wszgYGTuRxLY`1b+JFu-b~D9C}VdR&Oqb z&F&@ZLj9bs%e-o|ynuqvZ<=Crn_zwSThD{OhZIGd~dis$GS>* zq>>`>fj0lbwM;><3J$6d=Rko&*bpE@e_3PX^E`J=`dgP=cI;r}DG(H()kvPPR@sP! z%7#}d8(5<3gSTtI<}lRx0(XNcJ=*+F7ycY+fk++iI-itIWDOz|igwgf=SV|zPOnJp zyAfZ;JP_vzFz<_G*s51O=MxrZu)xGaip5#HxKWf^w2wZkSq?0e6yv^GKZ;G^#Tq*XzLMK zr~tJ4Se=fNU=!LwVla^f$US1EBWHV2&&9Q53Nx!1p(kwDu~%Byw2fteO3#R95U%f~ znn!aJnNR;D{+YO+aNg4ZkgAVhhg-r0L~2m;ay9V6)*FO2dqw60pvF$kX*E8}So?z$ z1_^KdR>j>w4O9I>G=UhPl$3Zd>K!|u53PIsh8Iz}-|pETiFI}QEEK8h-KBrGvY+fk z=B|=4b_0nzsk2={Ewc=-wMxxu&P-Dqo_3*gXQ6^Q1P&AT=!t=&zPlYB^|cCS%+qH1 zGrzx|J2S7GS>N0G)4pk{zT8I^2%JB+8Lco8SF26FD=Sv|?mzOrc{fSk{a92_1rHgV z{H-_?ti%*dl0Ua>H6}^N@WyAyJV1uw<{(I}`w(BsV8wt0^10Ta`~)ed5P2pw%lg{~IoG3r*(1u+If z5?n}C8(sn|6lumO6M&=PLDjDk72z0UQ1YRHfP~vb#OpU3izN4vSos~t5*&wg29oOm z#B{W?qa$!fAzyTa#t~W@I1G4=7&negj|6-cudqVHP;4YLkh4gY8ib?Jr-zY7krJlX z2vW`;OPo-G)cPi4xtQ*oy@-Q5AYer(riJBON-Y4Q18Hq3*aLz%EKPtL&D=E12Db3G0J7YTa zSb$LOA|P-RruD#-O%wWAC@V5!1P48P+zpI&m^s8jdP2d5u!YET?BF%OuHQg zrt)1ba`eBU9VA1UJHN0BVd%xyA#$=Jh&xZ!C1__4>mk zdG8qrdAS)>e6dckxMDPZvh@cIufdv8`)jCH$P63oMGL-6Amcjd^r`I1hq4k%G)v}S zGNT~JHK+RC7j3sMWOQzk2hQm+^4iWFx|H2o(>)UUyF7Gn==W3D^^%{K0 z?1vvzjSjL99o(Ht2iA?& z{Qx~`fo~T5EHvU?d%CIDW5Uyt{getpD)QYwFwOVJ>bTzupw+f`YMVOsPooGh+$+%o zccHIF#wM_Ee0|DV+>b~(Vf1wA>7dPQMnWry-w2BkG1^MxbZm4SgFTN~U+jD_H<}vv zT>_<>zaVa>k{+SyMOsn@2dX^2Tz$#auk-Bs{%RP-vHJOyr|?*ptGs8MJR*-6-Km-@ zq62HAS^&vpNvZCxW#O3Q(X<%iiC<>$Rq4vhXggqG)m_?|=U!x#QDP8$f*ggZaepF> zOZFu@woKUO$@c)XH$?L5ee|80JtRIv(1Py;$WCMNG57FcO2Y5ep+F1rOV9+Qb4@_i zr25T$&I3%IkXFQIbJK;pb$@3$R!vhm0{Z2Y1E2pY1$e@BtF|a=skI6?#r-}9&g4yb z<+Zn=t^>T%xNL$;$aRc+pEOxBeAqNoR+q;q|swfczp1J1>w z30&hSw9UUF?f2aJ4GP!ZP5A;dqOqY0NhkBSEM)#${*uZk6WE*6RyNZS7KP|+Gz2{v z^_859{-&p*e^)cn4SN&OaN&7aJBVuq@g27RAI;TGmnV5Ka8mXS18D2wCoX!M*#|TG zLsbEJ5k50azA1NmhK{`M0jv>e6{z^#h1{0vO$IX9cwpUDS>Ny^Jh-wJdT@0x5IS+` za>$Ph(=+Fi?2P)DB{?|W9FGC=-Q(y-v6-3dTD|j&PdDE%k|bZuh;xlUvU)0uXI@7@ zsUu=tJe8|L9&m!X6*AJ7ZbYXVSb12F1KzDq09L-&e!m`UXvJS_qn4nT|Ip;o`-~V0PC}_#D*7Ju`gZ9-qi^9pJmFT#yteE6 z`yhU{AvLz2>=dKNw;&TB-BuxO3uW|dBk&WXJ^vX>$-a*Qd3WC+^%Ocev5bd z-mTA~HNRSb)&hWow6#gca|KY4XR926j_c1+VZ})J2>3#X5O7Cf}PH)8v1e12-r?FfuzP z>!!ZylV{dr(l-ekaLDNyguX=Yh+inj|KnQ zCaWzEFULl_Nw}v~%UgRY+OBNsE@?JkAPUs>HBEl1yS~WRljP8;=9=d^`OD8gi|@Rt z=WVa{O?E!PD{OIbg%?rPZ1f3>`;6>C7YldSTZb=NeVXryk$WO*kXt6)gFt0eD* z|0!!$41+CjUM2Z{uQB}(87uLdrqzuLs2E~H)T<+ zlRDoO-3RsM2TmO2ia{K?i*VN;HXHtFTIWyvG4`Jl{gWS~!@Nq75Nwa|1uk?AWiOFV z0h7doLROU^6mCm<9>m+)nkRWq95w50&*siP|0tu7@ag3o;rrzM_f6CD2yJ_Yr>B&C z`EbF|aVg`KqzV_h|A&?zsJtVw=?aD*Mk!VE*d)SNB-yad;*eI!Xq!jm;#da$UV(TE zfrwwpJKo83Uq8NMYp$F|#031OcevuAt=@mkJ4PJcN8U!770ZX&=598hukMxw`}g*G zInUUy`C@auncv>6?$`NxaXq_V%pR6^*=%-mdwreV-EXd!_qX>qd=MW3g9zGek@Z!3 zhda;cp4lPiBapv-ru*_V$5wZ&&6%MV(|;a{_LvIy^RG?>N@V6j zKADtl)Jmc^cSdw1x;;Gb5Ywu(w+6bfZ;eHdHcbLExGmC_^AwcfFnq!vi6B84V28h3 z-YNZCfe_a>(O}~-`p>w z9m6Zrc|9yMfYPA`%mD$L2xRv<1c%&9qR+U!Ll*F^7tce&?O6Kt{f&tvz_5s%tFC^~ zCj2h>F|Rf}0%UjfNuIeO_cC#|T3hU|MRu3HbDX4aDW@gIgn^X%07@>R&fsX{!f~YN$Mqp$>6o|D>Me=Q6?YV`xl?Z*$fLpf zHU%2Np)I8zgZmkLHi871n~L&p@NOe_coV=fVr#D1&&3+&^dY;M3aK#Fzo(l+z3Rmk zmdtrI%cjN|DR#bTHhxy0fyj7~NtmYk?P2#&=cUfDuPJ_BxMQJAS%d$QiTO1Dj0{)>yi zRkB`Fd;iWj^|{bgh)c_|*Ok-?^vSySr({Ff5Gn!fEM?rJ$l&)g9h+1FrB1Shue2XD zbzy}OLu1Do=dxQf0Xj{bM5-rwl%z^C6VV3)i#83EP4G-z z-!HCjHsn0yZ&D=})c9j=tUassSh4fE^}fY~=a<9HbpbE7DOa{INvJLIFX=O*BOIq- z%aB*p9enSVHdHAt3eSGU$gLlmy|*6C9!%ejziUI6YW5_Z8yRfDFtz^7pCT~Xgb7oh zo4q|y{l>UlLe}Lj$e+1;FgWmlr=ij-vP(AuTnUYPSwq#|V)`O{%T7?qW|Y^|u-8u7d|c0YMnt=a76 zovNI#h2}f&lDa4u9w%&#zZ7+{X`3BmS4z`5U3Gd`jyys%q5Bit?6ED5Q8;kj%cgg7 z`ygG5jn*}QZS(tjB;E}?#yoW?Jrz@m&VFXcRh>Uwq$mFoROtHtnjmFFOl6#-pQz{eY(PCD&Opik&&ep&3;-Nar8@pTb_hN%~a z;c=>&Aj5-@UUC*cUIWKhzTbc3T7vE)WB5G4^+z$V>9*fh)1rM~lygiTilpV|2+#1$ zc6gr1F4$V<$@8{h>&|acQ%)`aV8>@t@`Z<=Cdxc3eA2l+Ne)Ymk*|{a(M}*0Ak_G+ z2%Qgj`ahaqCemmmo&viHQ2N9eHhDV@;!$>PzMr`Lcf;32P7Bh2v-|}FO zXj1PMi{-WRM*5cjjXjf&_1GOA9~sxMkCI@J#v3y1wEo|Q*9zzipe}!*fiL+T(6^*5 zWi+2q29DXS5!+1zY+F0ZDWyKe%0H|hGnLg3JOBXgnKt0!0DMO7`xPeyz|QAOv(wqNi@N|7lonf?I!gJaKlYFAu=)R6{tt1>)IFexN5Uq(wUYD0QN; z3OXq3hPky@2qA8Khlk-RT*fINBwg$nz~L2CL-8SL&gd@1P7U3 zAWW;x_=rGom`$i^9>Cqy3znR#ZJ=i1Q4EMNwY*jHmaPz02tl4Ll189zi1zNK?jBp$s9WrWzOMdo^V^;dD8%Nm^JBsGXy?NJ?_8G$qX66)F==+|B?z0bdVXw zjF};-$I7_oEL82n0p>zp=Vz`qH(hM2#EBXBHCR|wx&7obH>ijkfhaOT0w|lT(vJl~ zSR3VU`h4t4u2)*5JOgzrV(EQJZN^(Vo7M^SwaR*;Y8}Tlex%xPbOG7T%yH(Jw$1bO zk=@}6C71hGbyFgP6U($9ps-6fRq^7M^D@_^19gV2?QTsazwlAp?Iu*%B8NO<8Vs97 zuYGPu^fGnbE6WaDV zNj&AWtr`6IbHVrx53e(--`8}2Rs=}zm;9Lk@Br4a)Lp6=ip16Rj8ClMf!~P8`64FU pp%xYg{>G-Fteqw}47P!~CI`m=F>H|tyUbVw{VyX~cw4+|0|3%`3?~2p literal 0 HcmV?d00001 diff --git a/public/assets/application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js b/public/assets/application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js new file mode 100644 index 000000000..e11961aa1 --- /dev/null +++ b/public/assets/application-74e18a9d7cae637d1b4436bf31d828d6ed094460019723a85d51805ecd75a2b3.js @@ -0,0 +1,34091 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "