carapace 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/CHANGELOG.md +31 -14
  2. data/Gemfile +17 -0
  3. data/README.md +36 -32
  4. data/Rakefile +32 -2
  5. data/carapace.gemspec +29 -0
  6. data/lib/carapace.rb +2 -124
  7. data/lib/carapace/carapace.rb +124 -0
  8. data/lib/carapace/engine.rb +7 -0
  9. data/lib/carapace/version.rb +3 -0
  10. data/lib/tasks/carapace_tasks.rake +4 -0
  11. data/test/dummy/README.md +134 -0
  12. data/test/{rails_app → dummy}/Rakefile +3 -6
  13. data/test/dummy/app/assets/javascripts/application.js +15 -0
  14. data/test/dummy/app/assets/javascripts/message.js +2 -0
  15. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  16. data/test/dummy/app/assets/stylesheets/message.css +4 -0
  17. data/test/dummy/app/controllers/application_controller.rb +3 -0
  18. data/test/{rails_app → dummy}/app/controllers/message_controller.rb +0 -0
  19. data/test/dummy/app/helpers/application_helper.rb +2 -0
  20. data/test/{rails_app → dummy}/app/helpers/message_helper.rb +0 -0
  21. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  22. data/test/{rails_app → dummy}/app/views/message/index.html.erb +1 -1
  23. data/test/dummy/config.ru +4 -0
  24. data/test/dummy/config/application.rb +59 -0
  25. data/test/dummy/config/boot.rb +10 -0
  26. data/test/{rails_app → dummy}/config/database.yml +9 -3
  27. data/test/dummy/config/environment.rb +5 -0
  28. data/test/dummy/config/environments/development.rb +37 -0
  29. data/test/dummy/config/environments/production.rb +67 -0
  30. data/test/dummy/config/environments/test.rb +37 -0
  31. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  32. data/test/{rails_app → dummy}/config/initializers/inflections.rb +7 -2
  33. data/test/{rails_app → dummy}/config/initializers/mime_types.rb +0 -0
  34. data/test/dummy/config/initializers/secret_token.rb +7 -0
  35. data/test/dummy/config/initializers/session_store.rb +8 -0
  36. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  37. data/test/dummy/config/locales/en.yml +5 -0
  38. data/test/dummy/config/routes.rb +61 -0
  39. data/test/dummy/db/development.sqlite3 +0 -0
  40. data/test/dummy/log/development.log +742 -0
  41. data/test/dummy/log/test.log +27 -0
  42. data/test/dummy/public/404.html +26 -0
  43. data/test/dummy/public/422.html +26 -0
  44. data/test/dummy/public/500.html +25 -0
  45. data/test/{rails_app → dummy}/public/favicon.ico +0 -0
  46. data/test/dummy/script/rails +6 -0
  47. data/test/{rails_app → dummy}/test/functional/message_controller_test.rb +3 -5
  48. data/test/dummy/test/unit/helpers/message_helper_test.rb +4 -0
  49. data/test/dummy/tmp/cache/assets/C78/9E0/sprockets%2F8172886cba8a1911b217c81605b19e14 +0 -0
  50. data/test/dummy/tmp/cache/assets/CD3/C80/sprockets%2F60a4ed28b40070af1a35a65086d3758f +0 -0
  51. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  52. data/test/dummy/tmp/cache/assets/D08/C80/sprockets%2Fcb11b48a42f94e0db70f194493a32c77 +0 -0
  53. data/test/dummy/tmp/cache/assets/D30/D70/sprockets%2Ffba6ea9d0d74a2071065123308daec69 +0 -0
  54. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  55. data/test/dummy/tmp/cache/assets/D42/790/sprockets%2F63f423d2fb157e98fb0d8ee89c0351a1 +0 -0
  56. data/test/dummy/tmp/cache/assets/D4C/AD0/sprockets%2F1a9dcbbb7774e26a180893a79bb0889f +0 -0
  57. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  58. data/test/{rails_app/public/javascripts/carapace.js → dummy/tmp/cache/assets/D55/0F0/sprockets%2Fec9774e5f33cb737f35ee3aa8257963e} +0 -0
  59. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  60. data/test/dummy/tmp/cache/assets/D88/4B0/sprockets%2Fdc0cf832aa65e1e6dbda9551c17120c1 +0 -0
  61. data/test/dummy/tmp/cache/assets/D8B/E80/sprockets%2Fd0d64e037bd6d546f0b09a25b2cc24db +0 -0
  62. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  63. data/test/dummy/tmp/cache/assets/E02/120/sprockets%2F73ff50f3f5d1f01c2ee1bedfe4e56d67 +0 -0
  64. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  65. data/test/dummy/tmp/cache/assets/E0D/340/sprockets%2Fb7e1e6b8d949eef8a343b78da5f07bae +0 -0
  66. data/test/integration/static_asset_test.rb +8 -0
  67. data/test/test_helper.rb +14 -0
  68. data/{rails_generators/templates → vendor/assets/javascripts}/carapace.js +0 -0
  69. metadata +194 -57
  70. data/rails_generators/USAGE +0 -7
  71. data/rails_generators/carapace_generator.rb +0 -7
  72. data/test/rails_app/README.md +0 -130
  73. data/test/rails_app/app/controllers/application.rb +0 -10
  74. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  75. data/test/rails_app/config/boot.rb +0 -109
  76. data/test/rails_app/config/environment.rb +0 -60
  77. data/test/rails_app/config/environments/development.rb +0 -18
  78. data/test/rails_app/config/environments/production.rb +0 -19
  79. data/test/rails_app/config/environments/test.rb +0 -22
  80. data/test/rails_app/config/routes.rb +0 -35
  81. data/test/rails_app/doc/README_FOR_APP +0 -2
  82. data/test/rails_app/public/404.html +0 -30
  83. data/test/rails_app/public/422.html +0 -30
  84. data/test/rails_app/public/500.html +0 -30
  85. data/test/rails_app/public/dispatch.cgi +0 -10
  86. data/test/rails_app/public/dispatch.fcgi +0 -24
  87. data/test/rails_app/public/dispatch.rb +0 -10
  88. data/test/rails_app/public/images/rails.png +0 -0
  89. data/test/rails_app/public/javascripts/application.js +0 -2
  90. data/test/rails_app/public/javascripts/controls.js +0 -963
  91. data/test/rails_app/public/javascripts/dragdrop.js +0 -972
  92. data/test/rails_app/public/javascripts/effects.js +0 -1120
  93. data/test/rails_app/public/javascripts/prototype.js +0 -4225
  94. data/test/rails_app/public/robots.txt +0 -5
  95. data/test/rails_app/script/about +0 -3
  96. data/test/rails_app/script/console +0 -3
  97. data/test/rails_app/script/destroy +0 -3
  98. data/test/rails_app/script/generate +0 -3
  99. data/test/rails_app/script/performance/benchmarker +0 -3
  100. data/test/rails_app/script/performance/profiler +0 -3
  101. data/test/rails_app/script/performance/request +0 -3
  102. data/test/rails_app/script/plugin +0 -3
  103. data/test/rails_app/script/process/inspector +0 -3
  104. data/test/rails_app/script/process/reaper +0 -3
  105. data/test/rails_app/script/process/spawner +0 -3
  106. data/test/rails_app/script/runner +0 -3
  107. data/test/rails_app/script/server +0 -3
  108. data/test/rails_app/test/test_helper.rb +0 -38
