css Audio - Active file-generic CSS - Active Generic - Active HTML - Active JS - Active SVG - Active Text - Active file-generic Video - Active header Love html icon-new-collection icon-person icon-team numbered-list123 pop-out spinner split-screen star tv

Pen Settings

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URL's added here will be added as <link>s in order, and before the CSS in the editor. If you link to another Pen, it will include the CSS from that Pen. If the preprocessor matches, it will attempt to combine them before processing.

+ add another resource

You're using npm packages, so we've auto-selected Babel for you here, which we require to process imports and make it all work. If you need to use a different JavaScript preprocessor, remove the packages in the npm tab.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Use npm Packages

We can make npm packages available for you to use in your JavaScript. We use webpack to prepare them and make them available to import. We'll also process your JavaScript with Babel.

⚠️ This feature can only be used by logged in users.

Code Indentation

     

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

HTML Settings

Here you can Sed posuere consectetur est at lobortis. Donec ullamcorper nulla non metus auctor fringilla. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

            
              
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
    <title>Rubrowser</title>
    <link media='all' rel='stylesheet'>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <style>html, body, .dependency_graph, .dependency_graph svg{
    width: 100%;
    height: 100%;
    padding: 0px;
    margin: 0px;
    font-size: 13px;
}

.link {
  fill: none;
  stroke: #666;
  stroke-width: 1.5px;
}

circle {
  fill: #fff;
  stroke: #333;
  stroke-width: 1.5px;
}

.circular {
    stroke: #FF0000;
}

.fixed circle {
  stroke-width: 3px;
}

text {
  font: 10px sans-serif;
  pointer-events: none;
  text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
}

text.type{
    font: 7px sans-serif;
}

.downlighted {
    opacity: 0.1;
}

.type_ignored, .name_ignored{
    display: none;
}

.highlighted, .name_highlighted, .type_highlighted{
    fill: #008ef3;
}

.highlighted circle, .name_highlighted circle, .type_highlighted circle{
    stroke: #008ef3;
}

.hide_namespace .namespace, .link.hide_relation{
    display: none;
}

/* ============================ */
/* Toolbox style */
/* ============================ */

.toolbox{
    position: fixed;
    top: 0px;
    left: 0px;
    max-height: 100%;
    width: 250px;
    background: white;
    overflow: auto;
}

