furnace-xray 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +60 -0
  5. data/Rakefile +1 -0
  6. data/bin/furnace-xray +23 -0
  7. data/furnace-xray.gemspec +33 -0
  8. data/lib/furnace-xray.rb +1 -0
  9. data/lib/furnace-xray/app/app.rb +56 -0
  10. data/lib/furnace-xray/app/assets/images/chosen-sprite.png +0 -0
  11. data/lib/furnace-xray/app/assets/images/evil_martians_bw_logo.svg +3 -0
  12. data/lib/furnace-xray/app/assets/images/evil_martians_logo.svg +3 -0
  13. data/lib/furnace-xray/app/assets/images/ui/ui-bg_diagonal-maze_20_6e4f1c_10x10.png +0 -0
  14. data/lib/furnace-xray/app/assets/images/ui/ui-bg_diagonal-maze_40_000000_10x10.png +0 -0
  15. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_10_eceadf_60x60.png +0 -0
  16. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_10_f8f7f6_60x60.png +0 -0
  17. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_15_eceadf_60x60.png +0 -0
  18. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_15_f7f3de_60x60.png +0 -0
  19. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_15_ffffff_60x60.png +0 -0
  20. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_65_654b24_60x60.png +0 -0
  21. data/lib/furnace-xray/app/assets/images/ui/ui-bg_fine-grain_68_b83400_60x60.png +0 -0
  22. data/lib/furnace-xray/app/assets/images/ui/ui-icons_222222_256x240.png +0 -0
  23. data/lib/furnace-xray/app/assets/images/ui/ui-icons_3572ac_256x240.png +0 -0
  24. data/lib/furnace-xray/app/assets/images/ui/ui-icons_8c291d_256x240.png +0 -0
  25. data/lib/furnace-xray/app/assets/images/ui/ui-icons_b83400_256x240.png +0 -0
  26. data/lib/furnace-xray/app/assets/images/ui/ui-icons_fbdb93_256x240.png +0 -0
  27. data/lib/furnace-xray/app/assets/images/ui/ui-icons_ffffff_256x240.png +0 -0
  28. data/lib/furnace-xray/app/assets/javascripts/application.js.coffee +219 -0
  29. data/lib/furnace-xray/app/assets/javascripts/lib/drawer.js.coffee +206 -0
  30. data/lib/furnace-xray/app/assets/javascripts/lib/graph.js.coffee +26 -0
  31. data/lib/furnace-xray/app/assets/javascripts/lib/input.js.coffee +134 -0
  32. data/lib/furnace-xray/app/assets/javascripts/lib/input_state.js.coffee +8 -0
  33. data/lib/furnace-xray/app/assets/javascripts/lib/map.js.coffee +45 -0
  34. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/argument.js.coffee +7 -0
  35. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/block.js.coffee +76 -0
  36. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/function.js.coffee +15 -0
  37. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/instruction.js.coffee +33 -0
  38. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/operand.js.coffee +21 -0
  39. data/lib/furnace-xray/app/assets/javascripts/lib/nodes/type.js.coffee +12 -0
  40. data/lib/furnace-xray/app/assets/javascripts/vendor/chosen.jquery.js +1090 -0
  41. data/lib/furnace-xray/app/assets/javascripts/vendor/d3.v3.js +7806 -0
  42. data/lib/furnace-xray/app/assets/javascripts/vendor/dagre.js +4053 -0
  43. data/lib/furnace-xray/app/assets/javascripts/vendor/hotkeys.jquery.js +106 -0
  44. data/lib/furnace-xray/app/assets/javascripts/vendor/jquery.js +9472 -0
  45. data/lib/furnace-xray/app/assets/javascripts/vendor/mustache.js +532 -0
  46. data/lib/furnace-xray/app/assets/javascripts/vendor/stacktrace-0.4.js +424 -0
  47. data/lib/furnace-xray/app/assets/javascripts/vendor/sugar-1.3.8.js +8615 -0
  48. data/lib/furnace-xray/app/assets/javascripts/vendor/ui.jquery.js +14850 -0
  49. data/lib/furnace-xray/app/assets/stylesheets/app.css.sass +199 -0
  50. data/lib/furnace-xray/app/assets/stylesheets/chosen.jquery.css +413 -0
  51. data/lib/furnace-xray/app/assets/stylesheets/elements.css.sass +31 -0
  52. data/lib/furnace-xray/app/assets/stylesheets/graph.css.sass +29 -0
  53. data/lib/furnace-xray/app/assets/stylesheets/ui.jquery.css +1174 -0
  54. data/lib/furnace-xray/app/public/fonts/iconic_stroke.afm +170 -0
  55. data/lib/furnace-xray/app/public/fonts/iconic_stroke.eot +0 -0
  56. data/lib/furnace-xray/app/public/fonts/iconic_stroke.otf +0 -0
  57. data/lib/furnace-xray/app/public/fonts/iconic_stroke.svg +553 -0
  58. data/lib/furnace-xray/app/public/fonts/iconic_stroke.ttf +0 -0
  59. data/lib/furnace-xray/app/public/fonts/iconic_stroke.woff +0 -0
  60. data/lib/furnace-xray/app/public/fonts/iconic_stroke_demo.html +1 -0
  61. data/lib/furnace-xray/app/views/index.haml +52 -0
  62. data/lib/furnace-xray/app/views/nodes/argument.jst.mustache +1 -0
  63. data/lib/furnace-xray/app/views/nodes/block.jst.mustache +4 -0
  64. data/lib/furnace-xray/app/views/nodes/diff/added_line.jst.mustache +1 -0
  65. data/lib/furnace-xray/app/views/nodes/diff/changed_line.jst.mustache +2 -0
  66. data/lib/furnace-xray/app/views/nodes/diff/removed_line.jst.mustache +1 -0
  67. data/lib/furnace-xray/app/views/nodes/diff/unchanged_line.jst.mustache +1 -0
  68. data/lib/furnace-xray/app/views/nodes/function.jst.mustache +1 -0
  69. data/lib/furnace-xray/app/views/nodes/function_removed.jst.mustache +1 -0
  70. data/lib/furnace-xray/app/views/nodes/instruction_typed.jst.mustache +3 -0
  71. data/lib/furnace-xray/app/views/nodes/instruction_void.jst.mustache +3 -0
  72. data/lib/furnace-xray/app/views/nodes/operand_argument.jst.mustache +1 -0
  73. data/lib/furnace-xray/app/views/nodes/operand_basic_block.jst.mustache +1 -0
  74. data/lib/furnace-xray/app/views/nodes/operand_constant.jst.mustache +1 -0
  75. data/lib/furnace-xray/app/views/nodes/operand_constant_function.jst.mustache +1 -0
  76. data/lib/furnace-xray/app/views/nodes/operand_instruction.jst.mustache +1 -0
  77. data/lib/furnace-xray/app/views/nodes/type_constant.jst.mustache +1 -0
  78. data/lib/furnace-xray/app/views/nodes/type_parametric.jst.mustache +3 -0
  79. data/lib/furnace-xray/lib/jst_pages.rb +226 -0
  80. data/lib/furnace-xray/version.rb +5 -0
  81. data/sample.json +1 -0
  82. metadata +251 -0
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .sass-cache
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'pry'
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Boris Staal
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,60 @@
1
+ # Furnace X-Ray
2
+
3
+ Furnace X-Ray is a visualizer for transformations performed on Static Single
4
+ Assignment form in the [Furnace][] framework.
5
+
6
+ [Furnace]: http://github.com/whitequark/furnace
7
+
8
+ ## Installation
9
+
10
+ $ gem install furnace-xray
11
+
12
+ ## Usage
13
+
14
+ First, you need to enable instrumentation for the functions you want to
15
+ observe. Here is a sample snippet:
16
+
17
+ ``` ruby
18
+ mod = SSA::Module.new
19
+
20
+ fun = SSA::Function.new('my-function')
21
+
22
+ # It is important to enable instrumentation before doing anything else
23
+ # with the function. Otherwise, the collected data will be invalid.
24
+ fun.instrumentaiton = SSA::EventStream.new
25
+ mod.add fun
26
+
27
+ # Optionally, notify the instrumentation engine that you have started
28
+ # a transformation.
29
+ fun.instrumentation.transform_start "Set return type"
30
+
31
+ # Now, do whatever you want with the function.
32
+ fun.return_type = SSA.void_type
33
+
34
+ # After you have finished transforming functions, fetch the instrumentation
35
+ # data and dump it as JSON.
36
+ File.write("data.json", JSON.dump(mod.instrumentation))
37
+ ```
38
+
39
+ To view collected data, just point furnace-xray to it:
40
+
41
+ $ furnace-xray data.json
42
+ [2013-01-27 20:05:13] INFO WEBrick 1.3.1
43
+ [2013-01-27 20:05:13] INFO ruby 1.9.3 (2012-04-20) [x86_64-linux]
44
+ == Sinatra/1.3.3 has taken the stage on 4567 for development with backup from WEBrick
45
+ [2013-01-27 20:05:13] INFO WEBrick::HTTPServer#start: pid=28695 port=4567
46
+
47
+ Now, open your ~~browser~~ Chrome or Chromium and point it to
48
+ http://localhost:4567.
49
+
50
+ ## Contributing
51
+
52
+ 1. Fork it
53
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
54
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
55
+ 4. Push to the branch (`git push origin my-new-feature`)
56
+ 5. Create new Pull Request
57
+
58
+ ## License
59
+
60
+ MIT.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'active_support/all'
5
+ require 'trollop'
6
+
7
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
8
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
9
+
10
+ require 'furnace-xray/version'
11
+ require 'furnace-xray/app/app'
12
+
13
+ opts = Trollop::options do
14
+ version "furnace-xray #{Furnace::Xray::VERSION}"
15
+
16
+ banner <<-EOS
17
+ Usage: furnace-xray <filename>
18
+ EOS
19
+ end
20
+
21
+ Trollop::die "File not specified or does not exist" unless ARGV[0] && File.exist?(ARGV[0])
22
+
23
+ Furnace::Xray::App.run! ARGV[0], :environment => :production
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'furnace-xray/version'
7
+
8
+ Gem::Specification.new do |gem|
9
+ gem.name = 'furnace-xray'
10
+ gem.version = Furnace::Xray::VERSION
11
+ gem.authors = ['Boris Staal']
12
+ gem.email = ['staal@evl.ms']
13
+ gem.description = 'A visualizer for transformations of code in Static Single Assignment form based on the Furnace library.'
14
+ gem.summary = gem.description
15
+ gem.homepage = 'https://github.com/evilmartians/furnace-xray'
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
+ gem.require_paths = ['lib']
21
+
22
+ gem.add_dependency 'trollop'
23
+ gem.add_dependency 'sprockets', '~> 2.0.0'
24
+ gem.add_dependency 'sinatra'
25
+ gem.add_dependency 'sinatra-sprockets-ext'
26
+ gem.add_dependency 'activesupport'
27
+ gem.add_dependency 'sprockets-vendor_gems'
28
+ gem.add_dependency 'haml'
29
+ gem.add_dependency 'sass'
30
+ gem.add_dependency 'sprockets-sass'
31
+ gem.add_dependency 'compass'
32
+ gem.add_dependency 'coffee-script'
33
+ end
@@ -0,0 +1 @@
1
+ require 'furnace-xray/version'
@@ -0,0 +1,56 @@
1
+ require 'sinatra/base'
2
+
3
+ require 'sprockets-vendor_gems/extend_all'
4
+ require 'sinatra/sprockets'
5
+
6
+ require 'haml'
7
+ require 'sprockets-sass'
8
+ require 'sass'
9
+ require 'compass'
10
+ require 'coffee-script'
11
+
12
+ require_relative '../lib/jst_pages'
13
+
14
+ Compass.configuration do |config|
15
+ config.project_path = File.dirname(__FILE__)
16
+ config.sass_dir = 'assets/stylesheets'
17
+ end
18
+
19
+ module Furnace
20
+ module Xray
21
+ class App < Sinatra::Base
22
+ def self.run!(file, options={})
23
+ set :json_location, file
24
+ super options
25
+ end
26
+
27
+ #
28
+ # Sprockets
29
+ #
30
+ register Sinatra::Sprockets
31
+ use Module.new {
32
+ def self.new(app)
33
+ Rack::Builder.new(app) do
34
+ map('/assets') { run Sinatra::Sprockets.environment }
35
+ end
36
+ end
37
+ }
38
+
39
+ #
40
+ # JST
41
+ #
42
+ register Sinatra::JstPages
43
+ serve_jst '/jst.js'
44
+
45
+ #
46
+ # App
47
+ #
48
+ enable :static
49
+ set :public_folder, File.expand_path('../public', __FILE__)
50
+
51
+ get '/' do
52
+ haml :index
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ <?xml version="1.0"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="157 293 283 207" width="283pt" height="207pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-11-20 08:29Z</dc:date><!-- Produced by OmniGraffle Professional 5.4.2 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><rect width="595.28998" height="841.89"/><g><title>Layer 1</title><path d="M 324.13959 353.9943 C 324.13959 353.9693 324.14059 346.0923 331.20959 344.4173 L 331.20959 331.3503 L 331.22559 331.3173 C 331.22659 331.2563 331.22559 310.0903 352.46959 310.0903 L 375.1466 310.0903 C 396.3896 310.0903 396.3896 331.2563 396.3896 331.3173 L 396.4066 331.3503 L 396.4066 344.4173 C 403.4746 346.0923 403.4756 353.9693 403.4766 353.9943 L 403.4766 354.0603 C 403.4756 354.0853 403.4746 361.9613 396.4066 363.6373 L 396.4066 365.3663 L 392.5086 365.3663 L 392.5086 366.7833 C 392.5086 369.6183 389.6736 369.6183 389.6736 369.6183 C 386.8396 369.6183 386.8396 366.7833 386.8396 366.7833 L 386.8396 365.3663 L 381.1696 365.3663 L 381.1696 366.7833 C 381.1696 369.6183 378.3356 369.6183 378.3356 369.6183 C 375.5006 369.6183 375.5006 366.7833 375.5006 366.7833 L 375.5006 365.3663 L 369.8316 365.3663 L 369.8316 366.7833 C 369.8316 369.6183 366.99659 369.6183 366.99659 369.6183 C 364.16159 369.6183 364.16159 366.7833 364.16159 366.7833 L 364.16159 365.3663 L 358.49259 365.3663 L 358.49259 366.7833 C 358.49259 369.6183 355.65859 369.6183 355.65859 369.6183 C 352.82359 369.6183 352.82359 366.7833 352.82359 366.7833 L 352.82359 365.3663 L 352.46959 365.3663 C 343.40959 365.3663 341.64559 376.3883 347.17459 380.6853 C 347.25759 379.9773 347.69559 378.1213 349.98859 378.1213 C 352.82359 378.1213 352.82359 380.9563 352.82359 380.9563 L 352.82359 382.3733 L 358.49259 382.3733 L 358.49259 380.9563 C 358.49259 378.1213 361.32759 378.1213 361.32759 378.1213 C 364.16159 378.1213 364.16159 380.9563 364.16159 380.9563 L 364.16159 382.3733 L 369.8316 382.3733 L 369.8316 380.9563 C 369.8316 378.1213 372.6656 378.1213 372.6656 378.1213 C 375.5006 378.1213 375.5006 380.9563 375.5006 380.9563 L 375.5006 382.3733 L 381.1696 382.3733 L 381.1696 380.9563 C 381.1696 378.1213 384.0046 378.1213 384.0046 378.1213 C 386.8396 378.1213 386.8396 380.9563 386.8396 380.9563 L 386.8396 382.3733 L 387.9026 382.3733 L 396.4066 382.3733 L 396.4066 409.3033 C 397.7126 409.3033 397.8286 408.1013 397.8396 407.8853 L 397.8236 407.8853 L 397.8236 389.0353 L 397.8236 387.3343 C 397.8236 387.3173 397.8236 381.3813 403.7766 381.3813 C 405.2416 381.3813 406.3456 381.7423 407.1776 382.2843 C 408.0106 381.7423 409.1146 381.3813 410.5796 381.3813 C 412.0446 381.3813 413.1486 381.7423 413.9806 382.2843 C 414.8136 381.7423 415.9176 381.3813 417.3826 381.3813 C 423.3356 381.3813 423.3356 387.3173 423.3356 387.3343 L 423.3356 389.0353 L 423.3356 407.8853 L 423.3186 407.9183 C 423.3176 407.9953 423.3186 434.8143 396.4066 434.8143 L 396.4066 436.4773 C 419.0616 439.1443 419.0666 463.0553 419.0666 463.1283 L 419.0836 463.1613 L 419.0836 467.0703 L 430.7646 478.7513 L 393.5716 478.7513 L 393.5716 463.1613 L 393.5876 463.1613 C 393.5776 462.9453 393.4606 461.7443 392.1546 461.7443 L 355.16959 461.7443 C 349.42959 478.7333 329.88559 478.7353 329.82559 478.7353 L 329.79159 478.7513 L 325.88359 478.7513 L 314.20159 490.4333 L 314.20159 453.2403 L 329.79159 453.2403 L 329.79159 453.2553 C 330.00859 453.2453 331.20959 453.1293 331.20959 451.8223 L 331.20959 434.8143 C 304.29659 434.8143 304.29759 407.9953 304.29659 407.9183 L 304.28059 407.8853 L 304.28059 396.5473 L 304.28059 389.0353 L 304.28059 387.3343 C 304.28059 387.3173 304.28059 381.3813 310.23259 381.3813 C 311.69859 381.3813 312.80259 381.7423 313.63459 382.2843 C 314.46759 381.7423 315.57159 381.3813 317.03559 381.3813 C 318.50159 381.3813 319.60559 381.7423 320.43759 382.2843 C 321.27059 381.7423 322.37459 381.3813 323.83959 381.3813 C 329.79159 381.3813 329.79159 387.3173 329.79159 387.3343 L 329.79159 389.0353 L 329.79159 396.5473 L 329.79159 407.8853 L 329.77659 407.8853 C 329.78659 408.1013 329.90259 409.3033 331.20959 409.3033 L 331.20959 363.6373 C 324.14059 361.9613 324.13959 354.0853 324.13959 354.0603 Z M 183.80759 437.4223 L 167.25359 429.1453 L 183.80759 420.8693 L 183.80759 420.4143 L 167.25359 412.1373 L 183.80759 403.8603 L 183.80759 403.4063 L 167.25359 395.1293 L 183.80759 386.8523 L 183.80759 386.3983 L 167.25359 378.1213 L 183.80759 369.8453 L 183.80759 331.3503 L 183.82459 331.3173 C 183.82559 331.2823 183.82659 324.3893 187.76259 318.4683 L 180.88759 311.5933 C 180.80559 311.5113 180.73259 311.4243 180.66659 311.3333 C 179.64659 311.8733 178.35559 312.2163 176.72159 312.2163 C 175.54759 312.2163 174.59559 311.2643 174.59559 310.0903 C 174.59559 308.9163 175.54759 307.9643 176.72159 307.9643 C 180.27259 307.9643 180.27259 304.4143 180.27259 304.4043 C 180.28259 303.2353 181.23759 302.2943 182.40759 302.3033 C 183.57659 302.3123 184.51759 303.2683 184.50859 304.4373 C 184.50859 304.4483 184.50859 306.3753 183.54859 308.3073 C 183.67059 308.3873 183.78659 308.4803 183.89359 308.5873 L 190.51159 315.2043 C 193.65459 312.2573 198.27259 310.0903 205.06759 310.0903 L 233.41459 310.0903 C 240.20859 310.0903 244.82859 312.2573 247.97059 315.2043 L 254.58859 308.5873 C 254.69559 308.4803 254.81159 308.3873 254.93359 308.3073 C 253.97459 306.3743 253.97359 304.4483 253.97359 304.4373 C 253.96459 303.2683 254.90559 302.3123 256.07459 302.3033 C 257.24459 302.2943 258.20059 303.2353 258.20859 304.4043 C 258.20859 304.4143 258.20959 307.9643 261.76059 307.9643 C 262.93459 307.9643 263.88659 308.9163 263.88659 310.0903 C 263.88659 311.2643 262.93459 312.2163 261.76059 312.2163 C 260.12659 312.2163 258.83559 311.8733 257.81559 311.3333 C 257.74959 311.4243 257.67659 311.5113 257.59459 311.5933 L 250.71959 318.4683 C 254.65459 324.3893 254.65759 331.2823 254.65759 331.3173 L 254.67459 331.3503 L 254.67459 360.4053 L 254.67459 364.6573 L 246.40859 364.6573 L 242.62659 372.2203 L 238.84559 364.6573 L 235.06959 364.6573 L 231.28859 372.2203 L 227.50659 364.6573 L 223.73159 364.6573 L 219.94959 372.2203 L 216.16859 364.6573 L 212.39259 364.6573 L 208.61159 372.2203 L 204.83259 364.6623 C 195.88959 364.8553 194.25759 375.9403 199.93959 380.1063 L 202.94159 374.1023 L 206.72359 381.6653 L 210.49859 381.6653 L 214.28059 374.1023 L 218.06159 381.6653 L 221.83759 381.6653 L 225.61859 374.1023 L 229.40059 381.6653 L 233.17659 381.6653 L 236.95759 374.1023 L 240.73959 381.6653 L 244.51459 381.6653 L 248.29659 374.1023 L 252.07759 381.6653 L 301.40159 381.6653 L 292.89759 389.1063 L 292.18059 389.7343 L 293.97659 390.5513 L 302.49159 394.4213 L 293.97659 398.2903 L 292.18059 399.1083 L 292.89759 399.7363 L 301.40159 407.1773 L 254.67459 407.1773 L 254.67459 409.3033 L 301.40159 409.3033 L 292.89759 416.7443 L 292.18059 417.3713 L 293.97659 418.1883 L 302.49159 422.0583 L 293.97659 425.9293 L 292.18059 426.7453 L 292.89759 427.3733 L 301.40159 434.8143 L 254.67459 434.8143 L 254.67459 436.4773 C 277.32959 439.1443 277.33359 463.0553 277.33459 463.1283 L 277.35159 463.1613 L 277.35159 467.0703 L 289.03359 478.7513 L 251.83959 478.7513 L 251.83959 463.1613 L 251.85459 463.1613 C 251.84459 462.9453 251.72859 461.7443 250.42259 461.7443 L 207.76859 461.7443 C 202.02859 478.7333 182.48359 478.7353 182.42359 478.7353 L 182.39059 478.7513 L 178.48159 478.7513 L 166.80059 490.4333 L 166.80059 453.2403 L 182.39059 453.2403 L 182.39059 453.2553 C 182.60659 453.2453 183.80759 453.1293 183.80759 451.8223 Z" fill="white"/><path d="M 231.28859 342.6887 C 234.41859 342.6887 236.95759 345.2277 236.95759 348.3577 C 236.95759 351.4887 234.41859 354.0277 231.28859 354.0277 C 228.15759 354.0277 225.61959 351.4887 225.61959 348.3577 C 225.61959 345.2277 228.15759 342.6887 231.28859 342.6887 M 352.46959 342.6887 C 355.60059 342.6887 358.13859 345.2277 358.13859 348.3577 C 358.13859 351.4887 355.60059 354.0277 352.46959 354.0277 C 349.33859 354.0277 346.79959 351.4887 346.79959 348.3577 C 346.79959 345.2277 349.33859 342.6887 352.46959 342.6887 M 375.1466 342.6887 C 378.2766 342.6887 380.8156 345.2277 380.8156 348.3577 C 380.8156 351.4887 378.2766 354.0277 375.1466 354.0277 C 372.0166 354.0277 369.4766 351.4887 369.4766 348.3577 C 369.4766 345.2277 372.0166 342.6887 375.1466 342.6887 M 208.61159 342.6887 C 211.74159 342.6887 214.28059 345.2277 214.28059 348.3577 C 214.28059 351.4887 211.74159 354.0277 208.61159 354.0277 C 205.48059 354.0277 202.94159 351.4887 202.94159 348.3577 C 202.94159 345.2277 205.48059 342.6887 208.61159 342.6887" fill="white"/><path d="M 331.20949 359.0715 L 331.20949 348.9835 C 330.62449 349.2875 330.16049 349.6805 329.79249 350.1135 C 328.37549 351.7785 328.37549 354.0275 328.37549 354.0275 C 328.37549 356.2765 329.79249 357.9415 329.79249 357.9415 C 330.16049 358.3745 330.62449 358.7675 331.20949 359.0715 Z" fill="white"/><path d="M 183.80809 432.6887 L 183.80809 425.6027 L 176.72209 429.1457 Z" fill="white"/><path d="M 419.0835 407.8854 L 419.0835 396.5474 L 419.0835 389.0354 L 419.0835 387.3344 C 419.0835 385.6334 417.3825 385.6334 417.3825 385.6334 C 415.6825 385.6334 415.6825 387.3344 415.6825 387.3344 C 415.6825 389.0354 413.9805 389.0354 413.9805 389.0354 C 412.2805 389.0354 412.2805 387.3344 412.2805 387.3344 C 412.2805 385.6334 410.5795 385.6334 410.5795 385.6334 C 408.8785 385.6334 408.8785 387.3344 408.8785 387.3344 C 408.8785 389.0354 407.1775 389.0354 407.1775 389.0354 C 405.4775 389.0354 405.4775 387.3344 405.4775 387.3344 C 405.4775 385.6334 403.7765 385.6334 403.7765 385.6334 C 402.0755 385.6334 402.0755 387.3344 402.0755 387.3344 L 402.0755 389.0354 L 402.0755 396.5474 L 402.0755 407.8854 C 402.0755 412.5644 397.8235 413.4204 397.8235 413.4204 C 397.3955 413.5074 396.9245 413.5544 396.4065 413.5544 L 396.4065 430.5624 C 396.8905 430.5624 397.3595 430.5494 397.8235 430.5284 C 419.0795 429.6014 419.0835 407.8854 419.0835 407.8854 Z" fill="white"/><path d="M 399.2407 354.0275 C 399.2407 351.7785 397.8237 350.1135 397.8237 350.1135 C 397.4547 349.6805 396.9907 349.2875 396.4067 348.9835 L 396.4067 359.0715 C 396.9907 358.7675 397.4547 358.3745 397.8237 357.9415 C 399.2407 356.2765 399.2407 354.0275 399.2407 354.0275 Z" fill="white"/><path d="M 183.80809 381.6652 L 183.80809 374.5782 L 176.72209 378.1222 Z" fill="white"/><path d="M 183.80809 415.6808 L 183.80809 408.5948 L 176.72209 412.1378 Z" fill="white"/><path d="M 345.45459 341.3434 C 347.24959 339.5474 349.73059 338.4364 352.46959 338.4364 C 355.20859 338.4364 357.68859 339.5474 359.48459 341.3434 C 361.27959 343.1384 362.39059 345.6184 362.39059 348.3584 C 362.39059 351.0964 361.27959 353.5774 359.48459 355.3734 C 357.68859 357.1684 355.20859 358.2794 352.46959 358.2794 C 349.73059 358.2794 347.24959 357.1684 345.45459 355.3734 C 343.65859 353.5774 342.54759 351.0964 342.54759 348.3584 C 342.54759 345.6184 343.65859 343.1384 345.45459 341.3434 M 368.13159 341.3434 C 369.9276 339.5474 372.4076 338.4364 375.1466 338.4364 C 377.8856 338.4364 380.3656 339.5474 382.1616 341.3434 C 383.9566 343.1384 385.0676 345.6184 385.0676 348.3584 C 385.0676 351.0964 383.9566 353.5774 382.1616 355.3734 C 380.3656 357.1684 377.8856 358.2794 375.1466 358.2794 C 372.4076 358.2794 369.9276 357.1684 368.13159 355.3734 C 366.33559 353.5774 365.22559 351.0964 365.22559 348.3584 C 365.22559 345.6184 366.33559 343.1384 368.13159 341.3434 M 414.8316 468.8304 L 414.8316 463.1614 C 414.8296 444.4444 397.8236 441.0204 397.8236 441.0204 C 396.1116 440.6754 394.2286 440.4844 392.1546 440.4844 L 392.1546 436.5864 L 392.1546 430.5624 L 392.1546 413.5544 L 392.1546 410.3654 L 392.1546 394.4214 L 392.1546 386.6254 L 375.1466 386.6254 L 352.46959 386.6254 C 346.40559 386.6254 342.49259 383.2484 340.75459 378.9264 C 340.10359 377.3054 339.77759 375.5754 339.77759 373.8694 C 339.77759 372.1644 340.10259 370.4344 340.75459 368.8134 C 342.49259 364.4914 346.40559 361.1144 352.46959 361.1144 L 375.1466 361.1144 L 392.1546 361.1144 L 392.1546 331.3504 C 392.1546 314.3424 375.1466 314.3424 375.1466 314.3424 L 352.46959 314.3424 C 335.46159 314.3424 335.46159 331.3504 335.46159 331.3504 L 335.46159 413.5544 L 331.20959 413.5544 C 330.69059 413.5544 330.22059 413.5074 329.79159 413.4204 C 325.54059 412.5644 325.53959 407.8854 325.53959 407.8854 L 325.53959 396.5474 L 325.53959 389.0354 L 325.53959 387.3344 C 325.53959 385.6334 323.83959 385.6334 323.83959 385.6334 C 322.13859 385.6334 322.13859 387.3344 322.13859 387.3344 C 322.13859 389.0354 320.43759 389.0354 320.43759 389.0354 C 318.73659 389.0354 318.73659 387.3344 318.73659 387.3344 C 318.73659 385.6334 317.03659 385.6334 317.03659 385.6334 C 315.33559 385.6334 315.33559 387.3344 315.33559 387.3344 C 315.33559 389.0354 313.63459 389.0354 313.63459 389.0354 C 311.93359 389.0354 311.93359 387.3344 311.93359 387.3344 C 311.93359 385.6334 310.23259 385.6334 310.23259 385.6334 C 308.53259 385.6334 308.53259 387.3344 308.53259 387.3344 L 308.53259 389.0354 L 308.53259 396.5474 L 308.53259 407.8854 C 308.53659 429.6014 329.79159 430.5284 329.79159 430.5284 C 330.25559 430.5494 330.72559 430.5624 331.20959 430.5624 L 335.46159 430.5624 L 335.46159 440.4844 L 335.46159 440.4884 L 335.46159 440.4964 L 335.46159 440.5004 L 335.46159 451.8224 C 335.46159 457.4914 329.79159 457.4914 329.79159 457.4914 L 318.45359 457.4914 L 318.45359 474.4994 L 318.45359 480.1694 C 320.34359 478.2794 324.12259 474.4994 324.12259 474.4994 L 329.79159 474.4994 C 348.51459 474.4974 351.93459 457.4834 351.93459 457.4834 C 352.11159 457.4874 352.28859 457.4914 352.46959 457.4914 L 375.1466 457.4914 L 392.1546 457.4914 C 397.7356 457.4914 397.8226 462.9854 397.8236 463.1574 L 397.8236 463.1614 L 397.8236 474.4994 L 414.8316 474.4994 L 420.5006 474.4994 C 418.6116 472.6104 414.8316 468.8304 414.8316 468.8304" fill="white"/><path d="M 183.80809 398.673 L 183.80809 391.587 L 176.72209 395.13 Z" fill="white"/><path d="M 201.59619 341.3434 C 203.39219 339.5474 205.87219 338.4364 208.61119 338.4364 C 211.35019 338.4364 213.83019 339.5474 215.62619 341.3434 C 217.42219 343.1384 218.53319 345.6184 218.53319 348.3584 C 218.53319 351.0964 217.42219 353.5774 215.62619 355.3734 C 213.83019 357.1684 211.35019 358.2794 208.61119 358.2794 C 205.87219 358.2794 203.39219 357.1684 201.59619 355.3734 C 199.80119 353.5774 198.69019 351.0964 198.69019 348.3584 C 198.69019 345.6184 199.80119 343.1384 201.59619 341.3434 M 224.27319 341.3434 C 226.06919 339.5474 228.54919 338.4364 231.28819 338.4364 C 234.02719 338.4364 236.50819 339.5474 238.30319 341.3434 C 240.09819 343.1384 241.20919 345.6184 241.20919 348.3584 C 241.20919 351.0964 240.09819 353.5774 238.30319 355.3734 C 236.50819 357.1684 234.02719 358.2794 231.28819 358.2794 C 228.54919 358.2794 226.06919 357.1684 224.27319 355.3734 C 222.47819 353.5774 221.36719 351.0964 221.36719 348.3584 C 221.36719 345.6184 222.47819 343.1384 224.27319 341.3434 M 284.43819 418.5154 L 290.10719 413.5544 L 273.45319 413.5544 L 250.42219 413.5544 L 250.42219 404.3424 L 250.42219 402.9254 L 250.42219 385.9174 L 231.28819 385.9174 L 208.61119 385.9174 L 205.06819 385.9174 C 199.00319 385.9174 195.09119 382.5394 193.35319 378.2174 C 192.70219 376.5964 192.37619 374.8664 192.37619 373.1614 C 192.37619 371.4554 192.70219 369.7254 193.35319 368.1054 C 195.09119 363.7824 199.00319 360.4054 205.06819 360.4054 L 208.61119 360.4054 L 231.28819 360.4054 L 250.42219 360.4054 L 250.42219 331.3504 C 250.42219 314.3424 233.41419 314.3424 233.41419 314.3424 L 231.28819 314.3424 L 208.61119 314.3424 L 205.06819 314.3424 C 188.06019 314.3424 188.06019 331.3504 188.06019 331.3504 L 188.06019 440.4844 L 188.06019 440.4884 L 188.06019 440.4964 L 188.06019 440.5004 L 188.06019 451.8224 C 188.06019 457.4914 182.39019 457.4914 182.39019 457.4914 L 171.05219 457.4914 L 171.05219 474.4994 L 171.05219 480.1694 L 176.72119 474.4994 L 182.39019 474.4994 C 201.11319 474.4974 204.53319 457.4834 204.53319 457.4834 C 204.71019 457.4874 204.88719 457.4914 205.06819 457.4914 L 208.61119 457.4914 L 231.28819 457.4914 L 250.42219 457.4914 C 256.09219 457.4914 256.09219 463.1614 256.09219 463.1614 L 256.09219 474.4994 L 273.09919 474.4994 L 273.45319 474.4994 L 278.76919 474.4994 L 273.45319 469.1844 L 273.09919 468.8304 L 273.09919 463.1614 C 273.09919 440.4844 250.42219 440.4844 250.42219 440.4844 L 250.42219 430.5624 L 273.45319 430.5624 L 290.10719 430.5624 L 284.43819 425.6024 L 292.23319 422.0584 Z" fill="white"/><path d="M 352.46919 345.5236 C 350.90419 345.5236 349.63519 346.7926 349.63519 348.3576 C 349.63519 349.9236 350.90419 351.1926 352.46919 351.1926 C 354.03419 351.1926 355.30319 349.9236 355.30319 348.3576 C 355.30319 346.7926 354.03419 345.5236 352.46919 345.5236 Z" fill="white"/><path d="M 375.1465 345.5236 C 373.5815 345.5236 372.3125 346.7926 372.3125 348.3576 C 372.3125 349.9236 373.5815 351.1926 375.1465 351.1926 C 376.7115 351.1926 377.9805 349.9236 377.9805 348.3576 C 377.9805 346.7926 376.7115 345.5236 375.1465 345.5236 Z" fill="white"/><path d="M 290.10739 385.9172 L 273.45339 385.9172 L 254.67439 385.9172 L 254.67439 402.9252 L 273.45339 402.9252 L 290.10739 402.9252 L 284.43839 397.9642 L 292.23339 394.4212 L 284.43839 390.8772 Z" fill="white"/><path d="M 208.61129 345.5236 C 210.17629 345.5236 211.44529 346.7926 211.44529 348.3576 C 211.44529 349.9236 210.17629 351.1926 208.61129 351.1926 C 207.04629 351.1926 205.77729 349.9236 205.77729 348.3576 C 205.77729 346.7926 207.04629 345.5236 208.61129 345.5236 M 231.28829 345.5236 C 232.85429 345.5236 234.12329 346.7926 234.12329 348.3576 C 234.12329 349.9236 232.85429 351.1926 231.28829 351.1926 C 229.72329 351.1926 228.45329 349.9236 228.45329 348.3576 C 228.45329 346.7926 229.72329 345.5236 231.28829 345.5236 M 335.54729 330.0186 C 335.96229 326.0126 338.38129 314.3426 352.46929 314.3426 L 375.1463 314.3426 C 389.2353 314.3426 391.6533 326.0126 392.0683 330.0186 L 386.4853 335.6026 L 380.8163 329.9326 L 375.1463 335.6026 L 369.4773 329.9326 L 363.80829 335.6026 L 358.13829 329.9326 L 352.46929 335.6026 L 346.79929 329.9326 L 341.13129 335.6026 Z" fill="white"/></g></g></svg>
@@ -0,0 +1,3 @@
1
+ <?xml version="1.0"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="157 293 283 207" width="283pt" height="207pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-11-20 08:29Z</dc:date><!-- Produced by OmniGraffle Professional 5.4.2 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><rect width="595.28998" height="841.89"/><g><title>Layer 1</title><path d="M 324.13959 353.9943 C 324.13959 353.9693 324.14059 346.0923 331.20959 344.4173 L 331.20959 331.3503 L 331.22559 331.3173 C 331.22659 331.2563 331.22559 310.0903 352.46959 310.0903 L 375.1466 310.0903 C 396.3896 310.0903 396.3896 331.2563 396.3896 331.3173 L 396.4066 331.3503 L 396.4066 344.4173 C 403.4746 346.0923 403.4756 353.9693 403.4766 353.9943 L 403.4766 354.0603 C 403.4756 354.0853 403.4746 361.9613 396.4066 363.6373 L 396.4066 365.3663 L 392.5086 365.3663 L 392.5086 366.7833 C 392.5086 369.6183 389.6736 369.6183 389.6736 369.6183 C 386.8396 369.6183 386.8396 366.7833 386.8396 366.7833 L 386.8396 365.3663 L 381.1696 365.3663 L 381.1696 366.7833 C 381.1696 369.6183 378.3356 369.6183 378.3356 369.6183 C 375.5006 369.6183 375.5006 366.7833 375.5006 366.7833 L 375.5006 365.3663 L 369.8316 365.3663 L 369.8316 366.7833 C 369.8316 369.6183 366.99659 369.6183 366.99659 369.6183 C 364.16159 369.6183 364.16159 366.7833 364.16159 366.7833 L 364.16159 365.3663 L 358.49259 365.3663 L 358.49259 366.7833 C 358.49259 369.6183 355.65859 369.6183 355.65859 369.6183 C 352.82359 369.6183 352.82359 366.7833 352.82359 366.7833 L 352.82359 365.3663 L 352.46959 365.3663 C 343.40959 365.3663 341.64559 376.3883 347.17459 380.6853 C 347.25759 379.9773 347.69559 378.1213 349.98859 378.1213 C 352.82359 378.1213 352.82359 380.9563 352.82359 380.9563 L 352.82359 382.3733 L 358.49259 382.3733 L 358.49259 380.9563 C 358.49259 378.1213 361.32759 378.1213 361.32759 378.1213 C 364.16159 378.1213 364.16159 380.9563 364.16159 380.9563 L 364.16159 382.3733 L 369.8316 382.3733 L 369.8316 380.9563 C 369.8316 378.1213 372.6656 378.1213 372.6656 378.1213 C 375.5006 378.1213 375.5006 380.9563 375.5006 380.9563 L 375.5006 382.3733 L 381.1696 382.3733 L 381.1696 380.9563 C 381.1696 378.1213 384.0046 378.1213 384.0046 378.1213 C 386.8396 378.1213 386.8396 380.9563 386.8396 380.9563 L 386.8396 382.3733 L 387.9026 382.3733 L 396.4066 382.3733 L 396.4066 409.3033 C 397.7126 409.3033 397.8286 408.1013 397.8396 407.8853 L 397.8236 407.8853 L 397.8236 389.0353 L 397.8236 387.3343 C 397.8236 387.3173 397.8236 381.3813 403.7766 381.3813 C 405.2416 381.3813 406.3456 381.7423 407.1776 382.2843 C 408.0106 381.7423 409.1146 381.3813 410.5796 381.3813 C 412.0446 381.3813 413.1486 381.7423 413.9806 382.2843 C 414.8136 381.7423 415.9176 381.3813 417.3826 381.3813 C 423.3356 381.3813 423.3356 387.3173 423.3356 387.3343 L 423.3356 389.0353 L 423.3356 407.8853 L 423.3186 407.9183 C 423.3176 407.9953 423.3186 434.8143 396.4066 434.8143 L 396.4066 436.4773 C 419.0616 439.1443 419.0666 463.0553 419.0666 463.1283 L 419.0836 463.1613 L 419.0836 467.0703 L 430.7646 478.7513 L 393.5716 478.7513 L 393.5716 463.1613 L 393.5876 463.1613 C 393.5776 462.9453 393.4606 461.7443 392.1546 461.7443 L 355.16959 461.7443 C 349.42959 478.7333 329.88559 478.7353 329.82559 478.7353 L 329.79159 478.7513 L 325.88359 478.7513 L 314.20159 490.4333 L 314.20159 453.2403 L 329.79159 453.2403 L 329.79159 453.2553 C 330.00859 453.2453 331.20959 453.1293 331.20959 451.8223 L 331.20959 434.8143 C 304.29659 434.8143 304.29759 407.9953 304.29659 407.9183 L 304.28059 407.8853 L 304.28059 396.5473 L 304.28059 389.0353 L 304.28059 387.3343 C 304.28059 387.3173 304.28059 381.3813 310.23259 381.3813 C 311.69859 381.3813 312.80259 381.7423 313.63459 382.2843 C 314.46759 381.7423 315.57159 381.3813 317.03559 381.3813 C 318.50159 381.3813 319.60559 381.7423 320.43759 382.2843 C 321.27059 381.7423 322.37459 381.3813 323.83959 381.3813 C 329.79159 381.3813 329.79159 387.3173 329.79159 387.3343 L 329.79159 389.0353 L 329.79159 396.5473 L 329.79159 407.8853 L 329.77659 407.8853 C 329.78659 408.1013 329.90259 409.3033 331.20959 409.3033 L 331.20959 363.6373 C 324.14059 361.9613 324.13959 354.0853 324.13959 354.0603 Z M 183.80759 437.4223 L 167.25359 429.1453 L 183.80759 420.8693 L 183.80759 420.4143 L 167.25359 412.1373 L 183.80759 403.8603 L 183.80759 403.4063 L 167.25359 395.1293 L 183.80759 386.8523 L 183.80759 386.3983 L 167.25359 378.1213 L 183.80759 369.8453 L 183.80759 331.3503 L 183.82459 331.3173 C 183.82559 331.2823 183.82659 324.3893 187.76259 318.4683 L 180.88759 311.5933 C 180.80559 311.5113 180.73259 311.4243 180.66659 311.3333 C 179.64659 311.8733 178.35559 312.2163 176.72159 312.2163 C 175.54759 312.2163 174.59559 311.2643 174.59559 310.0903 C 174.59559 308.9163 175.54759 307.9643 176.72159 307.9643 C 180.27259 307.9643 180.27259 304.4143 180.27259 304.4043 C 180.28259 303.2353 181.23759 302.2943 182.40759 302.3033 C 183.57659 302.3123 184.51759 303.2683 184.50859 304.4373 C 184.50859 304.4483 184.50859 306.3753 183.54859 308.3073 C 183.67059 308.3873 183.78659 308.4803 183.89359 308.5873 L 190.51159 315.2043 C 193.65459 312.2573 198.27259 310.0903 205.06759 310.0903 L 233.41459 310.0903 C 240.20859 310.0903 244.82859 312.2573 247.97059 315.2043 L 254.58859 308.5873 C 254.69559 308.4803 254.81159 308.3873 254.93359 308.3073 C 253.97459 306.3743 253.97359 304.4483 253.97359 304.4373 C 253.96459 303.2683 254.90559 302.3123 256.07459 302.3033 C 257.24459 302.2943 258.20059 303.2353 258.20859 304.4043 C 258.20859 304.4143 258.20959 307.9643 261.76059 307.9643 C 262.93459 307.9643 263.88659 308.9163 263.88659 310.0903 C 263.88659 311.2643 262.93459 312.2163 261.76059 312.2163 C 260.12659 312.2163 258.83559 311.8733 257.81559 311.3333 C 257.74959 311.4243 257.67659 311.5113 257.59459 311.5933 L 250.71959 318.4683 C 254.65459 324.3893 254.65759 331.2823 254.65759 331.3173 L 254.67459 331.3503 L 254.67459 360.4053 L 254.67459 364.6573 L 246.40859 364.6573 L 242.62659 372.2203 L 238.84559 364.6573 L 235.06959 364.6573 L 231.28859 372.2203 L 227.50659 364.6573 L 223.73159 364.6573 L 219.94959 372.2203 L 216.16859 364.6573 L 212.39259 364.6573 L 208.61159 372.2203 L 204.83259 364.6623 C 195.88959 364.8553 194.25759 375.9403 199.93959 380.1063 L 202.94159 374.1023 L 206.72359 381.6653 L 210.49859 381.6653 L 214.28059 374.1023 L 218.06159 381.6653 L 221.83759 381.6653 L 225.61859 374.1023 L 229.40059 381.6653 L 233.17659 381.6653 L 236.95759 374.1023 L 240.73959 381.6653 L 244.51459 381.6653 L 248.29659 374.1023 L 252.07759 381.6653 L 301.40159 381.6653 L 292.89759 389.1063 L 292.18059 389.7343 L 293.97659 390.5513 L 302.49159 394.4213 L 293.97659 398.2903 L 292.18059 399.1083 L 292.89759 399.7363 L 301.40159 407.1773 L 254.67459 407.1773 L 254.67459 409.3033 L 301.40159 409.3033 L 292.89759 416.7443 L 292.18059 417.3713 L 293.97659 418.1883 L 302.49159 422.0583 L 293.97659 425.9293 L 292.18059 426.7453 L 292.89759 427.3733 L 301.40159 434.8143 L 254.67459 434.8143 L 254.67459 436.4773 C 277.32959 439.1443 277.33359 463.0553 277.33459 463.1283 L 277.35159 463.1613 L 277.35159 467.0703 L 289.03359 478.7513 L 251.83959 478.7513 L 251.83959 463.1613 L 251.85459 463.1613 C 251.84459 462.9453 251.72859 461.7443 250.42259 461.7443 L 207.76859 461.7443 C 202.02859 478.7333 182.48359 478.7353 182.42359 478.7353 L 182.39059 478.7513 L 178.48159 478.7513 L 166.80059 490.4333 L 166.80059 453.2403 L 182.39059 453.2403 L 182.39059 453.2553 C 182.60659 453.2453 183.80759 453.1293 183.80759 451.8223 Z" fill="#452a32"/><path d="M 231.28859 342.6887 C 234.41859 342.6887 236.95759 345.2277 236.95759 348.3577 C 236.95759 351.4887 234.41859 354.0277 231.28859 354.0277 C 228.15759 354.0277 225.61959 351.4887 225.61959 348.3577 C 225.61959 345.2277 228.15759 342.6887 231.28859 342.6887 M 352.46959 342.6887 C 355.60059 342.6887 358.13859 345.2277 358.13859 348.3577 C 358.13859 351.4887 355.60059 354.0277 352.46959 354.0277 C 349.33859 354.0277 346.79959 351.4887 346.79959 348.3577 C 346.79959 345.2277 349.33859 342.6887 352.46959 342.6887 M 375.1466 342.6887 C 378.2766 342.6887 380.8156 345.2277 380.8156 348.3577 C 380.8156 351.4887 378.2766 354.0277 375.1466 354.0277 C 372.0166 354.0277 369.4766 351.4887 369.4766 348.3577 C 369.4766 345.2277 372.0166 342.6887 375.1466 342.6887 M 208.61159 342.6887 C 211.74159 342.6887 214.28059 345.2277 214.28059 348.3577 C 214.28059 351.4887 211.74159 354.0277 208.61159 354.0277 C 205.48059 354.0277 202.94159 351.4887 202.94159 348.3577 C 202.94159 345.2277 205.48059 342.6887 208.61159 342.6887" fill="#fffffe"/><path d="M 331.20949 359.0715 L 331.20949 348.9835 C 330.62449 349.2875 330.16049 349.6805 329.79249 350.1135 C 328.37549 351.7785 328.37549 354.0275 328.37549 354.0275 C 328.37549 356.2765 329.79249 357.9415 329.79249 357.9415 C 330.16049 358.3745 330.62449 358.7675 331.20949 359.0715 Z" fill="#d5bb9f"/><path d="M 183.80809 432.6887 L 183.80809 425.6027 L 176.72209 429.1457 Z" fill="#d5bb9f"/><path d="M 419.0835 407.8854 L 419.0835 396.5474 L 419.0835 389.0354 L 419.0835 387.3344 C 419.0835 385.6334 417.3825 385.6334 417.3825 385.6334 C 415.6825 385.6334 415.6825 387.3344 415.6825 387.3344 C 415.6825 389.0354 413.9805 389.0354 413.9805 389.0354 C 412.2805 389.0354 412.2805 387.3344 412.2805 387.3344 C 412.2805 385.6334 410.5795 385.6334 410.5795 385.6334 C 408.8785 385.6334 408.8785 387.3344 408.8785 387.3344 C 408.8785 389.0354 407.1775 389.0354 407.1775 389.0354 C 405.4775 389.0354 405.4775 387.3344 405.4775 387.3344 C 405.4775 385.6334 403.7765 385.6334 403.7765 385.6334 C 402.0755 385.6334 402.0755 387.3344 402.0755 387.3344 L 402.0755 389.0354 L 402.0755 396.5474 L 402.0755 407.8854 C 402.0755 412.5644 397.8235 413.4204 397.8235 413.4204 C 397.3955 413.5074 396.9245 413.5544 396.4065 413.5544 L 396.4065 430.5624 C 396.8905 430.5624 397.3595 430.5494 397.8235 430.5284 C 419.0795 429.6014 419.0835 407.8854 419.0835 407.8854 Z" fill="#d5bb9f"/><path d="M 399.2407 354.0275 C 399.2407 351.7785 397.8237 350.1135 397.8237 350.1135 C 397.4547 349.6805 396.9907 349.2875 396.4067 348.9835 L 396.4067 359.0715 C 396.9907 358.7675 397.4547 358.3745 397.8237 357.9415 C 399.2407 356.2765 399.2407 354.0275 399.2407 354.0275 Z" fill="#d5bb9f"/><path d="M 183.80809 381.6652 L 183.80809 374.5782 L 176.72209 378.1222 Z" fill="#d5bb9f"/><path d="M 183.80809 415.6808 L 183.80809 408.5948 L 176.72209 412.1378 Z" fill="#d5bb9f"/><path d="M 345.45459 341.3434 C 347.24959 339.5474 349.73059 338.4364 352.46959 338.4364 C 355.20859 338.4364 357.68859 339.5474 359.48459 341.3434 C 361.27959 343.1384 362.39059 345.6184 362.39059 348.3584 C 362.39059 351.0964 361.27959 353.5774 359.48459 355.3734 C 357.68859 357.1684 355.20859 358.2794 352.46959 358.2794 C 349.73059 358.2794 347.24959 357.1684 345.45459 355.3734 C 343.65859 353.5774 342.54759 351.0964 342.54759 348.3584 C 342.54759 345.6184 343.65859 343.1384 345.45459 341.3434 M 368.13159 341.3434 C 369.9276 339.5474 372.4076 338.4364 375.1466 338.4364 C 377.8856 338.4364 380.3656 339.5474 382.1616 341.3434 C 383.9566 343.1384 385.0676 345.6184 385.0676 348.3584 C 385.0676 351.0964 383.9566 353.5774 382.1616 355.3734 C 380.3656 357.1684 377.8856 358.2794 375.1466 358.2794 C 372.4076 358.2794 369.9276 357.1684 368.13159 355.3734 C 366.33559 353.5774 365.22559 351.0964 365.22559 348.3584 C 365.22559 345.6184 366.33559 343.1384 368.13159 341.3434 M 414.8316 468.8304 L 414.8316 463.1614 C 414.8296 444.4444 397.8236 441.0204 397.8236 441.0204 C 396.1116 440.6754 394.2286 440.4844 392.1546 440.4844 L 392.1546 436.5864 L 392.1546 430.5624 L 392.1546 413.5544 L 392.1546 410.3654 L 392.1546 394.4214 L 392.1546 386.6254 L 375.1466 386.6254 L 352.46959 386.6254 C 346.40559 386.6254 342.49259 383.2484 340.75459 378.9264 C 340.10359 377.3054 339.77759 375.5754 339.77759 373.8694 C 339.77759 372.1644 340.10259 370.4344 340.75459 368.8134 C 342.49259 364.4914 346.40559 361.1144 352.46959 361.1144 L 375.1466 361.1144 L 392.1546 361.1144 L 392.1546 331.3504 C 392.1546 314.3424 375.1466 314.3424 375.1466 314.3424 L 352.46959 314.3424 C 335.46159 314.3424 335.46159 331.3504 335.46159 331.3504 L 335.46159 413.5544 L 331.20959 413.5544 C 330.69059 413.5544 330.22059 413.5074 329.79159 413.4204 C 325.54059 412.5644 325.53959 407.8854 325.53959 407.8854 L 325.53959 396.5474 L 325.53959 389.0354 L 325.53959 387.3344 C 325.53959 385.6334 323.83959 385.6334 323.83959 385.6334 C 322.13859 385.6334 322.13859 387.3344 322.13859 387.3344 C 322.13859 389.0354 320.43759 389.0354 320.43759 389.0354 C 318.73659 389.0354 318.73659 387.3344 318.73659 387.3344 C 318.73659 385.6334 317.03659 385.6334 317.03659 385.6334 C 315.33559 385.6334 315.33559 387.3344 315.33559 387.3344 C 315.33559 389.0354 313.63459 389.0354 313.63459 389.0354 C 311.93359 389.0354 311.93359 387.3344 311.93359 387.3344 C 311.93359 385.6334 310.23259 385.6334 310.23259 385.6334 C 308.53259 385.6334 308.53259 387.3344 308.53259 387.3344 L 308.53259 389.0354 L 308.53259 396.5474 L 308.53259 407.8854 C 308.53659 429.6014 329.79159 430.5284 329.79159 430.5284 C 330.25559 430.5494 330.72559 430.5624 331.20959 430.5624 L 335.46159 430.5624 L 335.46159 440.4844 L 335.46159 440.4884 L 335.46159 440.4964 L 335.46159 440.5004 L 335.46159 451.8224 C 335.46159 457.4914 329.79159 457.4914 329.79159 457.4914 L 318.45359 457.4914 L 318.45359 474.4994 L 318.45359 480.1694 C 320.34359 478.2794 324.12259 474.4994 324.12259 474.4994 L 329.79159 474.4994 C 348.51459 474.4974 351.93459 457.4834 351.93459 457.4834 C 352.11159 457.4874 352.28859 457.4914 352.46959 457.4914 L 375.1466 457.4914 L 392.1546 457.4914 C 397.7356 457.4914 397.8226 462.9854 397.8236 463.1574 L 397.8236 463.1614 L 397.8236 474.4994 L 414.8316 474.4994 L 420.5006 474.4994 C 418.6116 472.6104 414.8316 468.8304 414.8316 468.8304" fill="#d5bb9f"/><path d="M 183.80809 398.673 L 183.80809 391.587 L 176.72209 395.13 Z" fill="#d5bb9f"/><path d="M 201.59619 341.3434 C 203.39219 339.5474 205.87219 338.4364 208.61119 338.4364 C 211.35019 338.4364 213.83019 339.5474 215.62619 341.3434 C 217.42219 343.1384 218.53319 345.6184 218.53319 348.3584 C 218.53319 351.0964 217.42219 353.5774 215.62619 355.3734 C 213.83019 357.1684 211.35019 358.2794 208.61119 358.2794 C 205.87219 358.2794 203.39219 357.1684 201.59619 355.3734 C 199.80119 353.5774 198.69019 351.0964 198.69019 348.3584 C 198.69019 345.6184 199.80119 343.1384 201.59619 341.3434 M 224.27319 341.3434 C 226.06919 339.5474 228.54919 338.4364 231.28819 338.4364 C 234.02719 338.4364 236.50819 339.5474 238.30319 341.3434 C 240.09819 343.1384 241.20919 345.6184 241.20919 348.3584 C 241.20919 351.0964 240.09819 353.5774 238.30319 355.3734 C 236.50819 357.1684 234.02719 358.2794 231.28819 358.2794 C 228.54919 358.2794 226.06919 357.1684 224.27319 355.3734 C 222.47819 353.5774 221.36719 351.0964 221.36719 348.3584 C 221.36719 345.6184 222.47819 343.1384 224.27319 341.3434 M 284.43819 418.5154 L 290.10719 413.5544 L 273.45319 413.5544 L 250.42219 413.5544 L 250.42219 404.3424 L 250.42219 402.9254 L 250.42219 385.9174 L 231.28819 385.9174 L 208.61119 385.9174 L 205.06819 385.9174 C 199.00319 385.9174 195.09119 382.5394 193.35319 378.2174 C 192.70219 376.5964 192.37619 374.8664 192.37619 373.1614 C 192.37619 371.4554 192.70219 369.7254 193.35319 368.1054 C 195.09119 363.7824 199.00319 360.4054 205.06819 360.4054 L 208.61119 360.4054 L 231.28819 360.4054 L 250.42219 360.4054 L 250.42219 331.3504 C 250.42219 314.3424 233.41419 314.3424 233.41419 314.3424 L 231.28819 314.3424 L 208.61119 314.3424 L 205.06819 314.3424 C 188.06019 314.3424 188.06019 331.3504 188.06019 331.3504 L 188.06019 440.4844 L 188.06019 440.4884 L 188.06019 440.4964 L 188.06019 440.5004 L 188.06019 451.8224 C 188.06019 457.4914 182.39019 457.4914 182.39019 457.4914 L 171.05219 457.4914 L 171.05219 474.4994 L 171.05219 480.1694 L 176.72119 474.4994 L 182.39019 474.4994 C 201.11319 474.4974 204.53319 457.4834 204.53319 457.4834 C 204.71019 457.4874 204.88719 457.4914 205.06819 457.4914 L 208.61119 457.4914 L 231.28819 457.4914 L 250.42219 457.4914 C 256.09219 457.4914 256.09219 463.1614 256.09219 463.1614 L 256.09219 474.4994 L 273.09919 474.4994 L 273.45319 474.4994 L 278.76919 474.4994 L 273.45319 469.1844 L 273.09919 468.8304 L 273.09919 463.1614 C 273.09919 440.4844 250.42219 440.4844 250.42219 440.4844 L 250.42219 430.5624 L 273.45319 430.5624 L 290.10719 430.5624 L 284.43819 425.6024 L 292.23319 422.0584 Z" fill="#85912d"/><path d="M 352.46919 345.5236 C 350.90419 345.5236 349.63519 346.7926 349.63519 348.3576 C 349.63519 349.9236 350.90419 351.1926 352.46919 351.1926 C 354.03419 351.1926 355.30319 349.9236 355.30319 348.3576 C 355.30319 346.7926 354.03419 345.5236 352.46919 345.5236 Z" fill="#85912d"/><path d="M 375.1465 345.5236 C 373.5815 345.5236 372.3125 346.7926 372.3125 348.3576 C 372.3125 349.9236 373.5815 351.1926 375.1465 351.1926 C 376.7115 351.1926 377.9805 349.9236 377.9805 348.3576 C 377.9805 346.7926 376.7115 345.5236 375.1465 345.5236 Z" fill="#85912d"/><path d="M 290.10739 385.9172 L 273.45339 385.9172 L 254.67439 385.9172 L 254.67439 402.9252 L 273.45339 402.9252 L 290.10739 402.9252 L 284.43839 397.9642 L 292.23339 394.4212 L 284.43839 390.8772 Z" fill="#85912d"/><path d="M 208.61129 345.5236 C 210.17629 345.5236 211.44529 346.7926 211.44529 348.3576 C 211.44529 349.9236 210.17629 351.1926 208.61129 351.1926 C 207.04629 351.1926 205.77729 349.9236 205.77729 348.3576 C 205.77729 346.7926 207.04629 345.5236 208.61129 345.5236 M 231.28829 345.5236 C 232.85429 345.5236 234.12329 346.7926 234.12329 348.3576 C 234.12329 349.9236 232.85429 351.1926 231.28829 351.1926 C 229.72329 351.1926 228.45329 349.9236 228.45329 348.3576 C 228.45329 346.7926 229.72329 345.5236 231.28829 345.5236 M 335.54729 330.0186 C 335.96229 326.0126 338.38129 314.3426 352.46929 314.3426 L 375.1463 314.3426 C 389.2353 314.3426 391.6533 326.0126 392.0683 330.0186 L 386.4853 335.6026 L 380.8163 329.9326 L 375.1463 335.6026 L 369.4773 329.9326 L 363.80829 335.6026 L 358.13829 329.9326 L 352.46929 335.6026 L 346.79929 329.9326 L 341.13129 335.6026 Z" fill="#a1522b"/></g></g></svg>
@@ -0,0 +1,219 @@
1
+ #= require vendor/d3.v3
2
+ #= require vendor/dagre
3
+ #= require vendor/jquery
4
+ #= require vendor/ui.jquery
5
+ #= require vendor/sugar-1.3.8
6
+ #= require vendor/stacktrace-0.4
7
+ #= require vendor/chosen.jquery
8
+ #= require vendor/mustache
9
+ #= require vendor/hotkeys.jquery
10
+ #= require_tree ./lib
11
+ #= require_self
12
+
13
+ $ -> window.app = new Application
14
+
15
+ class Application
16
+
17
+ constructor: ->
18
+ @data = window.data
19
+
20
+ Drawer.attach('svg')
21
+
22
+ @toolbar = $('#toolbar')
23
+ @title = $('#title')
24
+ @transform = $('#transform')
25
+ @selector = $('#functions select')
26
+ @diff = $('#diff')
27
+
28
+ @zoomButton = $('#zoom button')
29
+
30
+ @container = $('#container')
31
+ @svg = $('svg')
32
+ @timeline = $('#timeline')
33
+ @slider = $('#timeline .slider')
34
+ @sliderInput = $('#timeline input')
35
+ @sliderApply = $('#timeline button.ok')
36
+ @sliderNext = $('#timeline button.next')
37
+ @sliderPrev = $('#timeline button.prev')
38
+ @sliderFNext = $('#timeline button.fnext')
39
+ @sliderFPrev = $('#timeline button.fprev')
40
+
41
+ @transforms = $('#transforms')
42
+
43
+ @buildZoomer()
44
+ @buildSelector()
45
+ @buildSlider()
46
+
47
+ redraw = =>
48
+ @dehasherize()
49
+ @currentFunction ||= 0
50
+ @draw()
51
+
52
+ redraw(); $(window).bind 'hashchange', redraw
53
+
54
+ resize = =>
55
+ @container.find('.stretch').height($(window).height() - @toolbar.outerHeight() - 4)
56
+ @slider.height($(window).height() - @toolbar.outerHeight() - 280)
57
+
58
+ resize(); $(window).bind('resize', resize)
59
+
60
+ draw: ->
61
+ try
62
+ @timeline.show()
63
+ @title.removeClass('error')
64
+ @transform.removeClass('active').html('')
65
+ @diff.html('')
66
+
67
+ input = @data[@currentFunction]
68
+
69
+ Drawer.reset() if @input?.source.name != input.source.name
70
+ Drawer.clear()
71
+
72
+ @input = input
73
+ @input.rewind(@currentStep)
74
+ @drawer = new Drawer(new Graph(@input))
75
+
76
+ @title.html @input.function.title()
77
+ @diff.html "~ " + @input.previousState.cursor if @input.previousState?.cursor?
78
+
79
+ @renewZoomer()
80
+ @renewSelector()
81
+ @renewSlider()
82
+ @renewNaming()
83
+ catch error
84
+ console.log error
85
+ @timeline.hide()
86
+ @title.addClass('error').text 'Unable to build graph: problem dumped to console'
87
+
88
+ dehasherize: ->
89
+ hash = window.location.hash.from(1)
90
+ hash = "0:#{@data[0].events.length-1}" if hash.length == 0
91
+ [@currentFunction, @currentStep] = hash.split(":").map (x) -> x.toNumber()
92
+
93
+ jumpTo: (func, step) ->
94
+ if Object.isString(func)
95
+ @selector.find('option').each (x) ->
96
+ func = $(@).attr('value').toNumber() if $(@).text() == func
97
+
98
+ @currentFunction = func; step = @data[func].events.length-1 if step == undefined
99
+ @currentStep = [step, @data[func].events.length-1].min()
100
+ @currentStep = [0, @currentStep].max()
101
+ window.location.hash = "#{@currentFunction}:#{@currentStep || 0}"
102
+
103
+ jumpToBlock: (name) ->
104
+ @drawer.zoomNode @svg.width(), @svg.height(), name
105
+
106
+ renewSlider: (max, value) ->
107
+ @slider.slider
108
+ max: @input.events.length-1
109
+ value: @input.cursor
110
+
111
+ @slider.find('.label').remove()
112
+
113
+ @input.transforms.each (entry) =>
114
+ height = entry.length/(@input.events.length-1)*100
115
+ top = 100-entry.id/(@input.events.length-1)*100-height
116
+ label = "#{entry.label}&nbsp;(#{entry.id}+#{entry.length})"
117
+
118
+ if @currentStep >= entry.id && @currentStep < entry.id+entry.length
119
+ klass = "current"
120
+ @transform.addClass('active').html(entry.label)
121
+ else
122
+ klass = ""
123
+
124
+ @transforms.append $("<div class='label #{klass}'><span>#{label}</span></div>")
125
+ .attr("style", "top: #{top}%; height: #{height}%;")
126
+ .mousedown (e) =>
127
+ e.stopPropagation()
128
+ @jumpTo @currentFunction, entry.id
129
+
130
+ renewSelector: ->
131
+ @selector.val(@currentFunction).trigger('liszt:updated')
132
+
133
+ renewZoomer: ->
134
+ @zoomButton.removeClass 'active'
135
+
136
+ renewNaming: ->
137
+ elements = $('.naming')
138
+ drawer = @drawer
139
+
140
+ elements.filter('.link').click ->
141
+ element = $(@)
142
+ active = element.hasClass('active')
143
+ needle = element.attr("data-naming") || @innerHTML
144
+ elements.removeClass('active')
145
+
146
+ unless active
147
+ elements.filter(->
148
+ ($(@).attr("data-naming") || @innerHTML) == needle
149
+ ).addClass('active')
150
+
151
+ drawer.repaint()
152
+
153
+ buildZoomer: ->
154
+ @zoomButton.click =>
155
+ if @zoomButton.hasClass('active')
156
+ @zoomButton.removeClass('active')
157
+ @drawer.unfit()
158
+ else
159
+ @zoomButton.addClass('active')
160
+ @drawer.fit(@svg.width(), @svg.height())
161
+
162
+ buildSelector: ->
163
+ groups = ['Present', 'Removed'].map (x) -> $("<optgroup label='#{x}'></optgroup>")
164
+
165
+ @data.each (f, i) =>
166
+ group = if f.source.present then groups[0] else groups[1]
167
+ group.append "<option value='#{i}'>#{f.source.name}</option>"
168
+
169
+ groups.each (x) => @selector.append x
170
+
171
+ @selector.chosen(search_contains: true).change => @jumpTo @selector.val().toNumber()
172
+ @selector.val(@currentFunction).trigger('liszt:updated')
173
+
174
+ buildSlider: ->
175
+ $('button').button()
176
+
177
+ @sliderInput.focus -> $(@).blur()
178
+
179
+ @slider.slider
180
+ min: 0
181
+ orientation: 'vertical'
182
+ slide: (event, ui) => @sliderInput.val ui.value
183
+ change: (event) =>
184
+ @sliderInput.val @slider.slider('value')
185
+ # Redraw if triggered by manual slider scroll
186
+ @jumpTo @currentFunction, @sliderInput.val().toNumber() if event.originalEvent
187
+
188
+ @slider.on 'mouseenter', '.label', -> $(this).find('span').show()
189
+ @slider.on 'mouseout', '.label', -> $(this).find('span').hide()
190
+
191
+ next = => @jumpTo @currentFunction, @currentStep+1
192
+ prev = => @jumpTo @currentFunction, @currentStep-1
193
+
194
+ fnext = =>
195
+ step = @input.transforms.find (x) => x.id > @currentStep
196
+ if step
197
+ @jumpTo @currentFunction, step.id
198
+ else
199
+ transform = @input.transforms.last()
200
+ step = transform.id + transform.length
201
+ @jumpTo @currentFunction, step if step > @currentStep
202
+
203
+ fprev = =>
204
+ step = @input.transforms.findAll((x) => x.id < @currentStep).last()
205
+ @jumpTo @currentFunction, step.id if step
206
+
207
+ @sliderPrev.click prev
208
+ @sliderNext.click next
209
+ @sliderFNext.click fnext
210
+ @sliderFPrev.click fprev
211
+
212
+ $(document).bind 'keydown.h', fprev
213
+ $(document).bind 'keydown.j', prev
214
+ $(document).bind 'keydown.k', next
215
+ $(document).bind 'keydown.l', fnext
216
+ $(document).bind 'keydown.x', => @zoomButton.click()
217
+ $(document).bind 'keydown.backspace', (e) ->
218
+ e.preventDefault()
219
+ history.back()