akero 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +43 -0
  5. data/.travis.yml +3 -7
  6. data/Gemfile +1 -0
  7. data/Guardfile +4 -3
  8. data/Makefile +26 -0
  9. data/README.md +28 -10
  10. data/Rakefile +8 -17
  11. data/akero.gemspec +17 -10
  12. data/bin/akero +6 -0
  13. data/coverage/.last_run.json +5 -0
  14. data/coverage/.resultset.json +367 -0
  15. data/coverage/.resultset.json.lock +0 -0
  16. data/coverage/assets/0.10.0/application.css +799 -0
  17. data/coverage/assets/0.10.0/application.js +1707 -0
  18. data/coverage/assets/0.10.0/colorbox/border.png +0 -0
  19. data/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  20. data/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  21. data/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  22. data/coverage/assets/0.10.0/favicon_green.png +0 -0
  23. data/coverage/assets/0.10.0/favicon_red.png +0 -0
  24. data/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  25. data/coverage/assets/0.10.0/loading.gif +0 -0
  26. data/coverage/assets/0.10.0/magnify.png +0 -0
  27. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  28. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  29. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  30. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  31. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  32. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  33. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  34. data/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  35. data/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  36. data/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  37. data/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  38. data/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  39. data/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  40. data/coverage/assets/0.7.1/application.css +1110 -0
  41. data/coverage/assets/0.7.1/application.js +626 -0
  42. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  43. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  44. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  45. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  46. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  47. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  48. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  49. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  50. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  51. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  52. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  53. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  54. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  55. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  56. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  57. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  58. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  59. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  60. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  61. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  62. data/coverage/assets/0.7.1/favicon_green.png +0 -0
  63. data/coverage/assets/0.7.1/favicon_red.png +0 -0
  64. data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  65. data/coverage/assets/0.7.1/loading.gif +0 -0
  66. data/coverage/assets/0.7.1/magnify.png +0 -0
  67. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  68. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  70. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  71. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  72. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  73. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  74. data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  75. data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  76. data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  77. data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  78. data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  79. data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  80. data/coverage/index.html +2248 -0
  81. data/doc/Akero/Message.html +475 -0
  82. data/doc/Akero.html +1148 -0
  83. data/doc/_index.html +125 -0
  84. data/doc/class_list.html +53 -0
  85. data/doc/css/common.css +1 -0
  86. data/doc/css/full_list.css +57 -0
  87. data/doc/css/style.css +338 -0
  88. data/doc/file.README.html +186 -0
  89. data/doc/file_list.html +55 -0
  90. data/doc/frames.html +28 -0
  91. data/doc/index.html +186 -0
  92. data/doc/js/app.js +214 -0
  93. data/doc/js/full_list.js +173 -0
  94. data/doc/js/jquery.js +4 -0
  95. data/doc/method_list.html +148 -0
  96. data/doc/top-level-namespace.html +112 -0
  97. data/lib/akero/benchmark.rb +21 -20
  98. data/lib/akero/cli.rb +74 -0
  99. data/lib/akero/version.rb +2 -1
  100. data/lib/akero.rb +92 -90
  101. data/spec/akero_spec.rb +66 -65
  102. data/spec/spec_helper.rb +1 -0
  103. metadata +164 -52
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f225c55aea3201c19c20e56f02ee12a390a0f34
4
+ data.tar.gz: 1b786e1ba1de3bd0d4842d233eb55cc320edb3b3
5
+ SHA512:
6
+ metadata.gz: fd0e126c6fd6fbd211d1ef49edba1d37f704df66870026c750ed83c5e04aa57485d5a0effe2557b1f56d8f6066650133b4036465dce125d8c4bccdedfcf0351e
7
+ data.tar.gz: c8768afdfecda7c928aee36890176f4ee8f1d1bac9b821dc8be311dd85f575bfd228dc4ead7f950edec5db9afae8db38bbdf08ced65248dd762f0d3a684ba15b
data/.gitattributes ADDED
@@ -0,0 +1,3 @@
1
+ doc/* linguist-documentation
2
+ coverage/* linguist-documentation
3
+ benchmark/* linguist-documentation
data/.gitignore CHANGED
@@ -8,8 +8,6 @@
8
8
  Gemfile.lock
9
9
  InstalledFiles
10
10
  _yardoc
11
- coverage
12
- doc/
13
11
  lib/bundler/man
14
12
  pkg
15
13
  rdoc
data/.rubocop.yml ADDED
@@ -0,0 +1,43 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ # Offense count: 13
5
+ Lint/AmbiguousRegexpLiteral:
6
+ Exclude:
7
+ - 'spec/akero_spec.rb'
8
+
9
+ # Offense count: 1
10
+ Lint/UnderscorePrefixedVariableName:
11
+ Exclude:
12
+ - 'lib/akero/benchmark.rb'
13
+
14
+ # Offense count: 8
15
+ Lint/UselessAssignment:
16
+ Exclude:
17
+ - 'lib/akero/benchmark.rb'
18
+ - 'spec/akero_spec.rb'
19
+
20
+ # Offense count: 9
21
+ Lint/Void:
22
+ Exclude:
23
+ - 'spec/akero_spec.rb'
24
+
25
+ # Offense count: 7
26
+ Metrics/AbcSize:
27
+ Max: 60
28
+
29
+ # Offense count: 2
30
+ # Configuration parameters: CountComments.
31
+ Metrics/ClassLength:
32
+ Max: 164
33
+
34
+ # Offense count: 45
35
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
36
+ # URISchemes: http, https
37
+ Metrics/LineLength:
38
+ Max: 150
39
+
40
+ # Offense count: 8
41
+ # Configuration parameters: CountComments.
42
+ Metrics/MethodLength:
43
+ Max: 51
data/.travis.yml CHANGED
@@ -1,9 +1,5 @@
1
1
  language: ruby
2
+ before_install:
3
+ - gem install bundler
2
4
  rvm:
3
- - "1.8.7"
4
- - "1.9.2"
5
- - "1.9.3"
6
- # - jruby-18mode # JRuby in 1.8 mode
7
- # - jruby-19mode # JRuby in 1.9 mode
8
- - rbx-18mode
9
- - rbx-19mode
5
+ - "2.3.1"
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in smime.gemspec
data/Guardfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  my_code = <<'RUBY_CODE'
2
3
  if type == 'failed'
3
4
  system "ssh 192.168.1.106 '~/bin/keyboard_leds -c1 >/dev/null'"
@@ -9,10 +10,10 @@ my_code = <<'RUBY_CODE'
9
10
  end
10
11
  RUBY_CODE
11
12
 
12
- notification :eval_notifier, :code => my_code
13
+ notification :eval_notifier, code: my_code
13
14
 
14
- guard 'rspec', :cli => '--color --format doc' do
15
+ guard 'rspec', cli: '--color --format doc' do
15
16
  watch(%r{^spec/.+_spec\.rb$})
16
17
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
17
- watch('spec/spec_helper.rb') { "spec" }
18
+ watch('spec/spec_helper.rb') { 'spec' }
18
19
  end
data/Makefile ADDED
@@ -0,0 +1,26 @@
1
+ # 0. make test
2
+ # 1. commit changes
3
+ # 2. bump
4
+ # 3. make release
5
+
6
+ .PHONY: test doc release
7
+
8
+ test:
9
+ bundle exec rubocop
10
+ bundle exec rake
11
+
12
+ doc:
13
+ bundle exec yardoc
14
+
15
+ push: test doc
16
+ git add doc coverage README.md
17
+ git commit -m 'Documentation update' doc coverage README.md
18
+ git checkout gh-pages
19
+ git checkout master -- doc coverage
20
+ git commit -m 'Documentation update'
21
+ git checkout master
22
+ git push origin gh-pages
23
+
24
+ release: test doc push
25
+ bundle exec rake release
26
+
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # Akero [![Build Status](https://travis-ci.org/busyloop/akero.png?branch=master)](https://travis-ci.org/busyloop/akero) [![Dependency Status](https://gemnasium.com/busyloop/akero.png)](https://gemnasium.com/busyloop/akero)
1
+ # Akero [![Build Status](https://travis-ci.org/busyloop/akero.png?branch=master)](https://travis-ci.org/busyloop/akero) [![Dependency Status](https://gemnasium.com/busyloop/akero.png)](https://gemnasium.com/busyloop/akero) [![Gem Version](https://badge.fury.io/rb/akero.svg)](https://badge.fury.io/rb/akero)
2
2
 
3
3
  Akero ([ἄγγελος](http://en.wiktionary.org/wiki/%F0%90%80%80%F0%90%80%90%F0%90%80%AB), messenger) is an easy-to-use library for peer-to-peer [public key cryptography](http://en.wikipedia.org/wiki/Public-key_cryptography). It enables two or more endpoints to exchange encrypted and/or signed messages without requiring a pre-shared secret.
4
4
 
5
5
  Under the hood Akero uses standard OpenSSL primitives. Each instance wraps a [RSA](http://en.wikipedia.org/wiki/RSA)-keypair, a corresponding [X.509 certificate](http://en.wikipedia.org/wiki/X.509) and exchanges self-signed messages ([PKCS#7](https://tools.ietf.org/html/rfc2315)) with other instances.
6
6
 
7
- Akero does not try to be a substitute for a fully featured [PKI](http://en.wikipedia.org/wiki/Public_key_infrastructure). It is meant to be used as a building block in scenarios where trust-relationships and keyrings can be externally managed, and where the complexity of traditional solutions (X.509 PKI, OpenPGP, custom RSA) yields no tangible benefits.
7
+ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikipedia.org/wiki/Public_key_infrastructure). It is meant to be used as a building block in scenarios where trust-relationships and keyrings can be managed externally, and where the complexity of traditional solutions (X.509 PKI, OpenPGP, custom RSA) yields no tangible benefits.
8
8
 
9
9
  ## Features
10
10
 
@@ -12,7 +12,7 @@ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikip
12
12
  * Low complexity; easy to use, understand and review (only 192 lines of code)
13
13
  * Transport agnostic; messages and certificates are self-contained and optionally ascii-armored (base64)
14
14
  * Built on standard OpenSSL primitives, no homegrown algorithms
15
- * [100%](https://busyloop.net/oss/akero/coverage/) test coverage
15
+ * [100%](http://busyloop.github.com/akero/coverage/) test coverage
16
16
 
17
17
 
18
18
  ## Installation
@@ -20,7 +20,7 @@ Akero does not try to be a substitute for a fully featured [PKI](http://en.wikip
20
20
  `gem install akero`
21
21
 
22
22
 
23
- ## Usage
23
+ ## Usage (API)
24
24
 
25
25
  ```ruby
26
26
  require 'akero'
@@ -40,15 +40,17 @@ signed_msg = alice.sign("Hello world!")
40
40
  # Alice's fingerprint and public key from it
41
41
  msg = bob.receive(signed_msg)
42
42
  msg.body # => "Hello world!"
43
+ msg.type # => :signed
43
44
  msg.from # => "AK:12:34:56:..."
44
45
  msg.from_pk # => "(alice-public-key)"
45
46
 
46
47
  # Bob encrypts a message for Alice
47
48
  bobs_msg = bob.encrypt(msg.from_pk, "Hello Alice!")
48
-
49
+
49
50
  # Alice can receive it...
50
51
  msg = alice.receive(bobs_msg)
51
52
  msg.body # => "Hello Alice!"
53
+ msg.type # => :encrypted
52
54
  msg.from # => "AK:ab:cd:ef:..."
53
55
  msg.from_pk # => "(bob-public-key)"
54
56
 
@@ -68,20 +70,36 @@ new_alice = Akero.load(File.read('/tmp/alice.akr'))
68
70
  # In production Alice disables the armoring
69
71
  # for better performance.
70
72
  signed_msg = alice.sign("Hello world!", false)
71
- msg = alice.encrypt(alice.public_key, "Hello!", false)
72
- puts alice.receive(msg).body # => "Hello!"
73
+ encrypted_msg = alice.encrypt(alice.public_key, "Hello!", false)
74
+ puts alice.receive(encrypted_msg).body # => "Hello!"
75
+ ```
76
+
77
+ ## Usage (CLI)
78
+
79
+ ```bash
80
+ $ akero id -i /tmp/alice.akr
81
+ Private key not found. Generating a new 4096 bits RSA key and saving to /tmp/alice.akr ...
82
+ AK:8B:33:5B:AB:4C:78:CA:5E:CC:F5:FE:D7:75:F2:A4:74:16:28:FB:C2
83
+
84
+ $ akero id -i /tmp/bob.akr
85
+ Private key not found. Generating a new 4096 bits RSA key and saving to /tmp/bob.akr ...
86
+ AK:CF:B3:4C:BA:7C:9C:2E:31:2D:0D:1D:3F:F9:F4:05:F6:C7:B2:38:3F
87
+
88
+ $ akero pk -i /tmp/bob.akr >/tmp/bob.pk
73
89
 
90
+ $ echo "Hello" | akero encrypt -i /tmp/alice.akr /tmp/bob.pk | akero receive -i /tmp/bob.akr
91
+ Hello
74
92
  ```
75
93
 
76
94
  ## Documentation
77
95
 
78
- * [API Docs](http://rubydoc.info/gems/akero/Akero)
96
+ * [API Docs](http://busyloop.github.com/akero/doc/frames.html)
79
97
  * [Spec](https://github.com/busyloop/akero/blob/master/spec/akero_spec.rb)
80
98
 
81
99
  ## Benchmarks
82
100
 
83
- ![Throughput](http://github.com/busyloop/akero/raw/master/benchmark/bm_rate.png)
84
- ![Message size](http://github.com/busyloop/akero/raw/master/benchmark/bm_size.png)
101
+ ![Throughput](https://github.com/busyloop/akero/raw/master/benchmark/bm_rate.png?raw=true)
102
+ ![Message size](https://github.com/busyloop/akero/raw/master/benchmark/bm_size.png?raw=true)
85
103
 
86
104
  The above charts were generated using MRI 1.9.3p362 (x86_64-linux) on an [AMD Turion II Neo N40L](http://www.cpubenchmark.net/cpu.php?cpu=AMD+Turion+II+Neo+N40L+Dual-Core) CPU.
87
105
  You may run the benchmarks on your own machine with `rake benchmark`.
data/Rakefile CHANGED
@@ -1,29 +1,20 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
2
3
 
3
4
  require 'rspec/core/rake_task'
4
5
 
5
- task :default => :test
6
+ task default: :test
6
7
 
7
- RSpec::Core::RakeTask.new("test:spec") do |t|
8
- t.pattern = 'spec/**/*_spec.rb'
9
- t.rspec_opts = '--fail-fast -b -c -f documentation --tag ~benchmark'
8
+ RSpec::Core::RakeTask.new('test:spec') do |t|
9
+ t.pattern = 'spec/**/*_spec.rb'
10
+ t.rspec_opts = '--fail-fast -b -c -f documentation --tag ~benchmark'
10
11
  end
