exifr 1.3.2 → 1.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0d2b292303046e5137f23317c7bf20d53730203a
4
- data.tar.gz: f824911ca1a898a61394221f9172d93a6b7b02a1
2
+ SHA256:
3
+ metadata.gz: 875a312186a0f46c69201e260de535974566c112d4198f91c603c5a57112910d
4
+ data.tar.gz: 5735851e875b2a76f9bb73fb6a4556548fa1ae18ad8d0a0f5ed970648769054c
5
5
  SHA512:
6
- metadata.gz: c3adc6a2475688d765df840b66140e9309c3aa2d94a58a76b466de7794b196cea09cbaaca2379a8de25a2ace95636f8bb82260f1c9047ec9f4732d8cbe6f7ff1
7
- data.tar.gz: 7f4abd34897c876ac7f09a03601c2f901ae54b3b607b7afae572d16a95e9434fcb445a9e5c3ba89b00703121b4ea37e86fe857841f5f6bc99ae25df52a505b34
6
+ metadata.gz: b7b828732884dddb926221ae91ab87e5bee58fdd39a31b26beb1b794db1764661864d2b67844e2ca2e8b5d6b728464005602c927dd0d7fb652f7f57d5a87040c
7
+ data.tar.gz: 828884d3ff08fa3b1855a233fe31868516c31b9cf6f2487dd0db4274e2fb28e643c02b5df3ae0b247033f7cc2afc45e46aef6826ec1ba14fe294a644a9a8f549
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
2
2
 
3
3
  require 'rake/testtask'
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
2
2
 
3
3
  require 'logger'
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
2
2
 
3
3
  require 'exifr'
4
4
  require 'exifr/tiff'
@@ -66,8 +66,12 @@ module EXIFR
66
66
  super || methods.include?(method) || (include_all && private_methods.include?(method))
67
67
  end
68
68
 
69
- def methods # :nodoc:
70
- super + TIFF::TAGS << :gps
69
+ def methods(regular=true) # :nodoc:
70
+ if regular
71
+ super + TIFF::TAGS << :gps
72
+ else
73
+ super
74
+ end
71
75
  end
72
76
 
73
77
  class << self
@@ -237,6 +237,7 @@ module EXIFR
237
237
  0x001c => :gps_area_information,
238
238
  0x001d => :gps_date_stamp,
239
239
  0x001e => :gps_differential,
240
+ 0x001f => :gps_h_positioning_error
240
241
  },
241
242
  })
242
243
  IFD_TAGS = [:image, :exif, :gps] # :nodoc:
@@ -249,9 +250,9 @@ module EXIFR
249
250
 
250
251
  time_proc = proc do |value|
251
252
  value.map do |v|
252
- if v =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/
253
+ if v =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)(?:\.(\d{3}))?$/
253
254
  begin
254
- mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i)
255
+ mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, $7.to_i * 1000)
255
256
  rescue => ex
256
257
  EXIFR.logger.warn("Bad date/time value #{v.inspect}: #{ex}")
257
258
  nil
@@ -383,7 +384,12 @@ module EXIFR
383
384
  @jpeg_thumbnails = @ifds.map do |v|
384
385
  if v.jpeg_interchange_format && v.jpeg_interchange_format_length
385
386
  start, length = v.jpeg_interchange_format, v.jpeg_interchange_format_length
386
- data[start..(start + length)]
387
+ if Integer === start && Integer === length
388
+ data[start..(start + length)]
389
+ else
390
+ EXIFR.logger.warn("Non numeric JpegInterchangeFormat data")
391
+ nil
392
+ end
387
393
  end
388
394
  end.compact
389
395
  end
@@ -423,8 +429,12 @@ module EXIFR
423
429
  TAGS.include?(method)
424
430
  end
425
431
 
426
- def methods # :nodoc:
427
- (super + TAGS + IFD.instance_methods(false)).uniq
432
+ def methods(regular=true) # :nodoc:
433
+ if regular
434
+ (super + TAGS + IFD.instance_methods(false)).uniq
435
+ else
436
+ super
437
+ end
428
438
  end
429
439
 
430
440
  def encode_with(coder)
@@ -456,9 +466,12 @@ module EXIFR
456
466
  # Get GPS location, altitude and image direction return nil when not available.
457
467
  def gps
458
468
  return nil unless gps_latitude && gps_longitude
