api_struct 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +14 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +105 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +203 -0
  10. data/Rakefile +6 -0
  11. data/api_struct.gemspec +34 -0
  12. data/api_struct.svg +1 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/circle.yml +3 -0
  16. data/lib/api_struct.rb +19 -0
  17. data/lib/api_struct/client.rb +86 -0
  18. data/lib/api_struct/collection.rb +19 -0
  19. data/lib/api_struct/concerns/underscore.rb +11 -0
  20. data/lib/api_struct/entity.rb +84 -0
  21. data/lib/api_struct/errors/client.rb +41 -0
  22. data/lib/api_struct/errors/entity.rb +7 -0
  23. data/lib/api_struct/extensions/api_client.rb +43 -0
  24. data/lib/api_struct/extensions/dry_monads.rb +18 -0
  25. data/lib/api_struct/settings.rb +7 -0
  26. data/lib/api_struct/version.rb +3 -0
  27. data/spec/api_struct/client_spec.rb +118 -0
  28. data/spec/api_struct/entity_spec.rb +185 -0
  29. data/spec/fixtures/cassettes/posts/1.yml +73 -0
  30. data/spec/fixtures/cassettes/posts/index_success.yml +1335 -0
  31. data/spec/fixtures/cassettes/posts/show_failure.yml +67 -0
  32. data/spec/fixtures/cassettes/posts/show_success.yml +73 -0
  33. data/spec/fixtures/cassettes/posts/suffix.yml +73 -0
  34. data/spec/fixtures/cassettes/posts/update_success.yml +71 -0
  35. data/spec/fixtures/cassettes/todos.yml +143 -0
  36. data/spec/fixtures/cassettes/users/1/posts.yml +1049 -0
  37. data/spec/fixtures/cassettes/users/1/posts/1.yml +797 -0
  38. data/spec/spec_helper.rb +25 -0
  39. data/spec/support/stub.rb +9 -0
  40. metadata +272 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6d1040aa384318bbffeb1b90f19db3f980aa4469