11
12
 
12
13
  desc 'Run test suite'
13
- task :test => [ 'test:spec' ]
14
+ task test: ['test:spec']
14
15
 
15
- desc "Run benchmark suite"
16
+ desc 'Run benchmark suite'
16
17
  task :benchmark do
17
18
  require 'akero/benchmark'
18
19
  Akero::Benchmark.run!
19
20
  end
20
-
21
- namespace :docs do
22
- task :push do
23
- `bl_www_sync akero coverage`
24
- end
25
-
26
- task :loc do
27
- puts `grep -v '^\\s*#' lib/akero.rb | grep -v '^$' | wc -l`
28
- end
29
- end
data/akero.gemspec CHANGED
@@ -1,29 +1,36 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'akero/version'
5
6
 
6
7
  Gem::Specification.new do |gem|
7
- gem.name = "akero"
8
+ gem.name = 'akero'
8
9
  gem.version = Akero::VERSION
9
- gem.authors = ["Moe"]
10
- gem.email = ["moe@busyloop.net"]
11
- gem.description = %q{Easy peer-to-peer public key cryptography}
12
- gem.summary = %q{Easy peer-to-peer public key cryptography}
13
- gem.homepage = "https://github.com/busyloop/akero"
10
+ gem.authors = ['Moe']
11
+ gem.email = ['moe@busyloop.net']
12
+ gem.description = 'Easy peer-to-peer public key cryptography'
13
+ gem.summary = 'Easy peer-to-peer public key cryptography'
14
+ gem.homepage = 'https://github.com/busyloop/akero'
14
15
 