ul, ol{
    list-style-position: inside;
    white-space: nowrap;
    margin: 0px;
    padding-left: 0px;
    overflow: auto;
}
</style>
  </head>
  <body>
    <div class='dependency_graph'>
      <svg></svg>
    </div>
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <script src='https://unpkg.com/lodash@4.17.4/lodash.min.js' type='text/javascript'></script>
    <script src='https://unpkg.com/d3@4.13.0/build/d3.min.js' type='text/javascript'></script>
    <script type='text/javascript'>
     var data = {"definitions":[{"type":"Class","namespace":"MiniTest::Spec","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","line":21,"lines":21},{"type":"Class","namespace":"Minitest::SharedExamples","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","line":43,"lines":3},{"type":"Class","namespace":"Counter","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","line":4,"lines":13},{"type":"Class","namespace":"Rack::Attack::Request","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_request_spec.rb","line":6,"lines":5},{"type":"Class","namespace":"Rack::Attack::Throttle","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","line":3,"lines":44},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","line":2,"lines":46},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","line":1,"lines":48},{"type":"Class","namespace":"Rack::Attack::Safelist","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/safelist.rb","line":3,"lines":7},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/safelist.rb","line":2,"lines":9},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/safelist.rb","line":1,"lines":11},{"type":"Module","namespace":"Rack::Attack::FallbackPathNormalizer","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","line":11,"lines":5},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","line":1,"lines":27},{"type":"Module","namespace":"Rack::Attack::StoreProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","line":3,"lines":28},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","line":2,"lines":30},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","line":1,"lines":32},{"type":"Class","namespace":"Rack::Attack::Request","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/request.rb","line":16,"lines":2},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/request.rb","line":15,"lines":4},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/request.rb","line":14,"lines":6},{"type":"Class","namespace":"Rack::Attack::Fail2Ban","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","line":3,"lines":51},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","line":2,"lines":53},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","line":1,"lines":55},{"type":"Class","namespace":"Rack::Attack::Cache","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","line":3,"lines":56},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","line":2,"lines":58},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","line":1,"lines":60},{"type":"Class","namespace":"Rack::Attack::StoreProxy::RedisStoreProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","line":6,"lines":38},{"type":"Module","namespace":"Rack::Attack::StoreProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","line":5,"lines":40},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","line":4,"lines":42},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","line":3,"lines":44},{"type":"Class","namespace":"Rack::Attack::StoreProxy::DalliProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","line":6,"lines":57},{"type":"Module","namespace":"Rack::Attack::StoreProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","line":5,"lines":59},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","line":4,"lines":61},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","line":3,"lines":63},{"type":"Class","namespace":"Rack::Attack::StoreProxy::MemCacheProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","line":4,"lines":45},{"type":"Module","namespace":"Rack::Attack::StoreProxy","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","line":3,"lines":47},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","line":2,"lines":49},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","line":1,"lines":51},{"type":"Class","namespace":"Rack::Attack::Track","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","line":3,"lines":17},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","line":2,"lines":19},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","line":1,"lines":21},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/version.rb","line":2,"lines":3},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/version.rb","line":1,"lines":5},{"type":"Class","namespace":"Rack::Attack::Check","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/check.rb","line":3,"lines":18},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/check.rb","line":2,"lines":20},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/check.rb","line":1,"lines":22},{"type":"Class","namespace":"Rack::Attack::Allow2Ban","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/allow2ban.rb","line":3,"lines":19},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/allow2ban.rb","line":2,"lines":21},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/allow2ban.rb","line":1,"lines":23},{"type":"Class","namespace":"Rack::Attack::Blocklist","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/blocklist.rb","line":3,"lines":7},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/blocklist.rb","line":2,"lines":9},{"type":"Module","namespace":"Rack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/blocklist.rb","line":1,"lines":11},{"type":"Class","namespace":"Rack::Attack","circular":false,"file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","line":4,"lines":153}],"relations":[{"type":"Base","namespace":"ActionPack::VERSION::MAJOR","resolved_namespace":"ActionPack::VERSION::MAJOR","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":11},{"type":"Base","namespace":"LoadError","resolved_namespace":"LoadError","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":17},{"type":"Base","namespace":"Rack::Test::Methods","resolved_namespace":"Rack::Test::Methods","caller":"MiniTest::Spec","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":23},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"MiniTest::Spec","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":25},{"type":"Base","namespace":"Rack::Builder","resolved_namespace":"Rack::Builder","caller":"MiniTest::Spec","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":28},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"MiniTest::Spec","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":29},{"type":"Base","namespace":"Module","resolved_namespace":"Module","caller":"Minitest::SharedExamples","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":43},{"type":"Base","namespace":"Minitest::Spec::DSL","resolved_namespace":"Minitest::Spec::DSL","caller":"Minitest::SharedExamples","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/spec_helper.rb","circular":false,"line":44},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":5},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":5},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":6},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":9},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":15},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":16},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":46},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":46},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":47},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":55},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":56},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":69},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":69},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":70},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":78},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":79},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":92},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":92},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":93},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":101},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_throttle_spec.rb","circular":false,"line":102},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":8},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":20},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":24},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":29},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":52},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":55},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":59},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":79},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":84},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_spec.rb","circular":false,"line":93},{"type":"Base","namespace":"Minitest::SharedExamples","resolved_namespace":"Minitest::SharedExamples","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":6},{"type":"Base","namespace":"OfflineExamples","resolved_namespace":"OfflineExamples","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":23},{"type":"Base","namespace":"Rack::Attack::Cache","resolved_namespace":"Rack::Attack::Cache","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":26},{"type":"Base","namespace":"ActiveSupport::Cache::RedisStore","resolved_namespace":"ActiveSupport::Cache::RedisStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":28},{"type":"Base","namespace":"OfflineExamples","resolved_namespace":"OfflineExamples","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":34},{"type":"Base","namespace":"Dalli","resolved_namespace":"Dalli","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":37},{"type":"Base","namespace":"Logger::FATAL","resolved_namespace":"Logger::FATAL","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":37},{"type":"Base","namespace":"Rack::Attack::Cache","resolved_namespace":"Rack::Attack::Cache","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":39},{"type":"Base","namespace":"Dalli::Client","resolved_namespace":"Dalli::Client","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":40},{"type":"Base","namespace":"Dalli","resolved_namespace":"Dalli","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":44},{"type":"Base","namespace":"Logger::INFO","resolved_namespace":"Logger::INFO","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/offline_spec.rb","circular":false,"line":44},{"type":"Base","namespace":"Rack::Attack::Cache","resolved_namespace":"Rack::Attack::Cache","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":3},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":24},{"type":"Base","namespace":"ActiveSupport::Cache::DalliStore","resolved_namespace":"ActiveSupport::Cache::DalliStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":25},{"type":"Base","namespace":"ActiveSupport::Cache::RedisStore","resolved_namespace":"ActiveSupport::Cache::RedisStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":26},{"type":"Base","namespace":"ActiveSupport::Cache::MemCacheStore","resolved_namespace":"ActiveSupport::Cache::MemCacheStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":27},{"type":"Base","namespace":"Dalli::Client","resolved_namespace":"Dalli::Client","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":28},{"type":"Base","namespace":"ConnectionPool","resolved_namespace":"ConnectionPool","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":29},{"type":"Base","namespace":"Dalli::Client","resolved_namespace":"Dalli::Client","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":29},{"type":"Base","namespace":"Redis::Store","resolved_namespace":"Redis::Store","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":30},{"type":"Base","namespace":"Rack::Attack::StoreProxy","resolved_namespace":"Rack::Attack::StoreProxy","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":34},{"type":"Base","namespace":"Rack::Attack::Cache","resolved_namespace":"Rack::Attack::Cache","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/integration/rack_attack_cache_spec.rb","circular":false,"line":38},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":19},{"type":"Base","namespace":"Counter","resolved_namespace":"Counter","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":30},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":32},{"type":"Base","namespace":"ActiveSupport::Notifications","resolved_namespace":"ActiveSupport::Notifications","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":34},{"type":"Base","namespace":"Counter","resolved_namespace":"Counter","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":35},{"type":"Base","namespace":"Counter","resolved_namespace":"Counter","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":41},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":47},{"type":"Base","namespace":"Rack::Attack::Check","resolved_namespace":"Rack::Attack::Check","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":48},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":54},{"type":"Base","namespace":"Rack::Attack::Throttle","resolved_namespace":"Rack::Attack::Throttle","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_track_spec.rb","circular":false,"line":55},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":5},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":8},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":8},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":10},{"type":"Base","namespace":"Rack::Attack::Fail2Ban","resolved_namespace":"Rack::Attack::Fail2Ban","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":11},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":31},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":53},{"type":"Base","namespace":"Rack::Attack::Fail2Ban","resolved_namespace":"Rack::Attack::Fail2Ban","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":66},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":75},{"type":"Base","namespace":"Rack::Attack::Fail2Ban","resolved_namespace":"Rack::Attack::Fail2Ban","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":80},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":110},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/fail2ban_spec.rb","circular":false,"line":130},{"type":"Base","namespace":"Rack::Attack::StoreProxy::DalliProxy","resolved_namespace":"Rack::Attack::StoreProxy::DalliProxy","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_dalli_proxy_spec.rb","circular":false,"line":3},{"type":"Base","namespace":"Rack::Attack::StoreProxy::DalliProxy","resolved_namespace":"Rack::Attack::StoreProxy::DalliProxy","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_dalli_proxy_spec.rb","circular":false,"line":6},{"type":"Base","namespace":"Class","resolved_namespace":"Class","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_dalli_proxy_spec.rb","circular":false,"line":6},{"type":"Base","namespace":"Rack::Attack::PathNormalizer","resolved_namespace":"Rack::Attack::PathNormalizer","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_path_normalizer_spec.rb","circular":false,"line":3},{"type":"Base","namespace":"Rack::Attack::PathNormalizer","resolved_namespace":"Rack::Attack::PathNormalizer","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_path_normalizer_spec.rb","circular":false,"line":4},{"type":"Base","namespace":"Rack::Attack::FallbackPathNormalizer","resolved_namespace":"Rack::Attack::FallbackPathNormalizer","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_path_normalizer_spec.rb","circular":false,"line":11},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/rack_attack_request_spec.rb","circular":false,"line":12},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":5},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":8},{"type":"Base","namespace":"ActiveSupport::Cache::MemoryStore","resolved_namespace":"ActiveSupport::Cache::MemoryStore","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":8},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":10},{"type":"Base","namespace":"Rack::Attack::Allow2Ban","resolved_namespace":"Rack::Attack::Allow2Ban","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":11},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":31},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":53},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":90},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/spec/allow2ban_spec.rb","circular":false,"line":110},{"type":"Base","namespace":"MANDATORY_OPTIONS","resolved_namespace":"MANDATORY_OPTIONS","caller":"Rack::Attack::Throttle","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","circular":false,"line":8},{"type":"Base","namespace":"ArgumentError","resolved_namespace":"ArgumentError","caller":"Rack::Attack::Throttle","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","circular":false,"line":9},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"Rack::Attack::Throttle","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","circular":true,"line":17},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"Rack::Attack::Throttle","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/throttle.rb","circular":true,"line":42},{"type":"Base","namespace":"Check","resolved_namespace":"Rack::Attack::Check","caller":"Rack::Attack::Safelist","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/safelist.rb","circular":false,"line":3},{"type":"Base","namespace":"::ActionDispatch::Journey::Router::Utils","resolved_namespace":"ActionDispatch::Journey::Router::Utils","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","circular":false,"line":17},{"type":"Base","namespace":"::ActionDispatch::Journey::Router::Utils","resolved_namespace":"ActionDispatch::Journey::Router::Utils","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","circular":false,"line":19},{"type":"Base","namespace":"::Journey::Router::Utils","resolved_namespace":"Journey::Router::Utils","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","circular":false,"line":20},{"type":"Base","namespace":"::Journey::Router::Utils","resolved_namespace":"Journey::Router::Utils","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","circular":false,"line":22},{"type":"Base","namespace":"FallbackPathNormalizer","resolved_namespace":"Rack::Attack::FallbackPathNormalizer","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/path_normalizer.rb","circular":false,"line":24},{"type":"Base","namespace":"DalliProxy","resolved_namespace":"Rack::Attack::StoreProxy::DalliProxy","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":4},{"type":"Base","namespace":"MemCacheProxy","resolved_namespace":"Rack::Attack::StoreProxy::MemCacheProxy","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":4},{"type":"Base","namespace":"RedisStoreProxy","resolved_namespace":"Rack::Attack::StoreProxy::RedisStoreProxy","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":4},{"type":"Base","namespace":"Set","resolved_namespace":"Set","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":6},{"type":"Base","namespace":"Set","resolved_namespace":"Set","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":7},{"type":"Base","namespace":"PROXIES","resolved_namespace":"PROXIES","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":11},{"type":"Base","namespace":"ACTIVE_SUPPORT_WRAPPER_CLASSES","resolved_namespace":"ACTIVE_SUPPORT_WRAPPER_CLASSES","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":24},{"type":"Base","namespace":"ACTIVE_SUPPORT_CLIENTS","resolved_namespace":"ACTIVE_SUPPORT_CLIENTS","caller":"Rack::Attack::StoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy.rb","circular":false,"line":24},{"type":"Base","namespace":"::Rack::Request","resolved_namespace":"Rack::Request","caller":"Rack::Attack::Request","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/request.rb","circular":false,"line":16},{"type":"Base","namespace":"ArgumentError","resolved_namespace":"ArgumentError","caller":"Rack::Attack::Fail2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","circular":false,"line":6},{"type":"Base","namespace":"ArgumentError","resolved_namespace":"ArgumentError","caller":"Rack::Attack::Fail2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","circular":false,"line":7},{"type":"Base","namespace":"ArgumentError","resolved_namespace":"ArgumentError","caller":"Rack::Attack::Fail2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","circular":false,"line":8},{"type":"Base","namespace":"ArgumentError","resolved_namespace":"ArgumentError","caller":"Rack::Attack::Fail2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","circular":false,"line":19},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"Rack::Attack::Fail2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/fail2ban.rb","circular":false,"line":50},{"type":"Base","namespace":"::Rails","resolved_namespace":"Rails","caller":"Rack::Attack::Cache","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","circular":false,"line":8},{"type":"Base","namespace":"::Rails","resolved_namespace":"Rails","caller":"Rack::Attack::Cache","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","circular":false,"line":8},{"type":"Base","namespace":"StoreProxy","resolved_namespace":"Rack::Attack::StoreProxy","caller":"Rack::Attack::Cache","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","circular":false,"line":14},{"type":"Base","namespace":"Time","resolved_namespace":"Time","caller":"Rack::Attack::Cache","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/cache.rb","circular":false,"line":42},{"type":"Base","namespace":"SimpleDelegator","resolved_namespace":"SimpleDelegator","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":6},{"type":"Base","namespace":"::Redis::Store","resolved_namespace":"Redis::Store","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":8},{"type":"Base","namespace":"::Redis::Store","resolved_namespace":"Redis::Store","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":8},{"type":"Base","namespace":"Redis::BaseError","resolved_namespace":"Redis::BaseError","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":17},{"type":"Base","namespace":"Redis::BaseError","resolved_namespace":"Redis::BaseError","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":26},{"type":"Base","namespace":"Redis::BaseError","resolved_namespace":"Redis::BaseError","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":36},{"type":"Base","namespace":"Redis::BaseError","resolved_namespace":"Redis::BaseError","caller":"Rack::Attack::StoreProxy::RedisStoreProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/redis_store_proxy.rb","circular":false,"line":41},{"type":"Base","namespace":"SimpleDelegator","resolved_namespace":"SimpleDelegator","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":6},{"type":"Base","namespace":"::Dalli","resolved_namespace":"Dalli","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":8},{"type":"Base","namespace":"::ConnectionPool","resolved_namespace":"ConnectionPool","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":12},{"type":"Base","namespace":"::ConnectionPool","resolved_namespace":"ConnectionPool","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":12},{"type":"Base","namespace":"::Dalli::Client","resolved_namespace":"Dalli::Client","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":13},{"type":"Base","namespace":"::Dalli::Client","resolved_namespace":"Dalli::Client","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":15},{"type":"Base","namespace":"Dalli::DalliError","resolved_namespace":"Dalli::DalliError","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":28},{"type":"Base","namespace":"Dalli::DalliError","resolved_namespace":"Dalli::DalliError","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":35},{"type":"Base","namespace":"Dalli::DalliError","resolved_namespace":"Dalli::DalliError","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":42},{"type":"Base","namespace":"Dalli::DalliError","resolved_namespace":"Dalli::DalliError","caller":"Rack::Attack::StoreProxy::DalliProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/dalli_proxy.rb","circular":false,"line":49},{"type":"Base","namespace":"SimpleDelegator","resolved_namespace":"SimpleDelegator","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":4},{"type":"Base","namespace":"::MemCache","resolved_namespace":"MemCache","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":6},{"type":"Base","namespace":"::MemCache","resolved_namespace":"MemCache","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":6},{"type":"Base","namespace":"MemCache::MemCacheError","resolved_namespace":"MemCache::MemCacheError","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":17},{"type":"Base","namespace":"MemCache::MemCacheError","resolved_namespace":"MemCache::MemCacheError","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":23},{"type":"Base","namespace":"MemCache::MemCacheError","resolved_namespace":"MemCache::MemCacheError","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":28},{"type":"Base","namespace":"MemCache::MemCacheError","resolved_namespace":"MemCache::MemCacheError","caller":"Rack::Attack::StoreProxy::MemCacheProxy","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/store_proxy/mem_cache_proxy.rb","circular":false,"line":35},{"type":"Base","namespace":"Forwardable","resolved_namespace":"Forwardable","caller":"Rack::Attack::Track","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","circular":false,"line":4},{"type":"Base","namespace":"Throttle","resolved_namespace":"Rack::Attack::Throttle","caller":"Rack::Attack::Track","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","circular":false,"line":12},{"type":"Base","namespace":"Check","resolved_namespace":"Rack::Attack::Check","caller":"Rack::Attack::Track","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/track.rb","circular":false,"line":14},{"type":"Base","namespace":"Rack::Attack","resolved_namespace":"Rack::Attack","caller":"Rack::Attack::Check","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/check.rb","circular":true,"line":15},{"type":"Base","namespace":"Fail2Ban","resolved_namespace":"Rack::Attack::Fail2Ban","caller":"Rack::Attack::Allow2Ban","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/allow2ban.rb","circular":false,"line":3},{"type":"Base","namespace":"Check","resolved_namespace":"Rack::Attack::Check","caller":"Rack::Attack::Blocklist","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack/blocklist.rb","circular":false,"line":3},{"type":"Base","namespace":"Safelist","resolved_namespace":"Rack::Attack::Safelist","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":25},{"type":"Base","namespace":"Blocklist","resolved_namespace":"Rack::Attack::Blocklist","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":34},{"type":"Base","namespace":"Throttle","resolved_namespace":"Rack::Attack::Throttle","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":43},{"type":"Base","namespace":"Track","resolved_namespace":"Rack::Attack::Track","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":47},{"type":"Base","namespace":"Cache","resolved_namespace":"Rack::Attack::Cache","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":104},{"type":"Base","namespace":"ActiveSupport::Notifications","resolved_namespace":"ActiveSupport::Notifications","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":124},{"type":"Base","namespace":"ActiveSupport::Notifications","resolved_namespace":"ActiveSupport::Notifications","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":124},{"type":"Base","namespace":"PathNormalizer","resolved_namespace":"PathNormalizer","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":136},{"type":"Base","namespace":"Rack::Attack::Request","resolved_namespace":"Rack::Attack::Request","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":137},{"type":"Base","namespace":"Forwardable","resolved_namespace":"Forwardable","caller":"Rack::Attack","file":"/vendor/bundle/ruby/2.5.0/gems/rack-attack-5.0.1/lib/rack/attack.rb","circular":false,"line":151}]};
     var layout = null;
    </script>
    <script type='text/javascript'>var classForCircular = function(d) {
  return d.circular ? 'circular' : '';
};

