rqrcode 2.2.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +44 -8
- data/README.md +24 -17
- data/lib/rqrcode/export/html.rb +23 -38
- data/lib/rqrcode/export/svg.rb +156 -82
- data/lib/rqrcode/qrcode/qrcode.rb +1 -0
- data/lib/rqrcode/version.rb +1 -1
- metadata +55 -28
- data/.github/workflows/ruby.yml +0 -28
- data/.gitignore +0 -13
- data/.rspec +0 -2
- data/Gemfile +0 -4
- data/Gemfile.lock +0 -72
- data/Rakefile +0 -10
- data/_config.yml +0 -1
- data/bin/console +0 -14
- data/images/ansi-screen-shot.png +0 -0
- data/images/github-qrcode.png +0 -0
- data/images/github-qrcode.svg +0 -32
- data/rqrcode.gemspec +0 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eac90f6e8b69031c243aab170efd37d9bfe552a5972dbc6c0dbf9e8d73d0653d
|
|
4
|
+
data.tar.gz: 203c2f454559f54c9d2f0629dd787ca799d668e0944edfbee5cfaffcaa1e1c6c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e437e362fd0f12e9cba38500d5abf29586db767ee8c1983b893747b5664ca57000a92383f3944f278fa4f9bf5b6b7446853bf261d6fb008742f6c0eec9a4c35
|
|
7
|
+
data.tar.gz: 9f3518501241b15821eeb5fddaca92433971415323932c8d63d5c973738f319d148e1a97e4b5a2dd62b68dd55e237e5ff290f3059031f35812385debd8a6f118
|
data/CHANGELOG.md
CHANGED
|
@@ -7,21 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.2.0] - 2025-06-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Comprehensive benchmarking suite in `benchmark/` directory for measuring performance and memory usage across all export formats (SVG, PNG, HTML, ANSI)
|
|
15
|
+
- `benchmark_helper.rb` providing shared utilities for IPS, memory, and stack profiling
|
|
16
|
+
- Rake tasks for running benchmarks individually or all at once
|
|
17
|
+
- `benchmark/README.md` explaining usage, metrics, and interpretation of results
|
|
18
|
+
- `AGENTS.md` as a development guide for AI agents
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **SVG rendering**: Improved by **+130%** (from 184 i/s to 424 i/s) with **71% memory reduction**
|
|
23
|
+
- **HTML rendering**: Now the fastest export format at **1,876 i/s** (rendering-only benchmark)
|
|
24
|
+
- **Memory efficiency**: HTML now uses **6x less memory** than SVG (previously 22x)
|
|
25
|
+
- Updated minimum Ruby version requirement to >= 3.2.0
|
|
26
|
+
- Updated GitHub workflow Ruby matrix to test only supported versions (3.2, 3.3, 3.4, 4.0)
|
|
27
|
+
- Updated `README.md` with benchmark documentation and contribution guidelines
|
|
28
|
+
|
|
29
|
+
## [3.1.1] - 2025-11-25
|
|
30
|
+
|
|
31
|
+
- Update required_ruby_version to support >= rather than ~> ready for Ruby 4
|
|
32
|
+
|
|
33
|
+
## [3.1.0] - 2025-04-28
|
|
34
|
+
|
|
35
|
+
- Added support for `offset_x` and `offset_y` options in the `as_svg` method for independent x and y padding around QR codes [#153]
|
|
36
|
+
|
|
37
|
+
## [3.0.0] - 2025-04-24
|
|
38
|
+
|
|
39
|
+
- Drop support for Ruby <3.0 in order to keep up with dev dependencies.
|
|
40
|
+
- **Breaking Change**: The `rqrcode_core` gem has been updated to version 2.0.0, which includes breaking changes. Please refer to the [rqrcode_core changelog](https://github.com/whomwah/rqrcode_core/blob/main/CHANGELOG.md)
|
|
41
|
+
|
|
10
42
|
## [2.2.0] - 2023-06-17
|
|
11
43
|
|
|
12
44
|
### Changed
|
|
13
45
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
46
|
+
- Allow all ChunkyPNG::Color options to be passed into `fill` and `color` on `as_png` [#135]
|
|
47
|
+
- Add 3.2 to CI [@petergoldstein](https://github.com/petergoldstein) [#133]
|
|
48
|
+
- Development dependency upgrades. Minimum Ruby change [#130]
|
|
49
|
+
- README updates
|
|
18
50
|
|
|
19
51
|
## [2.1.2] - 2022-07-26
|
|
20
52
|
|
|
21
53
|
### Changed
|
|
22
54
|
|
|
23
|
-
|
|
24
|
-
|
|
55
|
+
- Remove setup script as it just calls bundle install [#128]
|
|
56
|
+
- Change inline styles to the fill property to allow for strict CSP style-src directive [#127]
|
|
25
57
|
|
|
26
58
|
## [2.1.1] - 2022-02-11
|
|
27
59
|
|
|
@@ -60,7 +92,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
60
92
|
|
|
61
93
|
### Breaking Change
|
|
62
94
|
|
|
63
|
-
- The dependency `rqrcode_core-1.0.0` has a tiny breaking change to the `to_s` public method. https://github.com/whomwah/rqrcode_core/blob/
|
|
95
|
+
- The dependency `rqrcode_core-1.0.0` has a tiny breaking change to the `to_s` public method. https://github.com/whomwah/rqrcode_core/blob/main/CHANGELOG.md#breaking-changes
|
|
64
96
|
|
|
65
97
|
## [1.2.0] - 2020-12-26
|
|
66
98
|
|
|
@@ -70,7 +102,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
70
102
|
- bump dependencies
|
|
71
103
|
- fix `required_ruby_version` for Ruby 3 support
|
|
72
104
|
|
|
73
|
-
[unreleased]: https://github.com/whomwah/rqrcode/compare/
|
|
105
|
+
[unreleased]: https://github.com/whomwah/rqrcode/compare/v3.2.0...HEAD
|
|
106
|
+
[3.2.0]: https://github.com/whomwah/rqrcode/compare/v3.1.1...v3.2.0
|
|
107
|
+
[3.1.1]: https://github.com/whomwah/rqrcode/compare/v3.1.0...v3.1.1
|
|
108
|
+
[3.1.0]: https://github.com/whomwah/rqrcode/compare/v3.0.0...v3.1.0
|
|
109
|
+
[3.0.0]: https://github.com/whomwah/rqrcode/compare/v2.2.0...v3.0.0
|
|
74
110
|
[2.2.0]: https://github.com/whomwah/rqrcode/compare/v2.1.2...v2.2.0
|
|
75
111
|
[2.1.2]: https://github.com/whomwah/rqrcode/compare/v2.1.1...v2.1.2
|
|
76
112
|
[2.1.1]: https://github.com/whomwah/rqrcode/compare/v2.1.0...v2.1.1
|
data/README.md
CHANGED
|
@@ -3,20 +3,17 @@
|
|
|
3
3
|

|
|
4
4
|
[](https://github.com/testdouble/standard)
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
[RQRCode](https://github.com/whomwah/rqrcode) is a library for creating and rendering QR codes into various formats. It has a simple interface with all the standard QR code options. It was adapted from the Javascript library by Kazuhiko Arase.
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* For `rqrcode` releases `< 2.0.0` please use [this README](https://github.com/whomwah/rqrcode/blob/v1.2.0/README.md)
|
|
12
|
-
* For `rqrcode` releases `< 1.0.0` please use [this README](https://github.com/whomwah/rqrcode/blob/v0.9.0/README.md)
|
|
8
|
+
- QR code is trademarked by Denso Wave inc
|
|
9
|
+
- Minimum Ruby version is `>= 3.2.0`
|
|
13
10
|
|
|
14
11
|
## Installing
|
|
15
12
|
|
|
16
13
|
Add this line to your application's `Gemfile`:
|
|
17
14
|
|
|
18
15
|
```ruby
|
|
19
|
-
gem "rqrcode", "~>
|
|
16
|
+
gem "rqrcode", "~> 3.0"
|
|
20
17
|
```
|
|
21
18
|
|
|
22
19
|
or install manually:
|
|
@@ -70,19 +67,18 @@ Expects a string or array (for multi-segment encoding) to be parsed in, other ar
|
|
|
70
67
|
* :number
|
|
71
68
|
* :alphanumeric
|
|
72
69
|
* :byte_8bit
|
|
73
|
-
* :kanji
|
|
74
70
|
```
|
|
75
71
|
|
|
76
72
|
Example
|
|
77
73
|
|
|
78
74
|
```ruby
|
|
79
|
-
simple_qrcode = RQRCodeCore::QRCode.new("https://kyan.com", size:
|
|
75
|
+
simple_qrcode = RQRCodeCore::QRCode.new("https://kyan.com", size: 2, level: :m, mode: :byte_8bit)
|
|
80
76
|
|
|
81
|
-
segment_qrcode =
|
|
77
|
+
segment_qrcode = RQRCodeCore::QRCode.new([{ data: "foo", mode: :byte_8bit }])
|
|
82
78
|
|
|
83
79
|
multi_qrcode = RQRCodeCore::QRCode.new([
|
|
84
80
|
{ data: 'foo', mode: :byte_8bit },
|
|
85
|
-
{ data: '
|
|
81
|
+
{ data: 'BAR1', mode: :alphanumeric }
|
|
86
82
|
])
|
|
87
83
|
```
|
|
88
84
|
|
|
@@ -99,6 +95,10 @@ Options:
|
|
|
99
95
|
|
|
100
96
|
offset - Padding around the QR Code in pixels
|
|
101
97
|
(default 0)
|
|
98
|
+
offset_x - X Padding around the QR Code in pixels
|
|
99
|
+
(default offset)
|
|
100
|
+
offset_y - Y Padding around the QR Code in pixels
|
|
101
|
+
(default offset)
|
|
102
102
|
fill - Background color e.g "ffffff" or :white or :currentColor
|
|
103
103
|
(default none)
|
|
104
104
|
color - Foreground color e.g "000" or :black or :currentColor
|
|
@@ -118,7 +118,9 @@ viewbox - Replace the `svg.width` and `svg.height` attribute with `svg.v
|
|
|
118
118
|
svg_attributes - A optional hash of custom <svg> attributes. Existing attributes will remain.
|
|
119
119
|
(default {})
|
|
120
120
|
```
|
|
121
|
+
|
|
121
122
|
Example
|
|
123
|
+
|
|
122
124
|
```ruby
|
|
123
125
|
require "rqrcode"
|
|
124
126
|
|
|
@@ -209,7 +211,6 @@ IO.binwrite("/tmp/github-qrcode.png", png.to_s)
|
|
|
209
211
|
|
|
210
212
|

|
|
211
213
|
|
|
212
|
-
|
|
213
214
|
### `as_ansi`
|
|
214
215
|
|
|
215
216
|
The ANSI renderer will produce as a string with ANSI color codes.
|
|
@@ -226,7 +227,9 @@ fill_character - The written character
|
|
|
226
227
|
quiet_zone_size - Padding around the edge
|
|
227
228
|
(default 4)
|
|
228
229
|
```
|
|
230
|
+
|
|
229
231
|
Example
|
|
232
|
+
|
|
230
233
|
```ruby
|
|
231
234
|
require "rqrcode"
|
|
232
235
|
|
|
@@ -272,6 +275,10 @@ $ rake standard # checks
|
|
|
272
275
|
$ rake standard:fix # fixes
|
|
273
276
|
```
|
|
274
277
|
|
|
278
|
+
## Benchmarks
|
|
279
|
+
|
|
280
|
+
RQRCode includes comprehensive performance benchmarks for tracking export format performance over time. See the [benchmark README](benchmark/README.md) for details on running benchmarks, interpreting results, and current performance baselines.
|
|
281
|
+
|
|
275
282
|
## Contributing
|
|
276
283
|
|
|
277
284
|
I am not currently accepting any new renderers as the current `as_png`, `as_svg` and `as_ansi` work for most cases. If you need something different from what's available, the [`rqrcode_core`](https://github.com/whomwah/rqrcode_core) gem gives you access to all the QR Code information you will need so makes it simple to generate your own.
|
|
@@ -280,9 +287,9 @@ The motivation for the above is because the rendering side of this gem takes up
|
|
|
280
287
|
|
|
281
288
|
Any contribution PR's will be greatly accepted. It's important that they are well tested and backwards compatible.
|
|
282
289
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
290
|
+
- Fork the project
|
|
291
|
+
- Send a pull request
|
|
292
|
+
- Don't touch the .gemspec, I'll do that when I release a new version
|
|
286
293
|
|
|
287
294
|
Thanks D.
|
|
288
295
|
|
|
@@ -296,9 +303,9 @@ Oh, and thanks to my bosses at https://kyan.com for giving me time to maintain t
|
|
|
296
303
|
|
|
297
304
|
## Resources
|
|
298
305
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
306
|
+
- wikipedia:: http://en.wikipedia.org/wiki/QR_Code
|
|
307
|
+
- Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
|
|
308
|
+
- kaywa:: http://qrcode.kaywa.com
|
|
302
309
|
|
|
303
310
|
## Copyright
|
|
304
311
|
|
data/lib/rqrcode/export/html.rb
CHANGED
|
@@ -3,49 +3,34 @@
|
|
|
3
3
|
module RQRCode
|
|
4
4
|
module Export
|
|
5
5
|
module HTML
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
14
|
-
def rows
|
|
15
|
-
Rows.new(@qrcode)
|
|
16
|
-
end
|
|
6
|
+
TABLE_OPEN = "<table>"
|
|
7
|
+
TABLE_CLOSE = "</table>"
|
|
8
|
+
TR_OPEN = "<tr>"
|
|
9
|
+
TR_CLOSE = "</tr>"
|
|
10
|
+
TD_BLACK = '<td class="black"></td>'
|
|
11
|
+
TD_WHITE = '<td class="white"></td>'
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def cells
|
|
34
|
-
qr.modules.each_with_index.map { |qr_module, col_index| Cell.new(qr, col_index, row_index) }
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
class Cell < Struct.new(:qr, :col_index, :row_index)
|
|
39
|
-
def as_html
|
|
40
|
-
"<td class=\"#{html_class}\"></td>"
|
|
13
|
+
def as_html
|
|
14
|
+
qr = @qrcode
|
|
15
|
+
module_count = qr.module_count
|
|
16
|
+
|
|
17
|
+
estimated_size = (module_count * module_count * 26) + (module_count * 9) + 15
|
|
18
|
+
result = String.new(capacity: estimated_size)
|
|
19
|
+
|
|
20
|
+
result << TABLE_OPEN
|
|
21
|
+
module_count.times do |row_index|
|
|
22
|
+
result << TR_OPEN
|
|
23
|
+
module_count.times do |col_index|
|
|
24
|
+
result << (qr.checked?(row_index, col_index) ? TD_BLACK : TD_WHITE)
|
|
25
|
+
end
|
|
26
|
+
result << TR_CLOSE
|
|
41
27
|
end
|
|
28
|
+
result << TABLE_CLOSE
|
|
42
29
|
|
|
43
|
-
|
|
44
|
-
qr.checked?(row_index, col_index) ? "black" : "white"
|
|
45
|
-
end
|
|
30
|
+
result
|
|
46
31
|
end
|
|
47
32
|
end
|
|
48
33
|
end
|
|
49
34
|
end
|
|
50
35
|
|
|
51
|
-
RQRCode::QRCode.
|
|
36
|
+
RQRCode::QRCode.include RQRCode::Export::HTML
|
data/lib/rqrcode/export/svg.rb
CHANGED
|
@@ -15,108 +15,171 @@ module RQRCode
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
class Path < BaseOutputSVG
|
|
18
|
-
|
|
18
|
+
# Direction constants for edge representation
|
|
19
|
+
# Edges stored as [start_x, start_y, direction] arrays instead of Struct
|
|
20
|
+
DIR_UP = 0
|
|
21
|
+
DIR_DOWN = 1
|
|
22
|
+
DIR_LEFT = 2
|
|
23
|
+
DIR_RIGHT = 3
|
|
24
|
+
|
|
25
|
+
# Pre-computed end coordinate deltas: [dx, dy] for each direction
|
|
26
|
+
DIR_DELTAS = [
|
|
27
|
+
[0, -1], # UP
|
|
28
|
+
[0, 1], # DOWN
|
|
29
|
+
[-1, 0], # LEFT
|
|
30
|
+
[1, 0] # RIGHT
|
|
31
|
+
].freeze
|
|
32
|
+
|
|
33
|
+
# SVG path commands indexed by direction constant
|
|
34
|
+
DIR_PATH_COMMANDS = ["v-", "v", "h-", "h"].freeze
|
|
35
|
+
|
|
36
|
+
def build(module_size, options = {})
|
|
37
|
+
color = options[:color]
|
|
38
|
+
offset_x = options[:offset_x].to_i
|
|
39
|
+
offset_y = options[:offset_y].to_i
|
|
40
|
+
|
|
19
41
|
modules_array = @qrcode.modules
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
42
|
+
module_count = modules_array.length
|
|
43
|
+
matrix_size = module_count + 1
|
|
44
|
+
|
|
45
|
+
# Edge matrix stores arrays of [x, y, direction] tuples
|
|
46
|
+
edge_matrix = Array.new(matrix_size) { Array.new(matrix_size) }
|
|
47
|
+
edge_count = 0
|
|
48
|
+
|
|
49
|
+
# Process horizontal edges (between vertically adjacent cells)
|
|
50
|
+
(module_count + 1).times do |row_index|
|
|
51
|
+
module_count.times do |col_index|
|
|
52
|
+
above = row_index > 0 && modules_array[row_index - 1][col_index]
|
|
53
|
+
below = row_index < module_count && modules_array[row_index][col_index]
|
|
54
|
+
|
|
55
|
+
if above && !below
|
|
56
|
+
# Edge going left at (col+1, row)
|
|
57
|
+
x = col_index + 1
|
|
58
|
+
y = row_index
|
|
59
|
+
(edge_matrix[y][x] ||= []) << [x, y, DIR_LEFT]
|
|
60
|
+
edge_count += 1
|
|
61
|
+
elsif !above && below
|
|
62
|
+
# Edge going right at (col, row)
|
|
63
|
+
x = col_index
|
|
64
|
+
y = row_index
|
|
65
|
+
(edge_matrix[y][x] ||= []) << [x, y, DIR_RIGHT]
|
|
66
|
+
edge_count += 1
|
|
32
67
|
end
|
|
33
|
-
|
|
34
|
-
(edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
|
|
35
68
|
end
|
|
69
|
+
end
|
|
36
70
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
71
|
+
# Process vertical edges (between horizontally adjacent cells)
|
|
72
|
+
module_count.times do |row_index|
|
|
73
|
+
(module_count + 1).times do |col_index|
|
|
74
|
+
left = col_index > 0 && modules_array[row_index][col_index - 1]
|
|
75
|
+
right = col_index < module_count && modules_array[row_index][col_index]
|
|
76
|
+
|
|
77
|
+
if left && !right
|
|
78
|
+
# Edge going down at (col, row)
|
|
79
|
+
x = col_index
|
|
80
|
+
y = row_index
|
|
81
|
+
(edge_matrix[y][x] ||= []) << [x, y, DIR_DOWN]
|
|
82
|
+
edge_count += 1
|
|
83
|
+
elsif !left && right
|
|
84
|
+
# Edge going up at (col, row+1)
|
|
85
|
+
x = col_index
|
|
86
|
+
y = row_index + 1
|
|
87
|
+
(edge_matrix[y][x] ||= []) << [x, y, DIR_UP]
|
|
88
|
+
edge_count += 1
|
|
42
89
|
end
|
|
43
|
-
|
|
44
|
-
(edge_matrix[edge.start_y][edge.start_x] ||= []) << edge if edge
|
|
45
90
|
end
|
|
46
91
|
end
|
|
47
92
|
|
|
48
|
-
|
|
49
|
-
path = []
|
|
93
|
+
path_parts = []
|
|
50
94
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
edge = next_matrix_cell.first
|
|
55
|
-
|
|
56
|
-
while edge
|
|
57
|
-
edge_loop << edge
|
|
58
|
-
matrix_cell = edge_matrix[edge.start_y][edge.start_x]
|
|
59
|
-
matrix_cell.delete edge
|
|
60
|
-
edge_matrix[edge.start_y][edge.start_x] = nil if matrix_cell.empty?
|
|
61
|
-
edge_count -= 1
|
|
95
|
+
# Track search position to avoid re-scanning from beginning
|
|
96
|
+
search_y = 0
|
|
97
|
+
search_x = 0
|
|
62
98
|
|
|
63
|
-
|
|
64
|
-
|
|
99
|
+
while edge_count > 0
|
|
100
|
+
# Find next non-empty cell, starting from last position
|
|
101
|
+
start_edge = nil
|
|
102
|
+
found_y = search_y
|
|
103
|
+
found_x = search_x
|
|
104
|
+
|
|
105
|
+
# Continue from where we left off
|
|
106
|
+
(search_y...matrix_size).each do |y|
|
|
107
|
+
start_col = (y == search_y) ? search_x : 0
|
|
108
|
+
(start_col...matrix_size).each do |x|
|
|
109
|
+
cell = edge_matrix[y][x]
|
|
110
|
+
next unless cell && !cell.empty?
|
|
111
|
+
|
|
112
|
+
start_edge = cell.first
|
|
113
|
+
found_y = y
|
|
114
|
+
found_x = x
|
|
115
|
+
break
|
|
116
|
+
end
|
|
117
|
+
break if start_edge
|
|
65
118
|
end
|
|
66
119
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
120
|
+
# Update search position for next iteration
|
|
121
|
+
search_y = found_y
|
|
122
|
+
search_x = found_x
|
|
123
|
+
|
|
124
|
+
# Build path string directly without intermediate edge_loop array
|
|
125
|
+
path_str = String.new(capacity: 64)
|
|
126
|
+
path_str << "M" << start_edge[0].to_s << " " << start_edge[1].to_s
|
|
127
|
+
|
|
128
|
+
current_edge = start_edge
|
|
129
|
+
current_dir = nil
|
|
130
|
+
current_count = 0
|
|
131
|
+
|
|
132
|
+
while current_edge
|
|
133
|
+
ex, ey, edir = current_edge
|
|
134
|
+
|
|
135
|
+
# Remove edge from matrix
|
|
136
|
+
cell = edge_matrix[ey][ex]
|
|
137
|
+
cell.delete(current_edge)
|
|
138
|
+
edge_matrix[ey][ex] = nil if cell.empty?
|
|
139
|
+
edge_count -= 1
|
|
140
|
+
|
|
141
|
+
# Accumulate consecutive edges in same direction
|
|
142
|
+
if edir == current_dir
|
|
143
|
+
current_count += 1
|
|
144
|
+
else
|
|
145
|
+
# Flush previous direction
|
|
146
|
+
path_str << DIR_PATH_COMMANDS[current_dir] << current_count.to_s if current_dir
|
|
147
|
+
current_dir = edir
|
|
148
|
+
current_count = 1
|
|
149
|
+
end
|
|
70
150
|
|
|
71
|
-
|
|
72
|
-
|
|
151
|
+
# Find next edge at end coordinates
|
|
152
|
+
delta = DIR_DELTAS[edir]
|
|
153
|
+
next_x = ex + delta[0]
|
|
154
|
+
next_y = ey + delta[1]
|
|
155
|
+
next_cell = edge_matrix[next_y]&.[](next_x)
|
|
156
|
+
current_edge = next_cell&.first
|
|
73
157
|
end
|
|
74
|
-
edge_loop_string << SVG_PATH_COMMANDS[:close]
|
|
75
158
|
|
|
76
|
-
path
|
|
159
|
+
# Don't output the last direction segment - close path instead
|
|
160
|
+
path_str << "z"
|
|
161
|
+
path_parts << path_str
|
|
77
162
|
end
|
|
78
163
|
|
|
79
|
-
|
|
80
|
-
color = "##{color}" unless color.is_a?(Symbol)
|
|
81
|
-
|
|
82
|
-
@result << %{<path d="#{path.join}" fill="#{color}" transform="translate(#{offset},#{offset}) scale(#{module_size})"/>}
|
|
164
|
+
@result << %{<path d="#{path_parts.join}" fill="#{color}" transform="translate(#{offset_x},#{offset_y}) scale(#{module_size})"/>}
|
|
83
165
|
end
|
|
84
166
|
end
|
|
85
167
|
|
|
86
168
|
class Rect < BaseOutputSVG
|
|
87
|
-
def build(module_size,
|
|
88
|
-
#
|
|
89
|
-
color =
|
|
169
|
+
def build(module_size, options = {})
|
|
170
|
+
# Extract values from options
|
|
171
|
+
color = options[:color]
|
|
172
|
+
offset_x = options[:offset_x].to_i
|
|
173
|
+
offset_y = options[:offset_y].to_i
|
|
90
174
|
|
|
91
175
|
@qrcode.modules.each_index do |c|
|
|
92
|
-
tmp = []
|
|
93
176
|
@qrcode.modules.each_index do |r|
|
|
94
|
-
y = c * module_size + offset
|
|
95
|
-
x = r * module_size + offset
|
|
96
|
-
|
|
97
177
|
next unless @qrcode.checked?(c, r)
|
|
98
|
-
tmp << %(<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" fill="#{color}"/>)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
@result << tmp.join
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
178
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
when :left then start_x - 1
|
|
111
|
-
else start_x
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def end_y
|
|
116
|
-
case direction
|
|
117
|
-
when :down then start_y + 1
|
|
118
|
-
when :up then start_y - 1
|
|
119
|
-
else start_y
|
|
179
|
+
x = r * module_size + offset_x
|
|
180
|
+
y = c * module_size + offset_y
|
|
181
|
+
@result << %(<rect width="#{module_size}" height="#{module_size}" x="#{x}" y="#{y}" fill="#{color}"/>)
|
|
182
|
+
end
|
|
120
183
|
end
|
|
121
184
|
end
|
|
122
185
|
end
|
|
@@ -143,6 +206,10 @@ module RQRCode
|
|
|
143
206
|
# Options:
|
|
144
207
|
# offset - Padding around the QR Code in pixels
|
|
145
208
|
# (default 0)
|
|
209
|
+
# offset_x - X Padding around the QR Code in pixels
|
|
210
|
+
# (default offset)
|
|
211
|
+
# offset_y - Y Padding around the QR Code in pixels
|
|
212
|
+
# (default offset)
|
|
146
213
|
# fill - Background color e.g "ffffff"
|
|
147
214
|
# (default none)
|
|
148
215
|
# color - Foreground color e.g "000"
|
|
@@ -164,18 +231,22 @@ module RQRCode
|
|
|
164
231
|
def as_svg(options = {})
|
|
165
232
|
fill = options[:fill]
|
|
166
233
|
use_path = options[:use_path]
|
|
167
|
-
offset = options[:offset].to_i
|
|
234
|
+
offset = options[:offset].to_i
|
|
235
|
+
offset_x = options.key?(:offset_x) ? options[:offset_x].to_i : offset
|
|
236
|
+
offset_y = options.key?(:offset_y) ? options[:offset_y].to_i : offset
|
|
168
237
|
color = options[:color] || "000"
|
|
169
238
|
shape_rendering = options[:shape_rendering] || "crispEdges"
|
|
170
239
|
module_size = options[:module_size] || 11
|
|
171
|
-
standalone = options[:standalone].nil?
|
|
240
|
+
standalone = options[:standalone].nil? || options[:standalone]
|
|
172
241
|
viewbox = options[:viewbox].nil? ? false : options[:viewbox]
|
|
173
242
|
svg_attributes = options[:svg_attributes] || {}
|
|
174
243
|
|
|
175
244
|
# height and width dependent on offset and QR complexity
|
|
176
|
-
|
|
245
|
+
width = (@qrcode.module_count * module_size) + (2 * offset_x)
|
|
246
|
+
height = (@qrcode.module_count * module_size) + (2 * offset_y)
|
|
247
|
+
dimension = [width, height].max
|
|
177
248
|
# use dimensions differently if we are using a viewBox
|
|
178
|
-
dimensions_attr = viewbox ? %(viewBox="0 0 #{
|
|
249
|
+
dimensions_attr = viewbox ? %(viewBox="0 0 #{width} #{height}") : %(width="#{width}" height="#{height}")
|
|
179
250
|
|
|
180
251
|
svg_tag_attributes = (DEFAULT_SVG_ATTRIBUTES + [
|
|
181
252
|
dimensions_attr,
|
|
@@ -186,8 +257,11 @@ module RQRCode
|
|
|
186
257
|
open_tag = %(<svg #{svg_tag_attributes}>)
|
|
187
258
|
close_tag = "</svg>"
|
|
188
259
|
|
|
260
|
+
# Prefix hexadecimal colors unless using a named color (symbol)
|
|
261
|
+
color = "##{color}" unless color.is_a?(Symbol)
|
|
262
|
+
|
|
189
263
|
output_tag = (use_path ? Path : Rect).new(@qrcode)
|
|
190
|
-
output_tag.build(module_size,
|
|
264
|
+
output_tag.build(module_size, offset_x: offset_x, offset_y: offset_y, color: color)
|
|
191
265
|
|
|
192
266
|
if fill
|
|
193
267
|
# Prefix hexadecimal colors unless using a named color (symbol)
|
|
@@ -206,4 +280,4 @@ module RQRCode
|
|
|
206
280
|
end
|
|
207
281
|
end
|
|
208
282
|
|
|
209
|
-
RQRCode::QRCode.
|
|
283
|
+
RQRCode::QRCode.include RQRCode::Export::SVG
|
data/lib/rqrcode/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rqrcode
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Duncan Robertson
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
13
|
+
name: chunky_png
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
@@ -25,21 +24,21 @@ dependencies:
|
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: '1.0'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
27
|
+
name: rqrcode_core
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
32
|
+
version: '2.0'
|
|
34
33
|
type: :runtime
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - "~>"
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
39
|
+
version: '2.0'
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
41
|
+
name: benchmark-ips
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - "~>"
|
|
@@ -52,6 +51,34 @@ dependencies:
|
|
|
52
51
|
- - "~>"
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
53
|
version: '2.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: bundler
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '4.0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '4.0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: memory_profiler
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '1.0'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.0'
|
|
55
82
|
- !ruby/object:Gem::Dependency
|
|
56
83
|
name: rake
|
|
57
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -81,19 +108,33 @@ dependencies:
|
|
|
81
108
|
- !ruby/object:Gem::Version
|
|
82
109
|
version: '3.5'
|
|
83
110
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
111
|
+
name: stackprof
|
|
85
112
|
requirement: !ruby/object:Gem::Requirement
|
|
86
113
|
requirements:
|
|
87
114
|
- - "~>"
|
|
88
115
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
116
|
+
version: '0.2'
|
|
90
117
|
type: :development
|
|
91
118
|
prerelease: false
|
|
92
119
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
120
|
requirements:
|
|
94
121
|
- - "~>"
|
|
95
122
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
123
|
+
version: '0.2'
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: standard
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '1.41'
|
|
131
|
+
type: :development
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '1.41'
|
|
97
138
|
description: |
|
|
98
139
|
rqrcode is a library for encoding QR Codes. The simple
|
|
99
140
|
interface allows you to create QR Code data structures
|
|
@@ -104,20 +145,9 @@ executables: []
|
|
|
104
145
|
extensions: []
|
|
105
146
|
extra_rdoc_files: []
|
|
106
147
|
files:
|
|
107
|
-
- ".github/workflows/ruby.yml"
|
|
108
|
-
- ".gitignore"
|
|
109
|
-
- ".rspec"
|
|
110
148
|
- CHANGELOG.md
|
|
111
|
-
- Gemfile
|
|
112
|
-
- Gemfile.lock
|
|
113
149
|
- LICENSE.txt
|
|
114
150
|
- README.md
|
|
115
|
-
- Rakefile
|
|
116
|
-
- _config.yml
|
|
117
|
-
- bin/console
|
|
118
|
-
- images/ansi-screen-shot.png
|
|
119
|
-
- images/github-qrcode.png
|
|
120
|
-
- images/github-qrcode.svg
|
|
121
151
|
- lib/rqrcode.rb
|
|
122
152
|
- lib/rqrcode/export.rb
|
|
123
153
|
- lib/rqrcode/export/ansi.rb
|
|
@@ -127,14 +157,12 @@ files:
|
|
|
127
157
|
- lib/rqrcode/qrcode.rb
|
|
128
158
|
- lib/rqrcode/qrcode/qrcode.rb
|
|
129
159
|
- lib/rqrcode/version.rb
|
|
130
|
-
- rqrcode.gemspec
|
|
131
160
|
homepage: https://github.com/whomwah/rqrcode
|
|
132
161
|
licenses:
|
|
133
162
|
- MIT
|
|
134
163
|
metadata:
|
|
135
164
|
bug_tracker_uri: https://github.com/whomwah/rqrcode/issues
|
|
136
|
-
changelog_uri: https://github.com/whomwah/rqrcode/blob/
|
|
137
|
-
post_install_message:
|
|
165
|
+
changelog_uri: https://github.com/whomwah/rqrcode/blob/main/CHANGELOG.md
|
|
138
166
|
rdoc_options: []
|
|
139
167
|
require_paths:
|
|
140
168
|
- lib
|
|
@@ -142,15 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
142
170
|
requirements:
|
|
143
171
|
- - ">="
|
|
144
172
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: '2
|
|
173
|
+
version: '3.2'
|
|
146
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
175
|
requirements:
|
|
148
176
|
- - ">="
|
|
149
177
|
- !ruby/object:Gem::Version
|
|
150
178
|
version: '0'
|
|
151
179
|
requirements: []
|
|
152
|
-
rubygems_version:
|
|
153
|
-
signing_key:
|
|
180
|
+
rubygems_version: 4.0.3
|
|
154
181
|
specification_version: 4
|
|
155
182
|
summary: A library to encode QR Codes
|
|
156
183
|
test_files: []
|
data/.github/workflows/ruby.yml
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
name: rqrcode
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- master
|
|
7
|
-
pull_request:
|
|
8
|
-
branches:
|
|
9
|
-
- master
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
Build:
|
|
13
|
-
strategy:
|
|
14
|
-
fail-fast: false
|
|
15
|
-
matrix:
|
|
16
|
-
os: [ubuntu-latest, macos-latest]
|
|
17
|
-
ruby: ['2.6', '2.7', '3.0', '3.1', '3.2']
|
|
18
|
-
runs-on: ${{ matrix.os }}
|
|
19
|
-
steps:
|
|
20
|
-
- uses: actions/checkout@v3
|
|
21
|
-
- uses: ruby/setup-ruby@v1
|
|
22
|
-
with:
|
|
23
|
-
ruby-version: ${{ matrix.ruby }}
|
|
24
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
25
|
-
- name: Run Tests for Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
|
|
26
|
-
run: bundle exec rake spec
|
|
27
|
-
- name: StandardRB check for Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
|
|
28
|
-
run: bundle exec standardrb --format progress
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
rqrcode (2.2.0)
|
|
5
|
-
chunky_png (~> 1.0)
|
|
6
|
-
rqrcode_core (~> 1.0)
|
|
7
|
-
|
|
8
|
-
GEM
|
|
9
|
-
remote: https://rubygems.org/
|
|
10
|
-
specs:
|
|
11
|
-
ast (2.4.2)
|
|
12
|
-
chunky_png (1.4.0)
|
|
13
|
-
diff-lcs (1.5.0)
|
|
14
|
-
json (2.6.3)
|
|
15
|
-
language_server-protocol (3.17.0.2)
|
|
16
|
-
parallel (1.22.1)
|
|
17
|
-
parser (3.1.3.0)
|
|
18
|
-
ast (~> 2.4.1)
|
|
19
|
-
rainbow (3.1.1)
|
|
20
|
-
rake (13.0.6)
|
|
21
|
-
regexp_parser (2.6.1)
|
|
22
|
-
rexml (3.2.5)
|
|
23
|
-
rqrcode_core (1.2.0)
|
|
24
|
-
rspec (3.12.0)
|
|
25
|
-
rspec-core (~> 3.12.0)
|
|
26
|
-
rspec-expectations (~> 3.12.0)
|
|
27
|
-
rspec-mocks (~> 3.12.0)
|
|
28
|
-
rspec-core (3.12.0)
|
|
29
|
-
rspec-support (~> 3.12.0)
|
|
30
|
-
rspec-expectations (3.12.1)
|
|
31
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
32
|
-
rspec-support (~> 3.12.0)
|
|
33
|
-
rspec-mocks (3.12.1)
|
|
34
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
|
35
|
-
rspec-support (~> 3.12.0)
|
|
36
|
-
rspec-support (3.12.0)
|
|
37
|
-
rubocop (1.40.0)
|
|
38
|
-
json (~> 2.3)
|
|
39
|
-
parallel (~> 1.10)
|
|
40
|
-
parser (>= 3.1.2.1)
|
|
41
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
42
|
-
regexp_parser (>= 1.8, < 3.0)
|
|
43
|
-
rexml (>= 3.2.5, < 4.0)
|
|
44
|
-
rubocop-ast (>= 1.23.0, < 2.0)
|
|
45
|
-
ruby-progressbar (~> 1.7)
|
|
46
|
-
unicode-display_width (>= 1.4.0, < 3.0)
|
|
47
|
-
rubocop-ast (1.24.0)
|
|
48
|
-
parser (>= 3.1.1.0)
|
|
49
|
-
rubocop-performance (1.15.1)
|
|
50
|
-
rubocop (>= 1.7.0, < 2.0)
|
|
51
|
-
rubocop-ast (>= 0.4.0)
|
|
52
|
-
ruby-progressbar (1.11.0)
|
|
53
|
-
standard (1.20.0)
|
|
54
|
-
language_server-protocol (~> 3.17.0.2)
|
|
55
|
-
rubocop (= 1.40.0)
|
|
56
|
-
rubocop-performance (= 1.15.1)
|
|
57
|
-
standardrb (1.0.1)
|
|
58
|
-
standard
|
|
59
|
-
unicode-display_width (2.3.0)
|
|
60
|
-
|
|
61
|
-
PLATFORMS
|
|
62
|
-
ruby
|
|
63
|
-
|
|
64
|
-
DEPENDENCIES
|
|
65
|
-
bundler (~> 2.0)
|
|
66
|
-
rake (~> 13.0)
|
|
67
|
-
rqrcode!
|
|
68
|
-
rspec (~> 3.5)
|
|
69
|
-
standardrb (~> 1.0)
|
|
70
|
-
|
|
71
|
-
BUNDLED WITH
|
|
72
|
-
2.3.26
|
data/Rakefile
DELETED
data/_config.yml
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
theme: jekyll-theme-slate
|
data/bin/console
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require "bundler/setup"
|
|
4
|
-
require "rqrcode"
|
|
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__)
|
data/images/ansi-screen-shot.png
DELETED
|
Binary file
|
data/images/github-qrcode.png
DELETED
|
Binary file
|
data/images/github-qrcode.svg
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" standalone="yes"?>
|
|
2
|
-
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="174" height="174" shape-rendering="crispEdges">
|
|
3
|
-
<rect width="6" height="6" x="0" y="0" style="fill:#000"/><rect width="6" height="6" x="6" y="0" style="fill:#000"/><rect width="6" height="6" x="12" y="0" style="fill:#000"/><rect width="6" height="6" x="18" y="0" style="fill:#000"/><rect width="6" height="6" x="24" y="0" style="fill:#000"/><rect width="6" height="6" x="30" y="0" style="fill:#000"/><rect width="6" height="6" x="36" y="0" style="fill:#000"/><rect width="6" height="6" x="54" y="0" style="fill:#000"/><rect width="6" height="6" x="60" y="0" style="fill:#000"/><rect width="6" height="6" x="66" y="0" style="fill:#000"/><rect width="6" height="6" x="78" y="0" style="fill:#000"/><rect width="6" height="6" x="108" y="0" style="fill:#000"/><rect width="6" height="6" x="114" y="0" style="fill:#000"/><rect width="6" height="6" x="132" y="0" style="fill:#000"/><rect width="6" height="6" x="138" y="0" style="fill:#000"/><rect width="6" height="6" x="144" y="0" style="fill:#000"/><rect width="6" height="6" x="150" y="0" style="fill:#000"/><rect width="6" height="6" x="156" y="0" style="fill:#000"/><rect width="6" height="6" x="162" y="0" style="fill:#000"/><rect width="6" height="6" x="168" y="0" style="fill:#000"/>
|
|
4
|
-
<rect width="6" height="6" x="0" y="6" style="fill:#000"/><rect width="6" height="6" x="36" y="6" style="fill:#000"/><rect width="6" height="6" x="60" y="6" style="fill:#000"/><rect width="6" height="6" x="66" y="6" style="fill:#000"/><rect width="6" height="6" x="78" y="6" style="fill:#000"/><rect width="6" height="6" x="84" y="6" style="fill:#000"/><rect width="6" height="6" x="90" y="6" style="fill:#000"/><rect width="6" height="6" x="96" y="6" style="fill:#000"/><rect width="6" height="6" x="108" y="6" style="fill:#000"/><rect width="6" height="6" x="120" y="6" style="fill:#000"/><rect width="6" height="6" x="132" y="6" style="fill:#000"/><rect width="6" height="6" x="168" y="6" style="fill:#000"/>
|
|
5
|
-
<rect width="6" height="6" x="0" y="12" style="fill:#000"/><rect width="6" height="6" x="12" y="12" style="fill:#000"/><rect width="6" height="6" x="18" y="12" style="fill:#000"/><rect width="6" height="6" x="24" y="12" style="fill:#000"/><rect width="6" height="6" x="36" y="12" style="fill:#000"/><rect width="6" height="6" x="48" y="12" style="fill:#000"/><rect width="6" height="6" x="54" y="12" style="fill:#000"/><rect width="6" height="6" x="72" y="12" style="fill:#000"/><rect width="6" height="6" x="90" y="12" style="fill:#000"/><rect width="6" height="6" x="108" y="12" style="fill:#000"/><rect width="6" height="6" x="120" y="12" style="fill:#000"/><rect width="6" height="6" x="132" y="12" style="fill:#000"/><rect width="6" height="6" x="144" y="12" style="fill:#000"/><rect width="6" height="6" x="150" y="12" style="fill:#000"/><rect width="6" height="6" x="156" y="12" style="fill:#000"/><rect width="6" height="6" x="168" y="12" style="fill:#000"/>
|
|
6
|
-
<rect width="6" height="6" x="0" y="18" style="fill:#000"/><rect width="6" height="6" x="12" y="18" style="fill:#000"/><rect width="6" height="6" x="18" y="18" style="fill:#000"/><rect width="6" height="6" x="24" y="18" style="fill:#000"/><rect width="6" height="6" x="36" y="18" style="fill:#000"/><rect width="6" height="6" x="48" y="18" style="fill:#000"/><rect width="6" height="6" x="54" y="18" style="fill:#000"/><rect width="6" height="6" x="60" y="18" style="fill:#000"/><rect width="6" height="6" x="78" y="18" style="fill:#000"/><rect width="6" height="6" x="90" y="18" style="fill:#000"/><rect width="6" height="6" x="102" y="18" style="fill:#000"/><rect width="6" height="6" x="114" y="18" style="fill:#000"/><rect width="6" height="6" x="120" y="18" style="fill:#000"/><rect width="6" height="6" x="132" y="18" style="fill:#000"/><rect width="6" height="6" x="144" y="18" style="fill:#000"/><rect width="6" height="6" x="150" y="18" style="fill:#000"/><rect width="6" height="6" x="156" y="18" style="fill:#000"/><rect width="6" height="6" x="168" y="18" style="fill:#000"/>
|
|
7
|
-
<rect width="6" height="6" x="0" y="24" style="fill:#000"/><rect width="6" height="6" x="12" y="24" style="fill:#000"/><rect width="6" height="6" x="18" y="24" style="fill:#000"/><rect width="6" height="6" x="24" y="24" style="fill:#000"/><rect width="6" height="6" x="36" y="24" style="fill:#000"/><rect width="6" height="6" x="60" y="24" style="fill:#000"/><rect width="6" height="6" x="66" y="24" style="fill:#000"/><rect width="6" height="6" x="72" y="24" style="fill:#000"/><rect width="6" height="6" x="78" y="24" style="fill:#000"/><rect width="6" height="6" x="84" y="24" style="fill:#000"/><rect width="6" height="6" x="90" y="24" style="fill:#000"/><rect width="6" height="6" x="96" y="24" style="fill:#000"/><rect width="6" height="6" x="102" y="24" style="fill:#000"/><rect width="6" height="6" x="114" y="24" style="fill:#000"/><rect width="6" height="6" x="132" y="24" style="fill:#000"/><rect width="6" height="6" x="144" y="24" style="fill:#000"/><rect width="6" height="6" x="150" y="24" style="fill:#000"/><rect width="6" height="6" x="156" y="24" style="fill:#000"/><rect width="6" height="6" x="168" y="24" style="fill:#000"/>
|
|
8
|
-
<rect width="6" height="6" x="0" y="30" style="fill:#000"/><rect width="6" height="6" x="36" y="30" style="fill:#000"/><rect width="6" height="6" x="60" y="30" style="fill:#000"/><rect width="6" height="6" x="66" y="30" style="fill:#000"/><rect width="6" height="6" x="90" y="30" style="fill:#000"/><rect width="6" height="6" x="102" y="30" style="fill:#000"/><rect width="6" height="6" x="108" y="30" style="fill:#000"/><rect width="6" height="6" x="132" y="30" style="fill:#000"/><rect width="6" height="6" x="168" y="30" style="fill:#000"/>
|
|
9
|
-
<rect width="6" height="6" x="0" y="36" style="fill:#000"/><rect width="6" height="6" x="6" y="36" style="fill:#000"/><rect width="6" height="6" x="12" y="36" style="fill:#000"/><rect width="6" height="6" x="18" y="36" style="fill:#000"/><rect width="6" height="6" x="24" y="36" style="fill:#000"/><rect width="6" height="6" x="30" y="36" style="fill:#000"/><rect width="6" height="6" x="36" y="36" style="fill:#000"/><rect width="6" height="6" x="48" y="36" style="fill:#000"/><rect width="6" height="6" x="60" y="36" style="fill:#000"/><rect width="6" height="6" x="72" y="36" style="fill:#000"/><rect width="6" height="6" x="84" y="36" style="fill:#000"/><rect width="6" height="6" x="96" y="36" style="fill:#000"/><rect width="6" height="6" x="108" y="36" style="fill:#000"/><rect width="6" height="6" x="120" y="36" style="fill:#000"/><rect width="6" height="6" x="132" y="36" style="fill:#000"/><rect width="6" height="6" x="138" y="36" style="fill:#000"/><rect width="6" height="6" x="144" y="36" style="fill:#000"/><rect width="6" height="6" x="150" y="36" style="fill:#000"/><rect width="6" height="6" x="156" y="36" style="fill:#000"/><rect width="6" height="6" x="162" y="36" style="fill:#000"/><rect width="6" height="6" x="168" y="36" style="fill:#000"/>
|
|
10
|
-
<rect width="6" height="6" x="54" y="42" style="fill:#000"/><rect width="6" height="6" x="72" y="42" style="fill:#000"/><rect width="6" height="6" x="78" y="42" style="fill:#000"/><rect width="6" height="6" x="84" y="42" style="fill:#000"/><rect width="6" height="6" x="114" y="42" style="fill:#000"/>
|
|
11
|
-
<rect width="6" height="6" x="18" y="48" style="fill:#000"/><rect width="6" height="6" x="24" y="48" style="fill:#000"/><rect width="6" height="6" x="36" y="48" style="fill:#000"/><rect width="6" height="6" x="42" y="48" style="fill:#000"/><rect width="6" height="6" x="54" y="48" style="fill:#000"/><rect width="6" height="6" x="72" y="48" style="fill:#000"/><rect width="6" height="6" x="90" y="48" style="fill:#000"/><rect width="6" height="6" x="96" y="48" style="fill:#000"/><rect width="6" height="6" x="108" y="48" style="fill:#000"/><rect width="6" height="6" x="114" y="48" style="fill:#000"/><rect width="6" height="6" x="120" y="48" style="fill:#000"/><rect width="6" height="6" x="150" y="48" style="fill:#000"/><rect width="6" height="6" x="156" y="48" style="fill:#000"/>
|
|
12
|
-
<rect width="6" height="6" x="12" y="54" style="fill:#000"/><rect width="6" height="6" x="18" y="54" style="fill:#000"/><rect width="6" height="6" x="24" y="54" style="fill:#000"/><rect width="6" height="6" x="30" y="54" style="fill:#000"/><rect width="6" height="6" x="54" y="54" style="fill:#000"/><rect width="6" height="6" x="72" y="54" style="fill:#000"/><rect width="6" height="6" x="78" y="54" style="fill:#000"/><rect width="6" height="6" x="84" y="54" style="fill:#000"/><rect width="6" height="6" x="96" y="54" style="fill:#000"/><rect width="6" height="6" x="120" y="54" style="fill:#000"/><rect width="6" height="6" x="132" y="54" style="fill:#000"/><rect width="6" height="6" x="144" y="54" style="fill:#000"/><rect width="6" height="6" x="150" y="54" style="fill:#000"/><rect width="6" height="6" x="162" y="54" style="fill:#000"/>
|
|
13
|
-
<rect width="6" height="6" x="6" y="60" style="fill:#000"/><rect width="6" height="6" x="18" y="60" style="fill:#000"/><rect width="6" height="6" x="36" y="60" style="fill:#000"/><rect width="6" height="6" x="48" y="60" style="fill:#000"/><rect width="6" height="6" x="78" y="60" style="fill:#000"/><rect width="6" height="6" x="108" y="60" style="fill:#000"/><rect width="6" height="6" x="132" y="60" style="fill:#000"/>
|
|
14
|
-
<rect width="6" height="6" x="6" y="66" style="fill:#000"/><rect width="6" height="6" x="12" y="66" style="fill:#000"/><rect width="6" height="6" x="18" y="66" style="fill:#000"/><rect width="6" height="6" x="30" y="66" style="fill:#000"/><rect width="6" height="6" x="42" y="66" style="fill:#000"/><rect width="6" height="6" x="48" y="66" style="fill:#000"/><rect width="6" height="6" x="54" y="66" style="fill:#000"/><rect width="6" height="6" x="72" y="66" style="fill:#000"/><rect width="6" height="6" x="78" y="66" style="fill:#000"/><rect width="6" height="6" x="84" y="66" style="fill:#000"/><rect width="6" height="6" x="96" y="66" style="fill:#000"/><rect width="6" height="6" x="108" y="66" style="fill:#000"/><rect width="6" height="6" x="126" y="66" style="fill:#000"/><rect width="6" height="6" x="150" y="66" style="fill:#000"/><rect width="6" height="6" x="168" y="66" style="fill:#000"/>
|
|
15
|
-
<rect width="6" height="6" x="24" y="72" style="fill:#000"/><rect width="6" height="6" x="36" y="72" style="fill:#000"/><rect width="6" height="6" x="42" y="72" style="fill:#000"/><rect width="6" height="6" x="48" y="72" style="fill:#000"/><rect width="6" height="6" x="54" y="72" style="fill:#000"/><rect width="6" height="6" x="60" y="72" style="fill:#000"/><rect width="6" height="6" x="78" y="72" style="fill:#000"/><rect width="6" height="6" x="90" y="72" style="fill:#000"/><rect width="6" height="6" x="102" y="72" style="fill:#000"/><rect width="6" height="6" x="114" y="72" style="fill:#000"/><rect width="6" height="6" x="126" y="72" style="fill:#000"/><rect width="6" height="6" x="132" y="72" style="fill:#000"/><rect width="6" height="6" x="138" y="72" style="fill:#000"/><rect width="6" height="6" x="150" y="72" style="fill:#000"/><rect width="6" height="6" x="162" y="72" style="fill:#000"/>
|
|
16
|
-
<rect width="6" height="6" x="6" y="78" style="fill:#000"/><rect width="6" height="6" x="12" y="78" style="fill:#000"/><rect width="6" height="6" x="24" y="78" style="fill:#000"/><rect width="6" height="6" x="30" y="78" style="fill:#000"/><rect width="6" height="6" x="78" y="78" style="fill:#000"/><rect width="6" height="6" x="84" y="78" style="fill:#000"/><rect width="6" height="6" x="102" y="78" style="fill:#000"/><rect width="6" height="6" x="132" y="78" style="fill:#000"/><rect width="6" height="6" x="144" y="78" style="fill:#000"/><rect width="6" height="6" x="156" y="78" style="fill:#000"/><rect width="6" height="6" x="168" y="78" style="fill:#000"/>
|
|
17
|
-
<rect width="6" height="6" x="0" y="84" style="fill:#000"/><rect width="6" height="6" x="12" y="84" style="fill:#000"/><rect width="6" height="6" x="18" y="84" style="fill:#000"/><rect width="6" height="6" x="30" y="84" style="fill:#000"/><rect width="6" height="6" x="36" y="84" style="fill:#000"/><rect width="6" height="6" x="42" y="84" style="fill:#000"/><rect width="6" height="6" x="48" y="84" style="fill:#000"/><rect width="6" height="6" x="72" y="84" style="fill:#000"/><rect width="6" height="6" x="78" y="84" style="fill:#000"/><rect width="6" height="6" x="108" y="84" style="fill:#000"/><rect width="6" height="6" x="114" y="84" style="fill:#000"/><rect width="6" height="6" x="120" y="84" style="fill:#000"/><rect width="6" height="6" x="150" y="84" style="fill:#000"/><rect width="6" height="6" x="162" y="84" style="fill:#000"/><rect width="6" height="6" x="168" y="84" style="fill:#000"/>
|
|
18
|
-
<rect width="6" height="6" x="0" y="90" style="fill:#000"/><rect width="6" height="6" x="12" y="90" style="fill:#000"/><rect width="6" height="6" x="30" y="90" style="fill:#000"/><rect width="6" height="6" x="60" y="90" style="fill:#000"/><rect width="6" height="6" x="78" y="90" style="fill:#000"/><rect width="6" height="6" x="102" y="90" style="fill:#000"/><rect width="6" height="6" x="108" y="90" style="fill:#000"/><rect width="6" height="6" x="120" y="90" style="fill:#000"/><rect width="6" height="6" x="150" y="90" style="fill:#000"/><rect width="6" height="6" x="156" y="90" style="fill:#000"/>
|
|
19
|
-
<rect width="6" height="6" x="18" y="96" style="fill:#000"/><rect width="6" height="6" x="24" y="96" style="fill:#000"/><rect width="6" height="6" x="30" y="96" style="fill:#000"/><rect width="6" height="6" x="36" y="96" style="fill:#000"/><rect width="6" height="6" x="48" y="96" style="fill:#000"/><rect width="6" height="6" x="60" y="96" style="fill:#000"/><rect width="6" height="6" x="72" y="96" style="fill:#000"/><rect width="6" height="6" x="78" y="96" style="fill:#000"/><rect width="6" height="6" x="84" y="96" style="fill:#000"/><rect width="6" height="6" x="108" y="96" style="fill:#000"/><rect width="6" height="6" x="114" y="96" style="fill:#000"/><rect width="6" height="6" x="120" y="96" style="fill:#000"/><rect width="6" height="6" x="132" y="96" style="fill:#000"/><rect width="6" height="6" x="138" y="96" style="fill:#000"/><rect width="6" height="6" x="150" y="96" style="fill:#000"/><rect width="6" height="6" x="162" y="96" style="fill:#000"/>
|
|
20
|
-
<rect width="6" height="6" x="0" y="102" style="fill:#000"/><rect width="6" height="6" x="6" y="102" style="fill:#000"/><rect width="6" height="6" x="12" y="102" style="fill:#000"/><rect width="6" height="6" x="18" y="102" style="fill:#000"/><rect width="6" height="6" x="54" y="102" style="fill:#000"/><rect width="6" height="6" x="66" y="102" style="fill:#000"/><rect width="6" height="6" x="96" y="102" style="fill:#000"/><rect width="6" height="6" x="102" y="102" style="fill:#000"/><rect width="6" height="6" x="108" y="102" style="fill:#000"/><rect width="6" height="6" x="120" y="102" style="fill:#000"/><rect width="6" height="6" x="132" y="102" style="fill:#000"/><rect width="6" height="6" x="138" y="102" style="fill:#000"/><rect width="6" height="6" x="144" y="102" style="fill:#000"/>
|
|
21
|
-
<rect width="6" height="6" x="0" y="108" style="fill:#000"/><rect width="6" height="6" x="6" y="108" style="fill:#000"/><rect width="6" height="6" x="18" y="108" style="fill:#000"/><rect width="6" height="6" x="24" y="108" style="fill:#000"/><rect width="6" height="6" x="36" y="108" style="fill:#000"/><rect width="6" height="6" x="60" y="108" style="fill:#000"/><rect width="6" height="6" x="72" y="108" style="fill:#000"/><rect width="6" height="6" x="90" y="108" style="fill:#000"/><rect width="6" height="6" x="120" y="108" style="fill:#000"/><rect width="6" height="6" x="144" y="108" style="fill:#000"/><rect width="6" height="6" x="168" y="108" style="fill:#000"/>
|
|
22
|
-
<rect width="6" height="6" x="0" y="114" style="fill:#000"/><rect width="6" height="6" x="6" y="114" style="fill:#000"/><rect width="6" height="6" x="12" y="114" style="fill:#000"/><rect width="6" height="6" x="18" y="114" style="fill:#000"/><rect width="6" height="6" x="24" y="114" style="fill:#000"/><rect width="6" height="6" x="30" y="114" style="fill:#000"/><rect width="6" height="6" x="42" y="114" style="fill:#000"/><rect width="6" height="6" x="48" y="114" style="fill:#000"/><rect width="6" height="6" x="60" y="114" style="fill:#000"/><rect width="6" height="6" x="72" y="114" style="fill:#000"/><rect width="6" height="6" x="78" y="114" style="fill:#000"/><rect width="6" height="6" x="90" y="114" style="fill:#000"/><rect width="6" height="6" x="126" y="114" style="fill:#000"/><rect width="6" height="6" x="132" y="114" style="fill:#000"/><rect width="6" height="6" x="138" y="114" style="fill:#000"/><rect width="6" height="6" x="156" y="114" style="fill:#000"/><rect width="6" height="6" x="168" y="114" style="fill:#000"/>
|
|
23
|
-
<rect width="6" height="6" x="0" y="120" style="fill:#000"/><rect width="6" height="6" x="6" y="120" style="fill:#000"/><rect width="6" height="6" x="12" y="120" style="fill:#000"/><rect width="6" height="6" x="30" y="120" style="fill:#000"/><rect width="6" height="6" x="36" y="120" style="fill:#000"/><rect width="6" height="6" x="60" y="120" style="fill:#000"/><rect width="6" height="6" x="66" y="120" style="fill:#000"/><rect width="6" height="6" x="72" y="120" style="fill:#000"/><rect width="6" height="6" x="108" y="120" style="fill:#000"/><rect width="6" height="6" x="120" y="120" style="fill:#000"/><rect width="6" height="6" x="126" y="120" style="fill:#000"/><rect width="6" height="6" x="132" y="120" style="fill:#000"/><rect width="6" height="6" x="138" y="120" style="fill:#000"/><rect width="6" height="6" x="144" y="120" style="fill:#000"/><rect width="6" height="6" x="150" y="120" style="fill:#000"/><rect width="6" height="6" x="156" y="120" style="fill:#000"/><rect width="6" height="6" x="162" y="120" style="fill:#000"/><rect width="6" height="6" x="168" y="120" style="fill:#000"/>
|
|
24
|
-
<rect width="6" height="6" x="48" y="126" style="fill:#000"/><rect width="6" height="6" x="60" y="126" style="fill:#000"/><rect width="6" height="6" x="78" y="126" style="fill:#000"/><rect width="6" height="6" x="84" y="126" style="fill:#000"/><rect width="6" height="6" x="120" y="126" style="fill:#000"/><rect width="6" height="6" x="144" y="126" style="fill:#000"/><rect width="6" height="6" x="150" y="126" style="fill:#000"/><rect width="6" height="6" x="156" y="126" style="fill:#000"/>
|
|
25
|
-
<rect width="6" height="6" x="0" y="132" style="fill:#000"/><rect width="6" height="6" x="6" y="132" style="fill:#000"/><rect width="6" height="6" x="12" y="132" style="fill:#000"/><rect width="6" height="6" x="18" y="132" style="fill:#000"/><rect width="6" height="6" x="24" y="132" style="fill:#000"/><rect width="6" height="6" x="30" y="132" style="fill:#000"/><rect width="6" height="6" x="36" y="132" style="fill:#000"/><rect width="6" height="6" x="48" y="132" style="fill:#000"/><rect width="6" height="6" x="66" y="132" style="fill:#000"/><rect width="6" height="6" x="72" y="132" style="fill:#000"/><rect width="6" height="6" x="114" y="132" style="fill:#000"/><rect width="6" height="6" x="120" y="132" style="fill:#000"/><rect width="6" height="6" x="132" y="132" style="fill:#000"/><rect width="6" height="6" x="144" y="132" style="fill:#000"/><rect width="6" height="6" x="156" y="132" style="fill:#000"/>
|
|
26
|
-
<rect width="6" height="6" x="0" y="138" style="fill:#000"/><rect width="6" height="6" x="36" y="138" style="fill:#000"/><rect width="6" height="6" x="60" y="138" style="fill:#000"/><rect width="6" height="6" x="66" y="138" style="fill:#000"/><rect width="6" height="6" x="72" y="138" style="fill:#000"/><rect width="6" height="6" x="78" y="138" style="fill:#000"/><rect width="6" height="6" x="96" y="138" style="fill:#000"/><rect width="6" height="6" x="108" y="138" style="fill:#000"/><rect width="6" height="6" x="114" y="138" style="fill:#000"/><rect width="6" height="6" x="120" y="138" style="fill:#000"/><rect width="6" height="6" x="144" y="138" style="fill:#000"/><rect width="6" height="6" x="150" y="138" style="fill:#000"/><rect width="6" height="6" x="162" y="138" style="fill:#000"/><rect width="6" height="6" x="168" y="138" style="fill:#000"/>
|
|
27
|
-
<rect width="6" height="6" x="0" y="144" style="fill:#000"/><rect width="6" height="6" x="12" y="144" style="fill:#000"/><rect width="6" height="6" x="18" y="144" style="fill:#000"/><rect width="6" height="6" x="24" y="144" style="fill:#000"/><rect width="6" height="6" x="36" y="144" style="fill:#000"/><rect width="6" height="6" x="48" y="144" style="fill:#000"/><rect width="6" height="6" x="54" y="144" style="fill:#000"/><rect width="6" height="6" x="72" y="144" style="fill:#000"/><rect width="6" height="6" x="102" y="144" style="fill:#000"/><rect width="6" height="6" x="108" y="144" style="fill:#000"/><rect width="6" height="6" x="114" y="144" style="fill:#000"/><rect width="6" height="6" x="120" y="144" style="fill:#000"/><rect width="6" height="6" x="126" y="144" style="fill:#000"/><rect width="6" height="6" x="132" y="144" style="fill:#000"/><rect width="6" height="6" x="138" y="144" style="fill:#000"/><rect width="6" height="6" x="144" y="144" style="fill:#000"/><rect width="6" height="6" x="168" y="144" style="fill:#000"/>
|
|
28
|
-
<rect width="6" height="6" x="0" y="150" style="fill:#000"/><rect width="6" height="6" x="12" y="150" style="fill:#000"/><rect width="6" height="6" x="18" y="150" style="fill:#000"/><rect width="6" height="6" x="24" y="150" style="fill:#000"/><rect width="6" height="6" x="36" y="150" style="fill:#000"/><rect width="6" height="6" x="48" y="150" style="fill:#000"/><rect width="6" height="6" x="60" y="150" style="fill:#000"/><rect width="6" height="6" x="66" y="150" style="fill:#000"/><rect width="6" height="6" x="72" y="150" style="fill:#000"/><rect width="6" height="6" x="78" y="150" style="fill:#000"/><rect width="6" height="6" x="84" y="150" style="fill:#000"/><rect width="6" height="6" x="96" y="150" style="fill:#000"/><rect width="6" height="6" x="126" y="150" style="fill:#000"/><rect width="6" height="6" x="138" y="150" style="fill:#000"/><rect width="6" height="6" x="162" y="150" style="fill:#000"/>
|
|
29
|
-
<rect width="6" height="6" x="0" y="156" style="fill:#000"/><rect width="6" height="6" x="12" y="156" style="fill:#000"/><rect width="6" height="6" x="18" y="156" style="fill:#000"/><rect width="6" height="6" x="24" y="156" style="fill:#000"/><rect width="6" height="6" x="36" y="156" style="fill:#000"/><rect width="6" height="6" x="60" y="156" style="fill:#000"/><rect width="6" height="6" x="66" y="156" style="fill:#000"/><rect width="6" height="6" x="72" y="156" style="fill:#000"/><rect width="6" height="6" x="90" y="156" style="fill:#000"/><rect width="6" height="6" x="126" y="156" style="fill:#000"/><rect width="6" height="6" x="144" y="156" style="fill:#000"/><rect width="6" height="6" x="156" y="156" style="fill:#000"/><rect width="6" height="6" x="162" y="156" style="fill:#000"/><rect width="6" height="6" x="168" y="156" style="fill:#000"/>
|
|
30
|
-
<rect width="6" height="6" x="0" y="162" style="fill:#000"/><rect width="6" height="6" x="36" y="162" style="fill:#000"/><rect width="6" height="6" x="54" y="162" style="fill:#000"/><rect width="6" height="6" x="72" y="162" style="fill:#000"/><rect width="6" height="6" x="84" y="162" style="fill:#000"/><rect width="6" height="6" x="114" y="162" style="fill:#000"/><rect width="6" height="6" x="120" y="162" style="fill:#000"/><rect width="6" height="6" x="132" y="162" style="fill:#000"/><rect width="6" height="6" x="144" y="162" style="fill:#000"/><rect width="6" height="6" x="150" y="162" style="fill:#000"/><rect width="6" height="6" x="156" y="162" style="fill:#000"/><rect width="6" height="6" x="168" y="162" style="fill:#000"/>
|
|
31
|
-
<rect width="6" height="6" x="0" y="168" style="fill:#000"/><rect width="6" height="6" x="6" y="168" style="fill:#000"/><rect width="6" height="6" x="12" y="168" style="fill:#000"/><rect width="6" height="6" x="18" y="168" style="fill:#000"/><rect width="6" height="6" x="24" y="168" style="fill:#000"/><rect width="6" height="6" x="30" y="168" style="fill:#000"/><rect width="6" height="6" x="36" y="168" style="fill:#000"/><rect width="6" height="6" x="54" y="168" style="fill:#000"/><rect width="6" height="6" x="84" y="168" style="fill:#000"/><rect width="6" height="6" x="96" y="168" style="fill:#000"/><rect width="6" height="6" x="108" y="168" style="fill:#000"/><rect width="6" height="6" x="120" y="168" style="fill:#000"/><rect width="6" height="6" x="138" y="168" style="fill:#000"/><rect width="6" height="6" x="144" y="168" style="fill:#000"/>
|
|
32
|
-
</svg>
|
data/rqrcode.gemspec
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
lib = File.expand_path("../lib", __FILE__)
|
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
-
require "rqrcode/version"
|
|
4
|
-
|
|
5
|
-
Gem::Specification.new do |spec|
|
|
6
|
-
spec.name = "rqrcode"
|
|
7
|
-
spec.version = RQRCode::VERSION
|
|
8
|
-
spec.platform = Gem::Platform::RUBY
|
|
9
|
-
spec.authors = ["Duncan Robertson"]
|
|
10
|
-
spec.email = ["duncan@whomwah.com"]
|
|
11
|
-
|
|
12
|
-
spec.summary = "A library to encode QR Codes"
|
|
13
|
-
spec.description = <<~EOF
|
|
14
|
-
rqrcode is a library for encoding QR Codes. The simple
|
|
15
|
-
interface allows you to create QR Code data structures
|
|
16
|
-
and then render them in the way you choose.
|
|
17
|
-
EOF
|
|
18
|
-
spec.homepage = "https://github.com/whomwah/rqrcode"
|
|
19
|
-
spec.license = "MIT"
|
|
20
|
-
spec.metadata = {
|
|
21
|
-
"bug_tracker_uri" => "https://github.com/whomwah/rqrcode/issues",
|
|
22
|
-
"changelog_uri" => "https://github.com/whomwah/rqrcode/blob/master/CHANGELOG.md"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
|
26
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
27
|
-
end
|
|
28
|
-
spec.bindir = "exe"
|
|
29
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
30
|
-
spec.require_paths = ["lib"]
|
|
31
|
-
|
|
32
|
-
spec.required_ruby_version = ">= 2.6"
|
|
33
|
-
spec.add_dependency "rqrcode_core", "~> 1.0"
|
|
34
|
-
spec.add_dependency "chunky_png", "~> 1.0"
|
|
35
|
-
spec.add_development_dependency "bundler", "~> 2.0"
|
|
36
|
-
spec.add_development_dependency "rake", "~> 13.0"
|
|
37
|
-
spec.add_development_dependency "rspec", "~> 3.5"
|
|
38
|
-
spec.add_development_dependency "standardrb", "~> 1.0"
|
|
39
|
-
end
|