15
- gem.files = `git ls-files`.split($/)
16
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
17
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
- gem.require_paths = ["lib"]
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.required_ruby_version = '>= 2.3.1'
22
+
23
+ gem.add_dependency 'optix'
19
24
 
20
25
  gem.add_development_dependency 'rb-inotify'
21
26
  gem.add_development_dependency 'guard'
22
27
  gem.add_development_dependency 'guard-rspec'
23
28
  gem.add_development_dependency 'rake'
24
29
  gem.add_development_dependency 'simplecov'
25
- gem.add_development_dependency 'rspec'
30
+ gem.add_development_dependency 'rspec', '= 2.12.0'
26
31
  gem.add_development_dependency 'b'
27
32
  gem.add_development_dependency 'gnuplot'
28
33
  gem.add_development_dependency 'yard'
34
+ gem.add_development_dependency 'bump'
35
+ gem.add_development_dependency 'rubocop'
29
36
  end
data/bin/akero ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'akero/cli'
5
+
6
+ Optix.invoke!
@@ -0,0 +1,5 @@
1
+ {
2
+ "result": {
3
+ "covered_percent": 100.0
4
+ }
5
+ }
@@ -0,0 +1,367 @@
1
+ {
2
+ "RSpec": {
3
+ "coverage": {
4
+ "/Users/moe/code/akero/lib/akero.rb": [
5
+ null,
6
+ null,
7
+ null,
8
+ null,
9
+ null,
10
+ null,
11
+ null,
12
+ null,
13
+ null,
14
+ null,
15
+ null,
16
+ null,
17
+ null,
18
+ null,
19
+ null,
20
+ null,
21
+ null,
22
+ null,
23
+ null,
24
+ null,
25
+ null,
26
+ null,
27
+ null,
28
+ null,
29
+ 1,
30
+ null,
31
+ 1,
32
+ 1,
33
+ null,
34
+ null,
35
+ null,
36
+ null,
37
+ null,
38
+ null,
39
+ 1,
40
+ null,
41
+ 1,
42
+ null,
43
+ 1,
44
+ null,
45
+ 1,
46
+ null,
47
+ null,
48
+ 1,
49
+ 9,
50
+ 9,
51
+ 9,
52
+ null,
53
+ null,
54
+ null,
55
+ 1,
56
+ 1,
57
+ null,
58
+ null,
59
+ null,
60
+ null,
61
+ 1,
62
+ 3,
63
+ null,
64
+ null,
65
+ null,
66
+ null,
67
+ 1,
68
+ 2,
69
+ null,
70
+ null,
71
+ null,
72
+ null,
73
+ null,
74
+ 1,
75
+ 1,
76
+ 1,
77
+ 1,
78
+ 1,
79
+ 1,
80
+ 1,
81
+ 1,
82
+ 1,
83
+ 1,
84
+ 1,
85
+ null,
86
+ 1,
87
+ 1,
88
+ 1,
89
+ 1,
90
+ 1,
91
+ null,
92
+ 1,
93
+ 1,
94
+ null,
95
+ null,
96
+ null,
97
+ null,
98
+ 1,
99
+ 19,
100
+ null,
101
+ null,
102
+ null,
103
+ null,
104
+ null,
105
+ null,
106
+ null,
107
+ null,
108
+ null,
109
+ null,
110
+ null,
111
+ null,
112
+ null,
113
+ null,
114
+ null,
115
+ null,
116
+ 1,
117
+ 60,
118
+ null,
119
+ null,
120
+ null,
121
+ null,
122
+ null,
123
+ null,
124
+ null,
125
+ null,
126
+ null,
127
+ 1,
128
+ 2,
129
+ 2,
130
+ 1,
131
+ null,
132
+ 1,
133
+ 1,
134
+ 1,
135
+ 1,
136
+ 1,
137
+ null,
138
+ null,
139
+ null,
140
+ null,
141
+ null,
142
+ null,
143
+ null,
144
+ null,
145
+ 1,
146
+ 27,
147
+ null,
148
+ null,
149
+ null,
150
+ null,
151
+ null,
152
+ null,
153
+ null,
154
+ null,
155
+ null,
156
+ null,
157
+ null,
158
+ null,
159
+ null,
160
+ 1,
161
+ null,
162
+ null,
163
+ 4,
164
+ 4,
165
+ 4,
166
+ 4,
167
+ 4,
168
+ 4,
169
+ null,
170
+ null,
171
+ null,
172
+ null,
173
+ null,
174
+ null,
175
+ null,
176
+ 1,
177
+ 6,
178
+ 6,
179
+ null,
180
+ null,
181
+ null,
182
+ null,
183
+ null,
184
+ null,
185
+ null,
186
+ null,
187
+ null,
188
+ null,
189
+ null,
190
+ null,
191
+ null,
192
+ null,
193
+ null,
194
+ null,
195
+ null,
196
+ null,
197
+ null,
198
+ null,
199
+ null,
200
+ null,
201
+ 1,
202
+ 13,
203
+ 13,
204
+ 23,
205
+ null,
206
+ 21,
207
+ 21,
208
+ null,
209
+ 2,
210
+ null,
211
+ null,
212
+ 2,
213
+ null,
214
+ null,
215
+ 9,
216
+ 7,
217
+ null,
218
+ null,
219
+ null,
220
+ null,
221
+ null,
222
+ null,
223
+ 1,
224
+ 19,
225
+ 11,
226
+ null,
227
+ 19,
228
+ 19,
229
+ null,
230
+ 2,
231
+ null,
232
+ null,
233
+ 15,
234
+ null,
235
+ null,
236
+ 5,
237
+ null,
238
+ null,
239
+ 8,
240
+ 6,
241
+ 4,
242
+ 4,
243
+ null,
244
+ 2,
245
+ null,
246
+ null,
247
+ null,
248
+ 1,
249
+ 3,
250
+ null,
251
+ null,
252
+ null,
253
+ 1,
254
+ 1,
255
+ null,
256
+ null,
257
+ null,
258
+ 2,
259
+ null,
260
+ null,
261
+ null,
262
+ null,
263
+ null,
264
+ null,
265
+ null,
266
+ null,
267
+ null,
268
+ 1,
269
+ 74,
270
+ 74,
271
+ null,
272
+ null,
273
+ null,
274
+ null,
275
+ null,
276
+ 1,
277
+ 23,
278
+ 44,
279
+ null,
280
+ 1,
281
+ null,
282
+ null,
283
+ null,
284
+ 1,
285
+ null,
286
+ 1,
287
+ 8,
288
+ null,
289
+ 2,
290
+ null,
291
+ null,
292
+ 1,
293
+ 9,
294
+ 9,
295
+ null,
296
+ null,
297
+ 1,
298
+ 26,
299
+ 26,
300
+ null,
301
+ 15,
302
+ null,
303
+ 9,
304
+ null,
305
+ 2,
306
+ null,
307
+ 24,
308
+ 24,
309
+ null,
310
+ null,
311
+ 1,
312
+ 26,
313
+ 24,
314
+ null,
315
+ 24,
316
+ 18,
317
+ 2,
318
+ null,
319
+ null,
320
+ 16,
321
+ null,
322
+ null,
323
+ 22,
324
+ 3,
325
+ null,
326
+ null,
327
+ 19,
328
+ null,
329
+ null,
330
+ null,
331
+ null,
332
+ null,
333
+ null,
334
+ null,
335
+ 1,
336
+ 61,
337
+ 61,
338
+ null,
339
+ 61,
340
+ 61,
341
+ 61,
342
+ 61,
343
+ 61,
344
+ 61,
345
+ 61,
346
+ null,
347
+ 61,
348
+ 61,
349
+ null,
350
+ 61,
351
+ 61,
352
+ 61,
353
+ null,
354
+ null,
355
+ null,
356
+ 61,
357
+ null,
358
+ 61,
359
+ 61,
360
+ 61,
361
+ null,
362
+ null
363
+ ]
364
+ },
365
+ "timestamp": 1465614139
366
+ }
367
+ }
File without changes