var svg = d3.select(".dependency_graph svg"),
    $svg = $('.dependency_graph svg'),
    width = $svg.width(),
    height = $svg.height(),
    drag = d3.drag()
    .on("start", dragstarted)
    .on("drag", dragged)
    .on("end", dragended),
    dup_definitions = data.definitions.map(function(d){ return {id: d.namespace, type: d.type, lines: d.lines, circular: d.circular }; }),
    definitions = _(dup_definitions).groupBy('id').map(function(group) {
      return {
        id: group[0].id,
        type: group[0].type,
        lines: _(group).sumBy('lines'),
        circular: group[0].circular
      };
    }).value(),
    namespaces = definitions.map(function(d){ return d.id; }),
    relations = data.relations.map(function(d){ return {source: d.caller, target: d.resolved_namespace, circular: d.circular}; }),
    max_lines = _.maxBy(definitions, 'lines').lines,
    max_circle_r = 50;

relations = relations.filter(function(d){
  return namespaces.indexOf(d.source) >= 0 && namespaces.indexOf(d.target) >= 0;
});
relations = _.uniqWith(relations, _.isEqual);

var zoom = d3.zoom()
    .on("zoom", function () {
      container.attr("transform", d3.event.transform);
    });

svg.call(zoom)
  .on("dblclick.zoom", null);