469
+
470
+ altitude = gps_altitude.is_a?(Array) ? gps_altitude.first : gps_altitude
471
+
459
472
  GPS.new(gps_latitude.to_f * (gps_latitude_ref == 'S' ? -1 : 1),
460
473
  gps_longitude.to_f * (gps_longitude_ref == 'W' ? -1 : 1),
461
- gps_altitude && (gps_altitude.to_f * (gps_altitude_ref == "\1" ? -1 : 1)),
474
+ altitude && (altitude.to_f * (gps_altitude_ref == "\1" ? -1 : 1)),
462
475
  gps_img_direction && gps_img_direction.to_f)
463
476
  end
464
477
 
Binary file
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
3
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
4
4
 
5
5
  require 'test_helper'
6
6
 
@@ -103,6 +103,13 @@ class JPEGTest < TestCase
103
103
  end
104
104
  end
105
105
 
106
+ def test_methods_method
107
+ j = JPEG.new(f('exif.jpg'))
108
+ assert j.methods.include?(:date_time)
109
+ assert j.methods(true).include?(:date_time)
110
+ assert ! j.methods(false).include?(:date_time)
111
+ end
112
+
106
113
  def test_multiple_app1
107
114
  assert JPEG.new(f('multiple-app1.jpg')).exif?
108
115
  end
@@ -119,4 +126,29 @@ class JPEGTest < TestCase
119
126
 
120
127
  assert count > 0, 'no thumbnails found'
121
128
  end
129
+
130
+ def test_gps_with_altitude
131
+ t = JPEG.new(f('gps-altitude.jpg'))
132
+
133
+ assert_equal([Rational(230, 1), Rational(0, 1), Rational(0, 1)], t.gps_altitude)
134
+ assert_equal(230, t.gps.altitude)
135
+ end
136
+
137
+ def test_exif_datetime_milliseconds
138
+ if Time.now.strftime('%L') == '%L'
139
+ STDERR.puts("skipping milliseconds test; not supported on this platform")
140
+ return
141
+ end
142
+
143
+ j = JPEG.new(f('exif.jpg'))
144
+ assert_equal('000', j.date_time.strftime('%L'))
145
+ assert_equal('000', j.date_time_original.strftime('%L'))
146
+ assert_equal('000', j.date_time_digitized.strftime('%L'))
147
+
148
+ j = JPEG.new(f('ios-mspix-milliseconds.jpg'))
149
+ assert_equal('978', j.date_time.strftime('%L'))
150
+ assert_equal('978', j.date_time_original.strftime('%L'))
151
+ assert_equal('978', j.date_time_digitized.strftime('%L'))
152
+ end
153
+
122
154
  end
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
3
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
4
4
 
5
5
  require 'stringio'
6
6
  require 'pp'
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
3
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
4
4
 
5
5
  require 'test_helper'
6
6
 
@@ -112,6 +112,7 @@ class TIFFTest < TestCase
112
112
  assert_equal('WGS84', t.gps_map_datum)
113
113
  assert_equal(54, t.gps.latitude.round)
114
114
  assert_equal(-7, t.gps.longitude.round)
115
+ assert_nil(t.gps.altitude)
115
116
 
116
117
  (all_test_exifs - %w(gps user-comment out-of-range negative-exposure-bias-value).map{|v| f("#{v}.exif")}).each do |fname|
117
118
  assert_nil TIFF.new(fname).gps_version_id
@@ -198,4 +199,11 @@ class TIFFTest < TestCase
198
199
  def test_nul_terminated_strings
199
200
  assert_equal 'GoPro', TIFF.new(f('gopro_hd2.exif')).make
200
201
  end
202
+
203
+ def test_methods_method
204
+ t = TIFF.new(f('gopro_hd2.exif'))
205
+ assert t.methods.include?(:make)
206
+ assert t.methods(true).include?(:make)
207
+ assert ! t.methods(false).include?(:make)
208
+ end
201
209
  end
metadata CHANGED
@@ -1,26 +1,51 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exifr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - R.W. van 't Veer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-10 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: test-unit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.5
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12'
13
41
  description: EXIF Reader is a module to read EXIF from JPEG and TIFF images.
14
- email: remco@remvee.net
42
+ email: exifr@remworks.net
15
43
  executables:
16
44
  - exifr
17
45
  extensions: []
18
- extra_rdoc_files:
19
- - README.rdoc
20
- - CHANGELOG
46
+ extra_rdoc_files: []
21
47
  files:
22
- - CHANGELOG
23
- - README.rdoc
48
+ - Gemfile
24
49
  - Rakefile