4
+ data.tar.gz: 0d77437b31acf598ead5c8bc7a756c55ea4b837a
5
+ SHA512:
6
+ metadata.gz: 3d9aeaace35a53c521bd81cde6addf3f3c2f1439887165523ba026db7f92434e07c4b8526c99d89dfad738b14fc2f184064e52f2588f8a951a676882c94a5f48
7
+ data.tar.gz: c00a0bdcacbda8c59b95795a67304a8b9697ce6bd31dfaba9628f6aec32f8a979e7a981d926f8e5333ae5438745e9f00f2ec28ffb79b8879cfeb1a3eb4b09449
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ vendor/bundle
13
+ .idea/
14
+ .byebug_history
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+ DisplayStyleGuide: true
4
+ StyleGuideCopsOnly: true
5
+ TargetRubyVersion: 2.4
6
+
7
+ Metrics/LineLength:
8
+ Max: 120
9
+
10
+ Documentation:
11
+ Enabled: false
12
+
13
+ FrozenStringLiteralComment:
14
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.4.1
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in api_struct.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ api_struct (0.1.0)
5
+ dry-configurable (~> 0.7.0)
6
+ dry-monads (~> 0.3.1)
7
+ hashie (~> 3.5, >= 3.5.6)
8
+ http (>= 2.0.3)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.5.2)
14
+ public_suffix (>= 2.0.2, < 4.0)
15
+ ast (2.3.0)
16
+ byebug (9.1.0)
17
+ coderay (1.1.2)
18
+ concurrent-ruby (1.0.5)
19
+ crack (0.4.3)
20
+ safe_yaml (~> 1.0.0)
21
+ diff-lcs (1.3)
22
+ domain_name (0.5.20170404)
23
+ unf (>= 0.0.5, < 1.0.0)
24
+ dry-configurable (0.7.0)
25
+ concurrent-ruby (~> 1.0)
26
+ dry-core (0.4.1)
27
+ concurrent-ruby (~> 1.0)
28
+ dry-equalizer (0.2.0)
29
+ dry-monads (0.3.1)
30
+ dry-core
31
+ dry-equalizer
32
+ ffaker (2.8.0)
33
+ hashdiff (0.3.7)
34
+ hashie (3.5.6)
35
+ http (3.0.0)
36
+ addressable (~> 2.3)
37
+ http-cookie (~> 1.0)
38
+ http-form_data (>= 2.0.0.pre.pre2, < 3)
39
+ http_parser.rb (~> 0.6.0)
40
+ http-cookie (1.0.3)
41
+ domain_name (~> 0.5)
42
+ http-form_data (2.0.0)
43
+ http_parser.rb (0.6.0)
44
+ method_source (0.9.0)
45
+ parallel (1.12.0)
46
+ parser (2.4.0.2)
47
+ ast (~> 2.3)
48
+ powerpack (0.1.1)
49
+ pry (0.11.3)
50
+ coderay (~> 1.1.0)
51
+ method_source (~> 0.9.0)
52
+ pry-byebug (3.5.1)
53
+ byebug (~> 9.1)
54
+ pry (~> 0.10)
55
+ public_suffix (3.0.1)
56
+ rainbow (3.0.0)
57
+ rake (12.3.0)
58
+ rspec (3.7.0)
59
+ rspec-core (~> 3.7.0)
60
+ rspec-expectations (~> 3.7.0)
61
+ rspec-mocks (~> 3.7.0)
62
+ rspec-core (3.7.0)
63
+ rspec-support (~> 3.7.0)
64
+ rspec-expectations (3.7.0)
65
+ diff-lcs (>= 1.2.0, < 2.0)
66
+ rspec-support (~> 3.7.0)
67
+ rspec-mocks (3.7.0)
68
+ diff-lcs (>= 1.2.0, < 2.0)
69
+ rspec-support (~> 3.7.0)
70
+ rspec-support (3.7.0)
71
+ rubocop (0.52.0)
72
+ parallel (~> 1.10)
73
+ parser (>= 2.4.0.2, < 3.0)
74
+ powerpack (~> 0.1)
75
+ rainbow (>= 2.2.2, < 4.0)
76
+ ruby-progressbar (~> 1.7)
77
+ unicode-display_width (~> 1.0, >= 1.0.1)
78
+ ruby-progressbar (1.9.0)
79
+ safe_yaml (1.0.4)
80
+ unf (0.1.4)
81
+ unf_ext
82
+ unf_ext (0.0.7.4)
83
+ unicode-display_width (1.3.0)
84
+ vcr (3.0.3)
85
+ webmock (3.2.1)
86
+ addressable (>= 2.3.6)
87
+ crack (>= 0.3.2)
88
+ hashdiff
89
+
90
+ PLATFORMS
91
+ ruby
92
+
93
+ DEPENDENCIES
94
+ api_struct!
95
+ bundler (~> 1.14)
96
+ ffaker (~> 2.7)
97
+ pry-byebug (~> 3.5, >= 3.5.1)
98
+ rake (~> 12.3)
99
+ rspec (~> 3.7)
100
+ rubocop (~> 0.52.0)
101
+ vcr (~> 3.0.3)
102
+ webmock (~> 3.2, >= 3.2.1)
103
+
104
+ BUNDLED WITH
105
+ 1.16.0
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 bezrukavyi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # <img src='https://github.com/rubygarage/api_struct/blob/master/api_struct.svg' height='60' alt='ApiStruct' />
2
+
3
+ **ApiStruct** consists of two main interfaces: `ApiStruct::Client` and `ApiStruct::Entity`. The `ApiStruct::Client` class is aimed at using the same interface for describing requests to different APIs. The `ApiStruct::Entity` enables you to use *ApiStruct* clients in ORM-like style.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'api_struct'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install api_struct
20
+
21
+ ## Usage
22
+
23
+ Initialize APIs routes:
24
+
25
+ ```ruby
26
+ ApiStruct::Settings.configure do |config|
27
+ config.endpoints = {
28
+ first_api: {
29
+ root: 'http://localhost:3000/api/v1',
30
+ headers: {
31
+ 'content-type': 'application/json',
32
+ 'Authorization': 'Bearer TOKEN'
33
+ }
34
+ },
35
+ second_api: {
36
+ root: 'http://localhost:3001/api/v1',
37
+ # etc...
38
+ }
39
+ }
40
+ end
41
+ ```
42
+
43
+ # Client
44
+ Endpoint wrapper
45
+
46
+ ```ruby
47
+ class PostsClient < ApiStruct::Client
48
+ first_api :posts
49
+
50
+ def show(id)
51
+ get(id)
52
+ end
53
+
54
+ def index
55
+ get
56
+ end
57
+
58
+ def user_posts(user_id, post_id = nil)
59
+ get(post_id, prefix: [:users, user_id])
60
+ # alias:
61
+ # get(post_id, prefix: '/users/:id', id: user_id)
62
+ end
63
+
64
+ def custom_path(user_id)
65
+ get(path: 'users_posts/:user_id', user_id: user_id)
66
+ end
67
+ end
68
+ ```
69
+
70
+ Usage:
71
+ ```ruby
72
+ PostsClient.new.get(1) # -> /posts/1
73
+ ```
74
+ Returns `Either` [monad](https://github.com/dry-rb/dry-monads)
75
+ ```ruby
76
+ # => Right({:id=>1, :title=>"Post"})
77
+ ```
78
+
79
+ Other methods from sample:
80
+ ```ruby
81
+ post_client = PostsClient.new
82
+
83
+ post_client.index # -> /posts
84
+ post_client.user_posts(1) # -> /users/1/posts
85
+ post_client.user_posts(1, 2) # -> /users/1/posts/2
86
+ post_client.custom_path(1) # -> /users_posts/1/
87
+ ```
88
+
89
+
90
+ # Entity
91
+ Response serializer
92
+
93
+ ```ruby
94
+ class User < ApiStruct::Entity
95
+ client_service UsersClient
96
+
97
+ client_service AuthorsClient, prefix: true, only: :index
98
+ # alias:
99
+ # client_service AuthorsClient, prefix: :prefix, except: :index
100
+
101
+ attr_entity :name, :id
102
+ end
103
+ ```
104
+
105
+ ```ruby
106
+ class UsersClient < ApiStruct::Client
107
+ first_api :users
108
+
109
+ def show(id)
110
+ get(id)
111
+ end
112
+ end
113
+ ```
114
+
115
+ ```ruby
116
+ class AuthorsClient < ApiStruct::Client
117
+ first_api :authors
118
+
119
+ def index
120
+ get
121
+ end
122
+ end
123
+ ```
124
+
125
+ Usage:
126
+ ```ruby
127
+ user = User.show(1)
128
+ # => {"id"=>1, "name"=>"John"}
129
+ ```
130
+
131
+ Call methods from prefixed clients:
132
+ ```ruby
133
+ users = User.authors_client_index
134
+ # or
135
+ # users = User.prefix_index
136
+ ```
137
+
138
+ Response serializers with related entities:
139
+ ```ruby
140
+ class Network < ApiStruct::Entity
141
+ client_service NetworkClient
142
+
143
+ attr_entity :name, :id
144
+ attr_entity :state, &:to_sym
145
+
146
+ has_entity :super_admin, as: User
147
+ end
148
+ ```
149
+
150
+ ```ruby
151
+ class NetworkClient < ApiStruct::Client
152
+ first_api :networks
153
+
154
+ def show(id)
155
+ get(id)
156
+ end
157
+ end
158
+ ```
159
+
160
+ Usage:
161
+ ```ruby
162
+ network = Network.show(1)
163
+ # => {"id"=>1, "name"=>"Main network", "state"=>"active", "super_admin"=>{"id"=>1, "name"=>"John"}}
164
+
165
+ network.state
166
+ # => :active
167
+ ```
168
+
169
+ ## Dynamic headers:
170
+
171
+ ```ruby
172
+ class Auth
173
+ def self.call
174
+ # Get a token..
175
+ end
176
+ end
177
+ ```
178
+
179
+ ```ruby
180
+ class AuthHeaderValue
181
+ def self.call
182
+ { "Authorization": "Bearer #{Auth.call}" }
183
+ end
184
+ end
185
+ ```
186
+
187
+ ```ruby
188
+ class PostClient < ApiStruct::Client
189
+ first_api :posts
190
+
191
+ def update(id, post_data)
192
+ put(id, json: post_data, headers: AuthHeaderValue.call)
193
+ end
194
+ end
195
+ ```
196
+
197
+ ## Contributing
198
+
199
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rubygarage/api_struct.
200
+
201
+ ## License
202
+
203
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'api_struct/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'api_struct'
7
+ spec.version = ApiStruct::VERSION
8
+ spec.authors = %w[bezrukavyi andy1341 kirillshevch]
9
+ spec.email = ['yaroslav.bezrukavyi@gmail.com', 'andrii.novikov1341@gmail.com', 'kirills167@gmail.com']
10
+
11
+ spec.summary = 'API wrapper builder with response serialization'
12
+ spec.description = spec.description
13
+ spec.homepage = 'https://github.com/rubygarage/api_struct'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'dry-monads', '~> 0.3.1'
22
+ spec.add_dependency 'dry-configurable', '~> 0.7.0'
23
+ spec.add_dependency 'http', '>= 2.0.3'
24
+ spec.add_dependency 'hashie', '~> 3.5', '>= 3.5.6'
25
+
26
+ spec.add_development_dependency 'bundler', '~> 1.14'
27
+ spec.add_development_dependency 'pry-byebug', '~> 3.5', '>= 3.5.1'
28
+ spec.add_development_dependency 'rake', '~> 12.3'
29
+ spec.add_development_dependency 'rspec', '~> 3.7'
30
+ spec.add_development_dependency 'rubocop', '~> 0.52.0'
31
+ spec.add_development_dependency 'vcr', '~> 3.0.3'
32
+ spec.add_development_dependency 'webmock', '~> 3.2', '>= 3.2.1'
33
+ spec.add_development_dependency 'ffaker', '~> 2.7'
34
+ end
data/api_struct.svg ADDED
@@ -0,0 +1 @@
1
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 569.14 106.18"><defs><style>.cls-1{fill:#ef43cf;}.cls-2{fill:#ee43cf;}.cls-3{fill:#ed43d0;}.cls-4{fill:#ec43d0;}.cls-5{fill:#eb44d0;}.cls-6{fill:#ea44d0;}.cls-7{fill:#e944d1;}.cls-8{fill:#e844d1;}.cls-9{fill:#e744d1;}.cls-10{fill:#e644d1;}.cls-11{fill:#e544d2;}.cls-12{fill:#e445d2;}.cls-13{fill:#e345d2;}.cls-14{fill:#e245d3;}.cls-15{fill:#e145d3;}.cls-16{fill:#e045d3;}.cls-17{fill:#df45d3;}.cls-18{fill:#de45d4;}.cls-19{fill:#dd46d4;}.cls-20{fill:#dc46d4;}.cls-21{fill:#db46d4;}.cls-22{fill:#da46d5;}.cls-23{fill:#d946d5;}.cls-24{fill:#d846d5;}.cls-25{fill:#d746d6;}.cls-26{fill:#d647d6;}.cls-27{fill:#d547d6;}.cls-28{fill:#d447d6;}.cls-29{fill:#d347d7;}.cls-30{fill:#d247d7;}.cls-31{fill:#d147d7;}.cls-32{fill:#d047d7;}.cls-33{fill:#cf48d8;}.cls-34{fill:#ce48d8;}.cls-35{fill:#cd48d8;}.cls-36{fill:#cc48d8;}.cls-37{fill:#cb48d9;}.cls-38{fill:#ca48d9;}.cls-39{fill:#c948d9;}.cls-40{fill:#c849da;}.cls-41{fill:#c749da;}.cls-42{fill:#c649da;}.cls-43{fill:#c549da;}.cls-44{fill:#c449db;}.cls-45{fill:#c349db;}.cls-46{fill:#c249db;}.cls-47{fill:#c14adb;}.cls-48{fill:#c04adc;}.cls-49{fill:#bf4adc;}.cls-50{fill:#be4adc;}.cls-51{fill:#bd4add;}.cls-52{fill:#bc4add;}.cls-53{fill:#bb4add;}.cls-54{fill:#ba4bdd;}.cls-55{fill:#b94bde;}.cls-56{fill:#b84bde;}.cls-57{fill:#b74bde;}.cls-58{fill:#b64bde;}.cls-59{fill:#b54bdf;}.cls-60{fill:#b44cdf;}.cls-61{fill:#b34ce0;}.cls-62{fill:#b24ce0;}.cls-63{fill:#b14ce0;}.cls-64{fill:#b04ce0;}.cls-65{fill:#af4ce1;}.cls-66{fill:#ae4de1;}.cls-67{fill:#ad4de1;}.cls-68{fill:#ac4de1;}.cls-69{fill:#ab4de2;}.cls-70{fill:#aa4de2;}.cls-71{fill:#a94de2;}.cls-72{fill:#a84de3;}.cls-73{fill:#a74ee3;}.cls-74{fill:#a64ee3;}.cls-75{fill:#a54ee3;}.cls-76{fill:#a44ee4;}.cls-77{fill:#a34ee4;}.cls-78{fill:#a24ee4;}.cls-79{fill:#a14ee4;}.cls-80{fill:#a04fe5;}.cls-81{fill:#9f4fe5;}.cls-82{fill:#9e4fe5;}.cls-83{fill:#9d4fe6;}.cls-84{fill:#9c4fe6;}.cls-85{fill:#9b4fe6;}.cls-86{fill:#9a4fe6;}.cls-87{fill:#9950e7;}.cls-88{fill:#9850e7;}.cls-89{fill:#9750e7;}.cls-90{fill:#9650e7;}.cls-91{fill:#9550e8;}.cls-92{fill:#9450e8;}.cls-93{fill:#9350e8;}.cls-94{fill:#9251e8;}.cls-95{fill:#9151e9;}.cls-96{fill:#9051e9;}.cls-97{fill:#8f51e9;}.cls-98{fill:#8e51ea;}.cls-99{fill:#8d51ea;}.cls-100{fill:#8c51ea;}.cls-101{fill:#8b52ea;}.cls-102{fill:#8a52eb;}.cls-103{fill:#8952eb;}.cls-104{fill:#8852eb;}.cls-105{fill:#8752eb;}.cls-106{fill:#8652ec;}.cls-107{fill:#8552ec;}.cls-108{fill:#8453ec;}.cls-109{fill:#8353ed;}.cls-110{fill:#8253ed;}.cls-111{fill:#8153ed;}.cls-112{fill:#8053ed;}.cls-113{fill:#7f53ee;}.cls-114{fill:#7e53ee;}.cls-115{fill:#7d54ee;}.cls-116{fill:#7c54ee;}.cls-117{fill:#7b54ef;}.cls-118{fill:#7a54ef;}.cls-119{fill:#7a55ef;}.cls-120{fill:#7956ef;}.cls-121{fill:#7957ef;}.cls-122{fill:#7958ef;}.cls-123{fill:#7859f0;}.cls-124{fill:#785af0;}.cls-125{fill:#785bf0;}.cls-126{fill:#775cf0;}.cls-127{fill:#775df0;}.cls-128{fill:#775ef0;}.cls-129{fill:#765ff0;}.cls-130{fill:#7660f0;}.cls-131{fill:#7661f0;}.cls-132{fill:#7562f0;}.cls-133{fill:#7563f1;}.cls-134{fill:#7564f1;}.cls-135{fill:#7465f1;}.cls-136{fill:#7466f1;}.cls-137{fill:#7467f1;}.cls-138{fill:#7368f1;}.cls-139{fill:#7369f1;}.cls-140{fill:#736af1;}.cls-141{fill:#726bf1;}.cls-142{fill:#726cf1;}.cls-143{fill:#726df2;}.cls-144{fill:#716ef2;}.cls-145{fill:#716ff2;}.cls-146{fill:#7170f2;}.cls-147{fill:#7071f2;}.cls-148{fill:#7072f2;}.cls-149{fill:#7073f2;}.cls-150{fill:#6f74f2;}.cls-151{fill:#6f75f2;}.cls-152{fill:#6f76f2;}.cls-153{fill:#6e77f3;}.cls-154{fill:#6e78f3;}.cls-155{fill:#6e79f3;}.cls-156{fill:#6d7af3;}.cls-157{fill:#6d7bf3;}.cls-158{fill:#6d7cf3;}.cls-159{fill:#6c7df3;}.cls-160{fill:#6c7ef3;}.cls-161{fill:#6c7ff3;}.cls-162{fill:#6b80f3;}.cls-163{fill:#6b81f4;}.cls-164{fill:#6b82f4;}.cls-165{fill:#6a83f4;}.cls-166{fill:#6a84f4;}.cls-167{fill:#6a85f4;}.cls-168{fill:#6986f4;}.cls-169{fill:#6987f4;}.cls-170{fill:#6988f4;}.cls-171{fill:#6889f4;}.cls-172{fill:#688af4;}.cls-173{fill:#688bf5;}.cls-174{fill:#678cf5;}.cls-175{fill:#678df5;}.cls-176{fill:#678ef5;}.cls-177{fill:#668ff5;}.cls-178{fill:#6690f5;}.cls-179{fill:#6691f5;}.cls-180{fill:#6592f5;}.cls-181{fill:#6593f5;}.cls-182{fill:#6594f5;}.cls-183{fill:#6495f6;}.cls-184{fill:#6496f6;}.cls-185{fill:#6497f6;}.cls-186{fill:#6398f6;}.cls-187{fill:#6399f6;}.cls-188{fill:#639af6;}.cls-189{fill:#629bf6;}.cls-190{fill:#629cf6;}.cls-191{fill:#629df6;}.cls-192{fill:#619ef6;}.cls-193{fill:#619ff7;}.cls-194{fill:#61a0f7;}.cls-195{fill:#60a1f7;}.cls-196{fill:#60a2f7;}.cls-197{fill:#60a3f7;}.cls-198{fill:#5fa4f7;}.cls-199{fill:#5fa5f7;}.cls-200{fill:#5ea6f7;}.cls-201{fill:#5ea7f7;}.cls-202{fill:#5ea8f8;}.cls-203{fill:#5da9f8;}.cls-204{fill:#5daaf8;}.cls-205{fill:#5dabf8;}.cls-206{fill:#5cacf8;}.cls-207{fill:#5cadf8;}.cls-208{fill:#5caef8;}.cls-209{fill:#5baff8;}.cls-210{fill:#5bb0f8;}.cls-211{fill:#5bb1f8;}.cls-212{fill:#5ab2f9;}.cls-213{fill:#5ab3f9;}.cls-214{fill:#5ab4f9;}.cls-215{fill:#59b5f9;}.cls-216{fill:#59b6f9;}.cls-217{fill:#59b7f9;}.cls-218{fill:#58b8f9;}.cls-219{fill:#58b9f9;}.cls-220{fill:#58baf9;}.cls-221{fill:#57bbf9;}.cls-222{fill:#57bcfa;}.cls-223{fill:#57bdfa;}.cls-224{fill:#56befa;}.cls-225{fill:#56bffa;}.cls-226{fill:#56c0fa;}.cls-227{fill:#55c1fa;}.cls-228{fill:#55c2fa;}.cls-229{fill:#55c3fa;}.cls-230{fill:#54c4fa;}.cls-231{fill:#54c5fa;}.cls-232{fill:#54c6fb;}.cls-233{fill:#53c7fb;}.cls-234{fill:#53c8fb;}.cls-235{fill:#53c9fb;}.cls-236{fill:#52cafb;}.cls-237{fill:#52cbfb;}.cls-238{fill:#52ccfb;}.cls-239{fill:#51cdfb;}.cls-240{fill:#51cefb;}.cls-241{fill:#51cffb;}.cls-242{fill:#50d0fc;}.cls-243{fill:#50d1fc;}.cls-244{fill:#50d2fc;}.cls-245{fill:#4fd3fc;}.cls-246{fill:#4fd4fc;}.cls-247{fill:#4fd5fc;}.cls-248{fill:#4ed6fc;}.cls-249{fill:#4ed7fc;}.cls-250{fill:#4ed8fc;}.cls-251{fill:#4dd9fc;}.cls-252{fill:#4ddafd;}.cls-253{fill:#4ddbfd;}.cls-254{fill:#4cdcfd;}.cls-255{fill:#4cddfd;}.cls-256{fill:#4cdefd;}.cls-257{fill:#4bdffd;}.cls-258{fill:#4be0fd;}.cls-259{fill:#4be1fd;}.cls-260{fill:#4ae2fd;}.cls-261{fill:#4ae3fd;}.cls-262{fill:#4ae4fe;}.cls-263{fill:#49e5fe;}.cls-264{fill:#49e6fe;}.cls-265{fill:#49e7fe;}.cls-266{fill:#48e8fe;}.cls-267{fill:#48e9fe;}.cls-268{fill:#48eafe;}.cls-269{fill:#47ebfe;}.cls-270{fill:#47ecfe;}.cls-271{fill:#47edfe;}.cls-272{fill:#46eeff;}.cls-273{fill:#46efff;}.cls-274{fill:#46f0ff;}.cls-275{fill:#45f1ff;}.cls-276{fill:#45f2ff;}.cls-277{fill:#1b1466;}.cls-278{opacity:0.32;}.cls-279{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="10.31" y1="61.29" x2="67.08" y2="61.29" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#fff" stop-opacity="0"/><stop offset="1" stop-color="#45f2ff"/></linearGradient></defs><title>Artboard 3</title><rect class="cls-1" x="0.99" y="52.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-2" x="1.26" y="51.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-3" x="1.53" y="51.3" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-4" x="1.8" y="50.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-5" x="2.07" y="50.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-6" x="2.34" y="50" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-7" x="2.61" y="49.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-8" x="2.88" y="49.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-9" x="3.15" y="48.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-10" x="3.42" y="48.27" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-11" x="3.69" y="47.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-12" x="3.96" y="47.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-13" x="4.23" y="46.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-14" x="4.5" y="46.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-15" x="4.77" y="46.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-16" x="5.04" y="45.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-17" x="5.31" y="45.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-18" x="5.58" y="44.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-19" x="5.85" y="44.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-20" x="6.12" y="43.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-21" x="6.39" y="43.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-22" x="6.66" y="43.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-23" x="6.93" y="42.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-24" x="7.2" y="42.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-25" x="7.47" y="41.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-26" x="7.74" y="41.36" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-27" x="8.01" y="40.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-28" x="8.28" y="40.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-29" x="8.55" y="40.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-30" x="8.82" y="39.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-31" x="9.09" y="39.2" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-32" x="9.36" y="38.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-33" x="9.63" y="38.33" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-34" x="9.9" y="37.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-35" x="10.17" y="37.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-36" x="10.44" y="37.04" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-37" x="10.71" y="36.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-38" x="10.98" y="36.17" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-39" x="11.25" y="35.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-40" x="11.52" y="35.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-41" x="11.79" y="34.88" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-42" x="12.06" y="34.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-43" x="12.33" y="34.01" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-44" x="12.6" y="33.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-45" x="12.87" y="33.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-46" x="13.14" y="32.72" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-47" x="13.41" y="32.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-48" x="13.68" y="31.85" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-49" x="13.95" y="31.42" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-50" x="14.22" y="30.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-51" x="14.49" y="30.56" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-52" x="14.76" y="30.13" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-53" x="15.03" y="29.69" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-54" x="15.31" y="29.26" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-55" x="15.58" y="28.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-56" x="15.85" y="28.4" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-57" x="16.12" y="27.97" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-58" x="16.39" y="27.53" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-59" x="16.66" y="27.1" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-59" x="16.93" y="26.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-60" x="17.2" y="26.24" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-61" x="17.47" y="25.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-62" x="17.74" y="25.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-63" x="18.01" y="24.94" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-64" x="18.28" y="24.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-65" x="18.55" y="24.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-66" x="18.82" y="23.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-67" x="19.09" y="23.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-68" x="19.36" y="22.78" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-69" x="19.63" y="22.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-70" x="19.9" y="21.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-71" x="20.17" y="21.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-72" x="20.44" y="21.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-73" x="20.71" y="20.62" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-74" x="20.98" y="20.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-75" x="21.25" y="19.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-76" x="21.52" y="19.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-77" x="21.79" y="18.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-78" x="22.06" y="18.46" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-79" x="22.33" y="18.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-80" x="22.6" y="17.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-81" x="22.87" y="17.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-82" x="23.14" y="16.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-83" x="23.41" y="16.3" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-84" x="23.68" y="15.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-85" x="23.95" y="15.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-86" x="24.22" y="15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-87" x="24.49" y="14.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-88" x="24.76" y="14.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-89" x="25.03" y="13.71" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-90" x="25.3" y="13.27" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-91" x="25.57" y="12.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-92" x="25.84" y="12.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-93" x="26.11" y="11.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-94" x="26.38" y="11.55" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-95" x="26.65" y="11.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-96" x="26.92" y="10.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-97" x="27.19" y="10.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-98" x="27.46" y="9.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-99" x="27.73" y="9.39" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-100" x="28" y="8.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-101" x="28.27" y="8.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-102" x="28.54" y="8.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-103" x="28.81" y="7.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-104" x="29.08" y="7.23" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-105" x="29.35" y="6.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-106" x="29.62" y="6.36" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-107" x="29.89" y="5.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-108" x="30.16" y="5.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-109" x="30.43" y="5.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-110" x="30.7" y="4.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-111" x="30.97" y="4.2" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-112" x="31.25" y="3.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-113" x="31.52" y="3.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-114" x="31.79" y="2.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-115" x="32.06" y="2.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-116" x="32.33" y="2.04" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-117" x="32.6" y="1.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-118" x="32.87" y="1.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-119" x="33.07" y="1.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-120" x="33.27" y="1.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-121" x="33.47" y="2.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-122" x="33.67" y="2.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-123" x="33.87" y="2.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-124" x="34.08" y="3.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-125" x="34.28" y="3.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-126" x="34.48" y="3.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-127" x="34.68" y="4.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-128" x="34.88" y="4.4" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-129" x="35.09" y="4.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-130" x="35.29" y="5.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-131" x="35.49" y="5.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-132" x="35.69" y="5.69" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-133" x="35.89" y="6.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-134" x="36.09" y="6.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-135" x="36.3" y="6.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-136" x="36.5" y="6.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-137" x="36.7" y="7.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-138" x="36.9" y="7.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-139" x="37.1" y="7.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-140" x="37.31" y="8.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-141" x="37.51" y="8.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-142" x="37.71" y="8.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-143" x="37.91" y="9.24" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-144" x="38.11" y="9.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-145" x="38.31" y="9.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-146" x="38.52" y="10.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-147" x="38.72" y="10.53" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-148" x="38.92" y="10.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-149" x="39.12" y="11.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-150" x="39.32" y="11.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-151" x="39.52" y="11.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-152" x="39.73" y="12.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-153" x="39.93" y="12.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-154" x="40.13" y="12.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-155" x="40.33" y="13.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-156" x="40.53" y="13.44" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-157" x="40.74" y="13.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-158" x="40.94" y="14.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-159" x="41.14" y="14.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-160" x="41.34" y="14.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-161" x="41.54" y="15.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-162" x="41.74" y="15.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-163" x="41.95" y="15.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-164" x="42.15" y="16.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-165" x="42.35" y="16.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-166" x="42.55" y="16.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-167" x="42.75" y="16.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-168" x="42.95" y="17.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-169" x="43.16" y="17.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-170" x="43.36" y="17.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-171" x="43.56" y="18.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-172" x="43.76" y="18.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-173" x="43.96" y="18.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-174" x="44.17" y="19.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-175" x="44.37" y="19.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-176" x="44.57" y="19.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-177" x="44.77" y="20.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-178" x="44.97" y="20.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-179" x="45.17" y="20.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-180" x="45.38" y="21.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-181" x="45.58" y="21.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-182" x="45.78" y="21.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-183" x="45.98" y="22.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-184" x="46.18" y="22.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-185" x="46.38" y="22.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-186" x="46.59" y="23.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-187" x="46.79" y="23.44" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-188" x="46.99" y="23.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-189" x="47.19" y="24.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-190" x="47.39" y="24.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-191" x="47.6" y="24.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-192" x="47.8" y="25.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-193" x="48" y="25.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-194" x="48.2" y="25.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-195" x="48.4" y="26.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-196" x="48.6" y="26.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-197" x="48.81" y="26.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-198" x="49.01" y="26.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-199" x="49.21" y="27.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-200" x="49.41" y="27.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-201" x="49.61" y="27.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-202" x="49.81" y="28.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-203" x="50.02" y="28.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-204" x="50.22" y="28.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-205" x="50.42" y="29.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-206" x="50.62" y="29.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-207" x="50.82" y="29.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-208" x="51.03" y="30.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-209" x="51.23" y="30.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-210" x="51.43" y="30.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-211" x="51.63" y="31.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-212" x="51.83" y="31.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-213" x="52.03" y="31.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-214" x="52.24" y="32.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-215" x="52.44" y="32.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-216" x="52.64" y="32.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-217" x="52.84" y="33.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-218" x="53.04" y="33.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-219" x="53.24" y="33.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-220" x="53.45" y="34.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-221" x="53.65" y="34.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-222" x="53.85" y="34.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-223" x="54.05" y="35.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-224" x="54.25" y="35.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-225" x="54.46" y="35.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-226" x="54.66" y="36.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-227" x="54.86" y="36.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-228" x="55.06" y="36.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-229" x="55.26" y="36.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-230" x="55.46" y="37.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-231" x="55.67" y="37.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-232" x="55.87" y="37.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-233" x="56.07" y="38.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-234" x="56.27" y="38.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-235" x="56.47" y="38.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-236" x="56.68" y="39.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-237" x="56.88" y="39.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-238" x="57.08" y="39.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-239" x="57.28" y="40.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-240" x="57.48" y="40.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-241" x="57.68" y="40.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-242" x="57.89" y="41.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-243" x="58.09" y="41.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-244" x="58.29" y="41.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-245" x="58.49" y="42.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-246" x="58.69" y="42.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-247" x="58.89" y="42.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-248" x="59.1" y="43.13" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-249" x="59.3" y="43.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-250" x="59.5" y="43.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-251" x="59.7" y="44.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-252" x="59.9" y="44.42" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-253" x="60.11" y="44.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-254" x="60.31" y="45.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-255" x="60.51" y="45.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-256" x="60.71" y="45.71" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-257" x="60.91" y="46.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-258" x="61.11" y="46.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-259" x="61.32" y="46.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-260" x="61.52" y="47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-261" x="61.72" y="47.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-262" x="61.92" y="47.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-263" x="62.12" y="47.97" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-264" x="62.32" y="48.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-265" x="62.53" y="48.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-266" x="62.73" y="48.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-267" x="62.93" y="49.26" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-268" x="63.13" y="49.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-269" x="63.33" y="49.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-270" x="63.54" y="50.23" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-271" x="63.74" y="50.55" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-272" x="63.94" y="50.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-273" x="64.14" y="51.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-274" x="64.34" y="51.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-275" x="64.54" y="51.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-276" x="64.75" y="52.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><path class="cls-277" d="M196.43,78.27l-3.31-10H171.75l-3.31,10H153l20.69-59.7h17.63l20.61,59.7Zm-21-21h14.08l-7-21.21Z"/><path class="cls-277" d="M233.56,37.14q4.84-6.7,13.87-6.7a20,20,0,0,1,15.31,6.82Q269,44.1,269,54.69t-6.27,17.38a19.93,19.93,0,0,1-15.19,6.79,16.07,16.07,0,0,1-14-7.46v29.42h-14.5V31h14.5ZM251.12,63.3q3.13-3,3.13-8.61T251.12,46a10.09,10.09,0,0,0-14.42,0c-2.09,2-3.14,4.87-3.14,8.61s1.05,6.61,3.14,8.64a10,10,0,0,0,7.21,3.06A10.13,10.13,0,0,0,251.12,63.3Z"/><path class="cls-277" d="M291.49,25.6A8.48,8.48,0,0,1,277,19.54a8.48,8.48,0,1,1,16.95,0A8.21,8.21,0,0,1,291.49,25.6ZM278.26,78.27V31h14.5V78.27Z"/><path class="cls-277" d="M325.66,29.33a6.75,6.75,0,0,0-4.45,1.45,5.07,5.07,0,0,0-1.73,4.15,6,6,0,0,0,1.61,4.37,10.41,10.41,0,0,0,4.19,2.54c1.73.6,3.65,1.16,5.77,1.7a65.53,65.53,0,0,1,6.31,2,27.58,27.58,0,0,1,5.73,2.84,12.47,12.47,0,0,1,4.2,4.79,16,16,0,0,1,1.61,7.42,16.6,16.6,0,0,1-6.15,12.93c-4.09,3.59-9.5,5.39-16.19,5.39s-12.1-1.61-16.2-4.83-6.15-7.81-6.15-13.74h15.43q.6,7.13,7.29,7.12a6.94,6.94,0,0,0,4.92-1.65,5.49,5.49,0,0,0,1.79-4.2A5.66,5.66,0,0,0,332,57.4a11.2,11.2,0,0,0-4.19-2.54q-2.59-.93-5.77-1.74a59.91,59.91,0,0,1-6.32-2A30.81,30.81,0,0,1,310,48.29a12.05,12.05,0,0,1-4.2-4.75,15.74,15.74,0,0,1-1.61-7.34,16.25,16.25,0,0,1,6.19-13.31q6.19-5,15.81-5t15.57,4.37Q347.71,26.63,348,36H332.2a7.94,7.94,0,0,0-2.09-5A6,6,0,0,0,325.66,29.33Z"/><path class="cls-277" d="M380.44,66h5.18v12.3h-7.38q-8,0-12.34-3.52t-4.37-12.09V43h-4.41V31h4.41V19.41H376V31h9.5V43H376V62.66Q376,66,380.44,66Z"/><path class="cls-277" d="M410,31v8.82q5.08-9.33,13.57-9.33V45.19H420c-3.33,0-5.83.8-7.5,2.38s-2.5,4.35-2.5,8.31V78.27h-14.5V31Z"/><path class="cls-277" d="M463.63,31h14.5V78.27h-14.5v-7q-4.49,7.47-14.33,7.47a17.21,17.21,0,0,1-13.19-5.43q-5-5.43-5-14.76V31h14.42V56.64c0,3,.8,5.42,2.41,7.08a10.11,10.11,0,0,0,13.31,0c1.62-1.66,2.42-4,2.42-7.08Z"/><path class="cls-277" d="M494,72.24q-6.57-6.6-6.58-17.63T494,37q6.57-6.57,17-6.57a24.67,24.67,0,0,1,14.67,4.28,20.35,20.35,0,0,1,8,12.25H517.9a6.88,6.88,0,0,0-6.65-4.23c-3.09,0-5.38,1.08-6.87,3.26a14.89,14.89,0,0,0-2.25,8.61,14.91,14.91,0,0,0,2.25,8.61A7.47,7.47,0,0,0,511,66.48a8.16,8.16,0,0,0,4.24-.93,7.89,7.89,0,0,0,2.71-3.31h15.69a21,21,0,0,1-8.05,12.13A24,24,0,0,1,511,78.86Q500.53,78.86,494,72.24Z"/><path class="cls-277" d="M561.83,66H567v12.3h-7.37q-8,0-12.35-3.52t-4.36-12.09V43h-4.41V31h4.41V19.41h14.5V31h9.5V43h-9.5V62.66Q557.42,66,561.83,66Z"/><g class="cls-278"><path class="cls-279" d="M65.62,88.35,34.74,39.06A6.62,6.62,0,0,0,29.1,36h0a6.61,6.61,0,0,0-5.64,3.14L11.77,57.81l-1.46-.91L22,38.17a8.38,8.38,0,0,1,7.11-4h0a8.34,8.34,0,0,1,7.1,3.93L67.08,87.44Z"/></g></svg>
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'api_struct'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)