var container = svg.append('g'),
    simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d) { return d.id; }))
    .force("charge", d3.forceManyBody())
    .force("center", d3.forceCenter(width / 2, height / 2))
    .force("forceCollide", d3.forceCollide(80));

simulation
  .nodes(definitions)
  .on("tick", ticked);

simulation.force("link")
  .links(relations);

var link = container.append("g")
    .attr("class", "links")
    .selectAll("path")
    .data(relations)
    .enter().append("path")
    .attr("class", function(d) { return 'link ' + classForCircular(d); })
    .attr("marker-end", function(d){ return "url(#" + d.target.id + ")"; }),
    node = container.append("g")
    .attr("class", "nodes")
    .selectAll("g")
    .data(definitions)
    .enter().append("g")
    .call(drag)
    .on("dblclick", dblclick),
    circle = node
    .append("circle")
    .attr("r", function(d) { return d.lines / max_lines * max_circle_r + 6; })
    .attr("class", function (d) { return classForCircular(d) ; }),
    type = node
    .append("text")
    .attr("class", "type")
    .attr("x", "-0.4em")
    .attr("y", "0.4em")
    .text(function(d) { return d.type[0]; }),
    text = node
    .append("text")
    .attr("class", "namespace")
    .attr("x", function(d) { return d.lines / max_lines * max_circle_r + 8; })
    .attr("y", ".31em")
    .text(function(d) { return d.id; });