25
50
  - bin/exifr
26
51
  - lib/exifr.rb
@@ -38,6 +63,7 @@ files:
38
63
  - tests/data/endless-loop.exif
39
64
  - tests/data/exif.jpg
40
65
  - tests/data/gopro_hd2.exif
66
+ - tests/data/gps-altitude.jpg
41
67
  - tests/data/gps.exif
42
68
  - tests/data/image.jpg
43
69
  - tests/data/multiple-app1.jpg
@@ -46,6 +72,7 @@ files:
46
72
  - tests/data/out-of-range.exif
47
73
  - tests/data/plain.tif
48
74
  - tests/data/samsung-sc-02b.jpg
75
+ - tests/data/sony-a7ii.exif
49
76
  - tests/data/user-comment.exif
50
77
  - tests/data/weird_date.exif
51
78
  - tests/jpeg_test.rb
@@ -54,29 +81,29 @@ files:
54
81
  homepage: http://github.com/remvee/exifr/
55
82
  licenses:
56
83
  - MIT
57
- metadata: {}
58
- post_install_message:
59
- rdoc_options:
60
- - "--title"
61
- - EXIF Reader for Ruby API Documentation
62
- - "--main"
63
- - README.rdoc
84
+ metadata:
85
+ bug_tracker_uri: https://github.com/remvee/exifr/issues
86
+ changelog_uri: https://github.com/remvee/exifr/blob/master/CHANGELOG
87
+ documentation_uri: https://remvee.github.io/exifr/api/
88
+ homepage_uri: https://remvee.github.io/exifr/
89
+ source_code_uri: https://github.com/remvee/exifr
90
+ post_install_message:
91
+ rdoc_options: []
64
92
  require_paths:
65
93
  - lib
66
94
  required_ruby_version: !ruby/object:Gem::Requirement
67
95
  requirements:
68
96
  - - ">="
69
97
  - !ruby/object:Gem::Version
70
- version: '0'
98
+ version: 1.8.7
71
99
  required_rubygems_version: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - ">="
74
102
  - !ruby/object:Gem::Version
75
103
  version: '0'
76
104
  requirements: []
77
- rubyforge_project:
78
- rubygems_version: 2.6.11
79
- signing_key:
105
+ rubygems_version: 3.1.4
106
+ signing_key:
80
107
  specification_version: 4
81
108
  summary: Read EXIF from JPEG and TIFF images
82
109
  test_files: []