@@ -1,7 +0,0 @@
1
- Usage:
2
-
3
- script/generate carapace
4
-
5
- This installs the Carapace javascript into public/javascripts.
6
-
7
- For further information see the README
@@ -1,7 +0,0 @@
1
- class CarapaceGenerator < Rails::Generator::Base
2
- def manifest
3
- record do |m|
4
- m.file "carapace.js", "public/javascripts/carapace.js"
5
- end
6
- end
7
- end
@@ -1,130 +0,0 @@
1
- ## Test Rails Application for Carapace
2
-
3
- This is a small Rails application to test the Carapace gem.
4
-
5
- It comprises one controller with a single "index" action and the associated
6
- view which does two things:
7
-
8
- 1. It provides an input field into which a user can enter a message. Upon
9
- submit the same index action is invoked.
10
-
11
- 2. If a message had been entered previously then that message is displayed
12
- as well as the input field described above.
13
-
14
- This test application does not include a database component (it is explicitly
15
- disabled in config/environment.rb).
16
-
17
- To test Carapace inside the rails app:
18
-
19
- 1. Run the embedded tests: `rake test`
20
-
21
- 2. Run the application: `script/server`. Naviagate to the application
22
- (e.g. http://localhost:3000), enter a message in the input box and
23
- press `send`. The message should be displayed on the screen.
24
-
25
- If you watch closely when pressing `send` the encrypted message text
26
- will be briefly visible in the message input box.
27
-
28
- ### Building
29
-
30
- This section describes how to build the test application from scratch.
31
-
32
- 1. Install the gem:
33
-
34
- gem install carapace
35
-
36
- 2. Create a basic rails application:
37
-
38
- rails rails_app
39
-
40
- 3. Configure the environment:
41
-
42
- Disable unwanted frameworks. Add the below line to config/environment.rb
43
- after the comment about skipping frameworks:
44
-
45
- config.frameworks -= [ :active_record, :action_mailer ]
46
-
47
- Set up the application root in `config/routes.rb`:
48
-
49
- map.root :controller => "message"
50
-
51
- Delete `public/index.html`:
52
-
53
- Set up Carapace:
54
-
55
- script/generate carapace
56
-
57
- 4. Create a controller
58
-
59
- script/generate controller Message index
60
-
61
- Write code in `app/controllers/message_controller.rb`:
62
-
63
- class MessageController < ApplicationController
64
-
65
- require 'carapace'
66
- include Carapace
67
-
68
- def index
69
- carapace_session
70
- if request.post?
71
- @message=params[:message]
72
- carapace_decrypt! @message
73
- end
74
- end
75
-
76
- end
77
-
78
- Write code in `app/views/message/index.html.erb`:
79
-
80
- <%= javascript_include_tag 'carapace.js' %>
81
- <%= carapace_javascript %>
82
-
83
- <script class=javascript>
84
-
85
- function onSubmit()
86
- {
87
- carapace_encrypt(document.getElementById("message"));
88
- }
89
- </script>
90
-
91
-
92
- <h1>Send a message with Carapace</h1>
93
-
94
- <% unless @message.nil? %>
95
-
96
- <p> Received message: <%= @message %> </p>
97
-
98
- <% end %>
99
-
100
- <% form_tag do %>
101
- Your message: <%= text_field_tag :message %>
102
- <%= submit_tag "Send", :class => "submit", :onclick => "onSubmit()" %>
103
- <% end %>
104
-
105
- 5. Test
106
-
107
- Write code in `test/functional/message_controller_test.rb`:
108
-
109
- require File.dirname(__FILE__) + '/../test_helper'
110
-
111
- class MessageControllerTest < ActionController::TestCase
112
-
113
- def test_index
114
- get :index
115
- assert_response :success
116
- end
117
- end
118
-
119
- Run the tests:
120
-
121
- rake test
122
-
123
- 6. Run
124
-
125
- script/server
126
-
127
- ### License
128
-
129
- See LICENSE in the gem.
130
-
@@ -1,10 +0,0 @@
1
- # Filters added to this controller apply to all controllers in the application.
2
- # Likewise, all the methods added will be available for all controllers.
3
-
4
- class ApplicationController < ActionController::Base
5
- helper :all # include all helpers, all the time
6
-
7
- # See ActionController::RequestForgeryProtection for details
8
- # Uncomment the :secret if you're not using the cookie session store
9
- protect_from_forgery # :secret => '305de1e9143e4b2716fe7cb5970a3030'
10
- end
@@ -1,3 +0,0 @@
1
- # Methods added to this helper will be available to all templates in the application.
2
- module ApplicationHelper
3
- end
@@ -1,109 +0,0 @@
1
- # Don't change this file!
2
- # Configure your app in config/environment.rb and config/environments/*.rb
3
-
4
- RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5
-
6
- module Rails
7
- class << self
8
- def boot!
9
- unless booted?
10
- preinitialize
11
- pick_boot.run
12
- end
13
- end
14
-
15
- def booted?
16
- defined? Rails::Initializer
17
- end
18
-
19
- def pick_boot
20
- (vendor_rails? ? VendorBoot : GemBoot).new
21
- end
22
-
23
- def vendor_rails?
24
- File.exist?("#{RAILS_ROOT}/vendor/rails")
25
- end
26
-
27
- # FIXME : Ruby 1.9
28
- def preinitialize
29
- load(preinitializer_path) if File.exists?(preinitializer_path)
30
- end
31
-
32
- def preinitializer_path
33
- "#{RAILS_ROOT}/config/preinitializer.rb"
34
- end
35
- end
36
-
37
- class Boot
38
- def run
39
- load_initializer
40
- Rails::Initializer.run(:set_load_path)
41
- end
42
- end
43
-
44
- class VendorBoot < Boot
45
- def load_initializer
46
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
47
- end
48
- end
49
-
50
- class GemBoot < Boot
51
- def load_initializer
52
- self.class.load_rubygems
53
- load_rails_gem
54
- require 'initializer'
55
- end
56
-
57
- def load_rails_gem
58
- if version = self.class.gem_version
59
- gem 'rails', version
60
- else
61
- gem 'rails'
62
- end
63
- rescue Gem::LoadError => load_error
64
- $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
65
- exit 1
66
- end
67
-
68
- class << self
69
- def rubygems_version
70
- Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
71
- end
72
-
73
- def gem_version
74
- if defined? RAILS_GEM_VERSION
75
- RAILS_GEM_VERSION
76
- elsif ENV.include?('RAILS_GEM_VERSION')
77
- ENV['RAILS_GEM_VERSION']
78
- else
79
- parse_gem_version(read_environment_rb)
80
- end
81
- end
82
-
83
- def load_rubygems
84
- require 'rubygems'
85
-
86
- unless rubygems_version >= '0.9.4'
87
- $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
88
- exit 1
89
- end
90
-
91
- rescue LoadError
92
- $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
93
- exit 1
94
- end
95
-
96
- def parse_gem_version(text)
97
- $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
98
- end
99
-
100
- private
101
- def read_environment_rb
102
- File.read("#{RAILS_ROOT}/config/environment.rb")
103
- end
104
- end
105
- end
106
- end
107
-
108
- # All that for this:
109
- Rails.boot!
@@ -1,60 +0,0 @@
1
- # Be sure to restart your server when you modify this file
2
-
3
- # Uncomment below to force Rails into production mode when
4
- # you don't control web/app server and can't set it the proper way
5
- # ENV['RAILS_ENV'] ||= 'production'
6
-
7
- # Specifies gem version of Rails to use when vendor/rails is not present
8
- # RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION
9
-
10
- # Bootstrap the Rails environment, frameworks, and default configuration
11
- require File.join(File.dirname(__FILE__), 'boot')
12
-
13
- Rails::Initializer.run do |config|
14
- # Settings in config/environments/* take precedence over those specified here.
15
- # Application configuration should go into files in config/initializers
16
- # -- all .rb files in that directory are automatically loaded.
17
- # See Rails::Configuration for more options.
18
-
19
- # Skip frameworks you're not going to use (only works if using vendor/rails).
20
- # To use Rails without a database, you must remove the Active Record framework
21
- # config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
22
- config.frameworks -= [ :active_record, :action_mailer ]
23
-
24
- # Only load the plugins named here, in the order given. By default, all plugins
25
- # in vendor/plugins are loaded in alphabetical order.
26
- # :all can be used as a placeholder for all plugins not explicitly named
27
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
28
-
29
- # Add additional load paths for your own custom dirs
30
- # config.load_paths += %W( #{RAILS_ROOT}/extras )
31
-
32
- # Force all environments to use the same logger level
33
- # (by default production uses :info, the others :debug)
34
- # config.log_level = :debug
35
-
36
- # Your secret key for verifying cookie session data integrity.
37
- # If you change this key, all old sessions will become invalid!
38
- # Make sure the secret is at least 30 characters and all random,
39
- # no regular words or you'll be exposed to dictionary attacks.
40
- config.action_controller.session = {
41
- :session_key => '_testapp_session',
42
- :secret => '8ed1a9a8c631e485db3efa3face5fe94c9f4f8cb680084c41ee3d22d5c565525a92a1c45f8c093a38369c068bce9077cc2215644ed20bcb5419814e3398a3207'
43
- }
44
-
45
- # Use the database for sessions instead of the cookie-based default,
46
- # which shouldn't be used to store highly confidential information
47
- # (create the session table with 'rake db:sessions:create')
48
- # config.action_controller.session_store = :active_record_store
49
-
50
- # Use SQL instead of Active Record's schema dumper when creating the test database.
51
- # This is necessary if your schema can't be completely dumped by the schema dumper,
52
- # like if you have constraints or database-specific column types
53
- # config.active_record.schema_format = :sql
54
-
55
- # Activate observers that should always be running
56
- # config.active_record.observers = :cacher, :garbage_collector
57
-
58
- # Make Active Record use UTC-base instead of local time
59
- # config.active_record.default_timezone = :utc
60
- end
@@ -1,18 +0,0 @@
1
- # Settings specified here will take precedence over those in config/environment.rb
2
-
3
- # In the development environment your application's code is reloaded on
4
- # every request. This slows down response time but is perfect for development
5
- # since you don't have to restart the webserver when you make code changes.
6
- config.cache_classes = false
7
-
8
- # Log error messages when you accidentally call methods on nil.
9
- config.whiny_nils = true
10
-
11
- # Show full error reports and disable caching
12
- config.action_controller.consider_all_requests_local = true
13
- config.action_view.debug_rjs = true
14
- config.action_controller.perform_caching = false
15
- config.action_view.cache_template_extensions = false if Rails::VERSION::STRING < "2.2"
16
-
17
- # Don't care if the mailer can't send
18
- config.action_mailer.raise_delivery_errors = false
@@ -1,19 +0,0 @@
1
- # Settings specified here will take precedence over those in config/environment.rb
2
-
3
- # The production environment is meant for finished, "live" apps.
4
- # Code is not reloaded between requests
5
- config.cache_classes = true
6
-
7
- # Use a different logger for distributed setups
8
- # config.logger = SyslogLogger.new
9
-
10
- # Full error reports are disabled and caching is turned on
11
- config.action_controller.consider_all_requests_local = false
12
- config.action_controller.perform_caching = true
13
- config.action_view.cache_template_loading = true
14
-
15
- # Enable serving of images, stylesheets, and javascripts from an asset server
16
- # config.action_controller.asset_host = "http://assets.example.com"
17
-
18
- # Disable delivery errors, bad email addresses will be ignored
19
- # config.action_mailer.raise_delivery_errors = false
@@ -1,22 +0,0 @@
1
- # Settings specified here will take precedence over those in config/environment.rb
2
-
3
- # The test environment is used exclusively to run your application's
4
- # test suite. You never need to work with it otherwise. Remember that
5
- # your test database is "scratch space" for the test suite and is wiped
6
- # and recreated between test runs. Don't rely on the data there!
7
- config.cache_classes = true
8
-
9
- # Log error messages when you accidentally call methods on nil.
10
- config.whiny_nils = true
11
-
12
- # Show full error reports and disable caching
13
- config.action_controller.consider_all_requests_local = true
14
- config.action_controller.perform_caching = false
15
-
16
- # Disable request forgery protection in test environment
17
- config.action_controller.allow_forgery_protection = false
18
-
19
- # Tell ActionMailer not to deliver emails to the real world.
20
- # The :test delivery method accumulates sent emails in the
21
- # ActionMailer::Base.deliveries array.
22
- config.action_mailer.delivery_method = :test
@@ -1,35 +0,0 @@
1
- ActionController::Routing::Routes.draw do |map|
2
- # The priority is based upon order of creation: first created -> highest priority.
3
-
4
- # Sample of regular route:
5
- # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
6
- # Keep in mind you can assign values other than :controller and :action
7
-
8
- # Sample of named route:
9
- # map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
10
- # This route can be invoked with purchase_url(:id => product.id)
11
-
12
- # Sample resource route (maps HTTP verbs to controller actions automatically):
13
- # map.resources :products
14
-
15
- # Sample resource route with options:
16
- # map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }
17
-
18
- # Sample resource route with sub-resources:
19
- # map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
20
-
21
- # Sample resource route within a namespace:
22
- # map.namespace :admin do |admin|
23
- # # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)
24
- # admin.resources :products
25
- # end
26
-
27
- # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
28
- map.root :controller => "message"
29
-
30
- # See how all your routes lay out with "rake routes"
31
-
32
- # Install the default routes as the lowest priority.
33
- map.connect ':controller/:action/:id'
34
- map.connect ':controller/:action/:id.:format'
35
- end
@@ -1,2 +0,0 @@
1
- Use this README file to introduce your application and point to useful places in the API for learning more.
2
- Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries.
@@ -1,30 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
-
4
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
-
6
- <head>
7
- <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
- <title>The page you were looking for doesn't exist (404)</title>
9
- <style type="text/css">
10
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
- div.dialog {
12
- width: 25em;
13
- padding: 0 4em;
14
- margin: 4em auto 0 auto;
15
- border: 1px solid #ccc;
16
- border-right-color: #999;
17
- border-bottom-color: #999;
18
- }
19
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
- </style>
21
- </head>
22
-
23
- <body>
24
- <!-- This file lives in public/404.html -->
25
- <div class="dialog">
26
- <h1>The page you were looking for doesn't exist.</h1>
27
- <p>You may have mistyped the address or the page may have moved.</p>
28
- </div>
29
- </body>
30
- </html>