container.append("defs").selectAll("marker")
  .data(definitions)
  .enter().append("marker")
  .attr("id", function(d) { return d.id; })
  .attr("viewBox", "0 -5 10 10")
  .attr("refX", function(d){ return d.lines / max_lines * max_circle_r + 20; })
  .attr("refY", 0)
  .attr("markerWidth", 6)
  .attr("markerHeight", 6)
  .attr("orient", "auto")
  .append("path")
  .attr("d", "M0,-5L10,0L0,5");

function ticked() {
  link.attr("d", linkArc);
  node.attr("transform", transform);
}

function linkArc(d) {
  var dx = d.target.x - d.source.x,
      dy = d.target.y - d.source.y,
      dr =  0;
  return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
}

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d3.select(this).classed("fixed", true);
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
}

function dblclick(d) {
  d3.select(this).classed("fixed", false);
  d.fx = null;
  d.fy = null;
}

function transform(d) {
  return "translate(" + d.x + "," + d.y + ")";
}

var state = {
  get: function(){
    var positions = [];
    rubrowser.definitions.forEach(function(elem){
      if( elem.fx !== undefined && elem.fy !== undefined) {
        positions.push({
          id: elem.id,
          x: elem.fx,
          y: elem.fy
        });
      }
    });
    return positions;
  },

  set: function(layout){
    if ( !layout ) { return; }
    layout.forEach(function(pos) {
      var definition = node.filter(function(e) { return e.id == pos.id; })
      definition.classed("fixed", true);

      var datum = definition.data()[0]
      if( datum ) {
        datum.fx = pos.x
        datum.fy = pos.y
      }
    });
  }
}