data/CHANGELOG DELETED
@@ -1,145 +0,0 @@
1
- EXIF Reader 1.3.2
2
- * enhancement; "Add EXIF 2.3 lens information tags"; thanks Clay Gregory
3
-
4
- EXIF Reader 1.3.1
5
- * fix executable bin/exifr
6
-
7
- EXIF Reader 1.3.0
8
- * workaround warnings when using the ruby "-w" option
9
- * NOTE: requiring only 'exifr' will nolonger provide EXIFR::JPEG or EXIFR::TIFF, require 'exifr/jpeg' or 'exifr/tiff' instead
10
-
11
- EXIF Reader 1.2.6
12
- * bug fix; "[GH#48] handle empty file as malformed jpeg"; thanks Hoàng Xuân Phú
13
-
14
- EXIF Reader 1.2.5
15
- * bug fix; "[GH#46] Having stringified methods is not a good idea"; thanks Filipe Costa
16
- * bug fix; "Fix typo in subsec_time_original key"; thanks Filipe Costa
17
-
18
- EXIF Reader 1.2.4
19
- * bug fix; "[GH#43] Fix `respond_to?` signature"; thanks Pete Johns
20
-
21
- EXIF Reader 1.2.3.1
22
- * bug fix; "[GH#41] gopro_hd2.exif is not included in the gem"; thanks Peter Wilmott
23
-
24
- EXIF Reader 1.2.3
25
- * bug fix; "[GH#40] Handle NUL-terminated ASCII strings"; thanks Malte Rohde
26
-
27
- EXIF Reader 1.2.2
28
- * bug fix; "use Reader delegator instead of adding method to File instance"; thanks Ivan Kuchin
29
-
30
- EXIF Reader 1.2.1
31
- * bug fix: Value of infinity yields division by zero error
32
-
33
- EXIF Reader 1.2.0
34
- * enhancement; "log warnings when EXIF data is malformed"
35
- * enhancement; "allow alternative Time adapter"
36
- * enhancement; "[GH#33] add reader for orientation type"; thanks Damir Svrtan
37
-
38
- EXIF Reader 1.1.3
39
- * bug fix; "[GH#27] some error when :shutter_speed_value is too big"; thanks to zamia
40
-
41
- EXIF Reader 1.1.2
42
- * bug fix; "[GH#25] Incorrect values being extracted for a number of fields"; thanks to Matthew McEachen
43
-
44
- EXIF Reader 1.1.1
45
- * feature; "added gps convenience method to make accessing location data easier (degrees to float conversion)"
46
- * bug fix; "[GH#22] Fix warnings about uninitialized @comment"; thanks to Ryan Greenberg"
47
-
48
- EXIF Reader 1.0.6
49
- * bug fix: "[GH#20] `readlong': undefined method `unpack' for nil:NilClass (NoMethodError)"
50
-
51
- EXIF Reader 1.0.5
52
- * bug fix: "[GH#19] files opened by TIFF initialize were not being closed"; thanks to Joe Van Overberghe
53
-
54
- EXIF Reader 1.0.4
55
- * bug fix: "[GH#17] avoid library search path pollution"
56
- * enhancement: "[GH#18] add EXIFR::JPEG#app1s method"
57
-
58
- EXIF Reader 1.0.3
59
- * enhancement; "raise specific exception to allow better error handling"; thanks to James Miller
60
-
61
- EXIF Reader 1.0.2
62
- * bug fix; "[GH#9/12] no block given"; thanks to Ian Leitch
63
-
64
- EXIF Reader 1.0.1
65
- * bug fix; "[GH#7] Unable to properly display exposure_bias_value"; thanks to John Krueger
66
-
67
- EXIF Reader 1.0.0
68
- * bug fix; "ArgumentError: invalid byte sequence in UTF-8" when reading messy field using Ruby 1.9+
69
- * enhancement; "[GH#4] more informative inspect for EXIFR::TIFF::Orientation instance"
70
- * bug fix; "[GH#6] ERROR RuntimeError: can't add a new key into hash during iteration"; thanks to KISHIMOTO, Makoto
71
-
72
- EXIF Reader 0.10.9
73
- * bug fix; "[GH#1] user_comment returns nil for jpeg with UserComment"; thanks to Mark Lundquist
74
- * bug fix; "[GH#2] Nil pointer in tiff.rb"
75
- * enhancement; "don't read entire files into memory"; thanks to Victor Bogado
76
-
77
- EXIF Reader 0.10.8
78
- * feature request; "[#23694] The object interface of JPEG is different from the TIFF one."
79
-
80
- EXIF Reader 0.10.7
81
- * bug fix; "[#22403] Wrong file size reported"
82
-
83
- EXIF Reader 0.10.6.1
84
- * moved to GitHub
85
-
86
- EXIF Reader 0.10.6
87
- * bug fix (thanks to Forian Munz for reporting it); endless loop when reading a malformed EXIF/TIFF
88
-
89
- EXIF Reader 0.10.5
90
- * bug fix; "[#15421] duplicate orientation field behavior", first field (of any type) is leading now
91
- * Ruby 1.9 compatible
92
-
93
- EXIF Reader 0.10.4
94
- * Thumbnail extraction; [#15317] Please add thumbnail extraction
95
-
96
- EXIF Reader 0.10.3
97
- * YAML friendly; can now safely (de)serialize
98
-
99
- EXIF Reader 0.10.2
100
- * bug fix (thanks to Alexander Staubo for providing me with sample data);
101
- don't fail on out-of-range IFD offsets for Apple Aperture generated JPGs
102
-
103
- EXIF Reader 0.10.1
104
- * old style exif access
105
-
106
- EXIF Reader 0.10
107
- * TIFF support
108
-
109
- EXIF Reader 0.9.6
110
- * bug fix; "[#8458] Conversion from string to Time fails", weird dates will now reflect nil
111
-
112
- EXIF Reader 0.9.5.1
113
- * make tinderbox happy by hiding rcov task
114
-
115
- EXIF Reader 0.9.5
116
- * patch calls to jpeg through to exif, i.e. jpeg., i.e. jpeg.model == jpeg.exif.model
117
- * fix exifr commandline utility, needs require 'exifr' now
118
- * improve test helper
119
- * reduce size of test images
120
- * include tests for tinderbox
121
-
122
- EXIF Reader 0.9.4
123
- * bug fix (thanks to Benjamin Storrier for providing me with sample date);
124
- multiple app1 frames will potentially overwrite EXIF tag
125
-
126
- EXIF Reader 0.9.3
127
- * bug fix; "[#4876] Unable to extract gpsinfo"
128
- * one-off bug in TiffHeader found and fixed
129
- * make "InteroperabilityIndex" available
130
-
131
- EXIF Reader 0.9.2
132
- * bug fix; "[#4595] EXIFR::JPEG doesn't support multiple comments", the
133
- comment property of a JPEG object now contains an array instead of a string
134
- when multiple COM frames are found
135
- * EXIF orientation modules including RMagick code to rotate to viewable state
136
- * access to thumbnail included in EXIF
137
- * simple commandline utility, "exifr", to view image properties
138
- * overall code improvements including documentation and tests
139
-
140
- EXIF Reader 0.9.1
141
- * bug fix; "4321 Can't create object", division by zero when
142
- denominator of rational value is zero
143
-
144
- EXIF Reader 0.9
145
- * 1st release
@@ -1,57 +0,0 @@
1
- = EXIF Reader
2
- {<img src="https://badge.fury.io/rb/exifr.svg" alt="Gem Version" />}[https://badge.fury.io/rb/exifr]
3
- {<img src="https://circleci.com/gh/remvee/exifr/tree/master.svg?style=shield&circle-token=7d957be2d7195f5d07a7c1962926ee626b050c2e" alt="Circle CI" />}[https://circleci.com/gh/remvee/exifr]
4
-
5
- EXIF Reader is a module to read metadata from JPEG and TIFF images.
6
-
7
- == Examples
8
- require 'exifr/jpeg'
9
- EXIFR::JPEG.new('IMG_6841.JPG').width # => 2272
10
- EXIFR::JPEG.new('IMG_6841.JPG').height # => 1704
11
- EXIFR::JPEG.new('IMG_6841.JPG').exif? # => true
12
- EXIFR::JPEG.new('IMG_6841.JPG').model # => "Canon PowerShot G3"
13
- EXIFR::JPEG.new('IMG_6841.JPG').date_time # => Fri Feb 09 16:48:54 +0100 2007
14
- EXIFR::JPEG.new('IMG_6841.JPG').exposure_time.to_s # => "1/15"
15
- EXIFR::JPEG.new('IMG_6841.JPG').f_number.to_f # => 2.0
16
- EXIFR::JPEG.new('enkhuizen.jpg').gps.latitude # => 52.7197888888889
17
- EXIFR::JPEG.new('enkhuizen.jpg').gps.longitude # => 5.28397777777778
18
-
19
- require 'exifr/tiff'
20
- EXIFR::TIFF.new('DSC_0218.TIF').width # => 3008
21
- EXIFR::TIFF.new('DSC_0218.TIF')[1].width # => 160
22
- EXIFR::TIFF.new('DSC_0218.TIF').model # => "NIKON D1X"
23
- EXIFR::TIFF.new('DSC_0218.TIF').date_time # => Tue May 23 19:15:32 +0200 2006
24
- EXIFR::TIFF.new('DSC_0218.TIF').exposure_time.to_s # => "1/100"
25
- EXIFR::TIFF.new('DSC_0218.TIF').f_number.to_f # => 5.0
26
-
27
- == Logging warnings
28
- When EXIF information is malformed, a warning is logged to STDERR with
29
- the standard Ruby logger. Log to some other location by supplying an
30
- alternative implementation:
31
-
32
- EXIFR.logger = SyslogLogger.new
33
-
34
- == Time zone support
35
- EXIF does not support time zones so this code does not support time
36
- zones. All time stamps are created in the local time zone with:
37
-
38
- Time.local(..)
39
-
40
- It is possible to change this behavior by supplying an alternative
41
- implementation. For those who prefer UTC:
42
-
43
- EXIFR::TIFF.mktime_proc = proc{|*args| Time.utc(*args)}
44
-
45
- Or when the application depends on ActiveSupport for time zone handling:
46
-
47
- EXIFR::TIFF.mktime_proc = proc{|*args| Time.zone.local(*args)}
48
-
49
- == XMP data access
50
- If you need to access XMP data you can use the xmp gem. More info and
51
- examples at https://github.com/amberbit/xmp
52
-
53
- == Author
54
- R.W. van 't Veer
55
-
56
- == Copyright
57
- Copyright (c) 2006-2017 - R.W. van 't Veer