node.on('mouseover', function(d) {
  var relatives = [];
  link.classed('downlighted', function(l) {
    if (d === l.source || d === l.target){
      relatives.push(l.source);
      relatives.push(l.target);
      return false;
    }else{
      return true;
    }
  });
  node.classed('downlighted', function(n) {
    return !(n == d || relatives.indexOf(n) > -1);
  });
});

node.on('mouseout', function() {
  link.classed('downlighted', false);
  node.classed('downlighted', false);
});

window.rubrowser = {
  data: data,
  definitions: definitions,
  relations: relations,
  simulation: simulation,
  node: node,
  link: link,
  state: state
};

rubrowser.state.set(layout);
</script>

    
      <div class="toolbox">
  <div class="card mt-2">
    <div class="card-header">Node Details</div>
    <div class="card-body" id="information_panel">
      Please click on any node.
    </div>
  </div>
  <div class="card mt-2">
    <div class="card-header">Search</div>
    <div class="card-body">
      <label class="form-label">Namespace</label>
      <textarea id="highlight_by_namespace" class="form-control" rows="5"></textarea>
    </div>
    <div class="card-body">
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="highlight_modules"/>
        <label class="form-check-label">Modules</label>
      </div>
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="highlight_classes"/>
        <label class="form-check-label">Classes</label>
      </div>
    </div>
  </div>
  <div class="card mt-2">
    <div class="card-header">Ignore</div>
    <div class="card-body">
      <label>Namespace</label>
      <textarea id="ignore_by_namespace" class="form-control" rows="5"></textarea>
    </div>
    <div class="card-body">
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="ignore_modules"/>
        <label class="form-check-label">Modules</label>
      </div>
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="ignore_classes"/>
        <label class="form-check-label">Classes</label>
      </div>
    </div>
  </div>
  <div class="card mt-2">
    <div class="card-header">Display</div>
    <div class="card-body">
      <button type="button" id="download_layout" class="btn btn-secondary btn-block">Download layout</button>
      <button type="button" id="pause_simulation" class="btn btn-secondary btn-block">Pause animation</button>
    </div>
    <div class="card-body">
      <label class="form-label">Force Collide</label>
      <input id="force_collide" class="form-control" type="range" value="80" min="0" max="500"/>
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="hide_namespaces"/>
        <label class="form-check-label">Hide namespaces</label>
      </div>
      <div class="form-check">
        <input type="checkbox" class="form-check-input" id="hide_relations"/>
        <label class="form-check-label">Hide relations</label>
      </div>
    </div>
  </div>
</div>

      <script type='text/javascript'>$(document).on('click', '.card-header', function(){
  $(this).siblings().toggle();
});

// --------------------------------
// Details Panel
// --------------------------------
rubrowser.node.on('click', function(d){
  var namespace = d.id;
  var lines = d.lines;
  var dependents = rubrowser.relations.filter(function(i){ return i.target.id == namespace; });
  var dependencies = rubrowser.relations.filter(function(i){ return i.source.id == namespace; });
  var definitions = rubrowser.data.definitions.filter(function(i){ return i.namespace == namespace; });
  var relations = rubrowser.data.relations.filter(function(i){ return i.resolved_namespace == namespace || i.caller == namespace; });

  var content = $('<div>');
  content.append('<label><strong>'+namespace+' ('+d.lines+' Lines)</strong></label>');

  content.append('<strong>Defined in:</strong>');
  var definitions_ol = $("<ol>");
  for(var i=0; i<definitions.length; i++){
    definitions_ol.append("<li>"+definitions[i].file+":"+definitions[i].line.toString()+"</li>");
  }
  content.append(definitions_ol);

  if( dependents.length > 0 ){
    content.append('<strong>Dependents:</strong>');
    var dependents_ol = $("<ol>");
    for(var i=0; i<dependents.length; i++){
      dependents_ol.append("<li>"+dependents[i].source.id+"</li>");
    }
    content.append(dependents_ol);
  }

  if( dependencies.length > 0 ){
    content.append('<strong>Dependencies:</strong>');
    var dependencies_ol = $("<ol>");
    for(var i=0; i<dependencies.length; i++){
      dependencies_ol.append("<li>"+dependencies[i].target.id+"</li>");
    }
    content.append(dependencies_ol);
  }

  $('#information_panel').html(content);
  return true;
});


// --------------------------------
// Search Panel
// --------------------------------
$(document).on('change', '#highlight_by_namespace', function(){
  var highlights_entries = $(this).val().trim();
  var highlights = highlights_entries.split("\n");

  rubrowser.node.classed('name_highlighted', function(d){
    if(highlights_entries.length == 0){ return false; }
    return highlights.filter(function(i){ return d.id.indexOf(i) > -1; }).length > 0;
  });
});

$(document).on('change', '#highlight_modules, #highlight_classes', function(){
  var modules_highlighted = $('#highlight_modules').is(':checked'),
      classes_highlighted = $('#highlight_classes').is(':checked');

  rubrowser.node.classed('type_highlighted', function(d){
    return (d.type == 'Module' && modules_highlighted) || (d.type == 'Class' && classes_highlighted);
  });
});

// --------------------------------
// Ignore Panel
// --------------------------------
$(document).on('change', '#ignore_by_namespace', function(){
  var ignores_entries = $(this).val().trim();
  var ignores = ignores_entries.split("\n");

  // filtering definitions
  var filtered_definitions = rubrowser.definitions.filter(function(d){
    if(ignores_entries.length == 0){ return true; }
    return ignores.filter(function(i){ return d.id.indexOf(i) > -1; }).length == 0;
  })

  rubrowser.simulation
    .nodes(filtered_definitions)

  rubrowser.node.classed('name_ignored', function(d){
    if(ignores_entries.length == 0){ return false; }
    return ignores.filter(function(i){ return d.id.indexOf(i) > -1; }).length > 0;
  });

  // filtering relations
  var filtered_relations = rubrowser.relations.filter(function(d){
      if(ignores_entries.length == 0){ return true; }
      return ignores.filter(function(i){ return d.source.id.indexOf(i) > -1 || d.target.id.indexOf(i) > -1; }).length == 0;
  })

  rubrowser.simulation
    .force("link")
    .links(filtered_relations);

  rubrowser.link.classed('name_ignored', function(d){
    if(ignores_entries.length == 0){ return false; }
    return ignores.filter(function(i){ return d.source.id.indexOf(i) > -1 || d.target.id.indexOf(i) > -1; }).length > 0;
  });
});

$(document).on('change', '#ignore_modules, #ignore_classes', function(){
  var modules_ignored = $('#ignore_modules').is(':checked'),
      classes_ignored = $('#ignore_classes').is(':checked');

  rubrowser.node.classed('type_ignored', function(d){
    return (d.type == 'Module' && modules_ignored) || (d.type == 'Class' && classes_ignored);
  });
  rubrowser.link.classed('type_ignored', function(d){
    return ((d.source.type == 'Module' && modules_ignored) || (d.source.type == 'Class' && classes_ignored)) ||
      ((d.target.type == 'Module' && modules_ignored) || (d.target.type == 'Class' && classes_ignored));
  });
});

// --------------------------------
// Display Panel
// --------------------------------
$(document).on('change', "#force_collide", function(){
  var new_value = $(this).val();
  rubrowser.simulation.force("forceCollide", d3.forceCollide(new_value));
});

$(document).on('change', "#hide_relations", function(){
  var hide_relations = $('#hide_relations').is(':checked');
  rubrowser.link.classed("hide_relation", hide_relations);
});

$(document).on('change', "#hide_namespaces", function(){
  var hide_namespaces = $('#hide_namespaces').is(':checked');
  rubrowser.node.classed("hide_namespace", hide_namespaces);
});

$(document).on('click', "#pause_simulation", function(){
    rubrowser.simulation.stop();
});

$(document).on('click', "#download_layout", function(){
  var json = JSON.stringify(rubrowser.state.get());
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(json));
  element.setAttribute('download', 'layout.json');

  element.style.display = 'none';
  document.body.appendChild(element);
  element.click();
  document.body.removeChild(element);
});
</script>
    
  </body>
</html>

            
          
!
999px
🕑 One or more of the npm packages you are using needs to be built. You're the first person to ever need it! We're building it right now and your preview will start updating again when it's ready.
Loading ..................

Console