exiftool_vendored 12.76.1 → 12.81.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +105 -4
  3. data/bin/MANIFEST +29 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +4 -3
  7. data/bin/config_files/acdsee.config +37 -57
  8. data/bin/config_files/example.config +16 -2
  9. data/bin/exiftool +102 -31
  10. data/bin/lib/Image/ExifTool/Canon.pm +12 -9
  11. data/bin/lib/Image/ExifTool/CanonVRD.pm +8 -2
  12. data/bin/lib/Image/ExifTool/Exif.pm +52 -4
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +14 -5
  14. data/bin/lib/Image/ExifTool/GPS.pm +5 -3
  15. data/bin/lib/Image/ExifTool/GeoLang/cs.pm +978 -0
  16. data/bin/lib/Image/ExifTool/GeoLang/de.pm +1975 -0
  17. data/bin/lib/Image/ExifTool/GeoLang/en_ca.pm +44 -0
  18. data/bin/lib/Image/ExifTool/GeoLang/en_gb.pm +124 -0
  19. data/bin/lib/Image/ExifTool/GeoLang/es.pm +2921 -0
  20. data/bin/lib/Image/ExifTool/GeoLang/fi.pm +1116 -0
  21. data/bin/lib/Image/ExifTool/GeoLang/fr.pm +3171 -0
  22. data/bin/lib/Image/ExifTool/GeoLang/it.pm +2750 -0
  23. data/bin/lib/Image/ExifTool/GeoLang/ja.pm +10256 -0
  24. data/bin/lib/Image/ExifTool/GeoLang/ko.pm +4499 -0
  25. data/bin/lib/Image/ExifTool/GeoLang/nl.pm +1270 -0
  26. data/bin/lib/Image/ExifTool/GeoLang/pl.pm +3019 -0
  27. data/bin/lib/Image/ExifTool/GeoLang/ru.pm +18220 -0
  28. data/bin/lib/Image/ExifTool/GeoLang/sk.pm +441 -0
  29. data/bin/lib/Image/ExifTool/GeoLang/sv.pm +714 -0
  30. data/bin/lib/Image/ExifTool/GeoLang/tr.pm +452 -0
  31. data/bin/lib/Image/ExifTool/GeoLang/zh_cn.pm +2225 -0
  32. data/bin/lib/Image/ExifTool/GeoLang/zh_tw.pm +72 -0
  33. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  34. data/bin/lib/Image/ExifTool/Geolocation.pm +935 -0
  35. data/bin/lib/Image/ExifTool/Geotag.pm +14 -2
  36. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -1
  37. data/bin/lib/Image/ExifTool/Import.pm +5 -2
  38. data/bin/lib/Image/ExifTool/JSON.pm +15 -10
  39. data/bin/lib/Image/ExifTool/M2TS.pm +32 -4
  40. data/bin/lib/Image/ExifTool/MWG.pm +1 -0
  41. data/bin/lib/Image/ExifTool/MacOS.pm +19 -4
  42. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  43. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Nikon.pm +331 -23
  45. data/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
  46. data/bin/lib/Image/ExifTool/Ogg.pm +3 -2
  47. data/bin/lib/Image/ExifTool/Olympus.pm +4 -1
  48. data/bin/lib/Image/ExifTool/OpenEXR.pm +37 -19
  49. data/bin/lib/Image/ExifTool/PDF.pm +5 -5
  50. data/bin/lib/Image/ExifTool/PNG.pm +3 -3
  51. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  52. data/bin/lib/Image/ExifTool/QuickTime.pm +195 -12
  53. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  54. data/bin/lib/Image/ExifTool/README +6 -5
  55. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +4871 -4752
  57. data/bin/lib/Image/ExifTool/TagNames.pod +722 -383
  58. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +43 -9
  59. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  60. data/bin/lib/Image/ExifTool/Writer.pl +65 -8
  61. data/bin/lib/Image/ExifTool/XMP.pm +18 -2
  62. data/bin/lib/Image/ExifTool/XMP2.pl +64 -0
  63. data/bin/lib/Image/ExifTool.pm +265 -49
  64. data/bin/lib/Image/ExifTool.pod +63 -25
  65. data/bin/perl-Image-ExifTool.spec +2 -2
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +22 -2
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.76';
32
+ $VERSION = '12.81';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -103,6 +103,7 @@ sub VerboseValue($$$;$);
103
103
  sub VPrint($$@);
104
104
  sub Rationalize($;$);
105
105
  sub Write($@);
106
+ sub GetGeolocateTags($$;$);
106
107
  sub WriteTrailerBuffer($$$);
107
108
  sub AddNewTrailers($;@);
108
109
  sub Tell($);
@@ -920,7 +921,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
920
921
  DICOM=> '(.{128}DICM|\0[\x02\x04\x06\x08]\0[\0-\x20]|[\x02\x04\x06\x08]\0[\0-\x20]\0)',
921
922
  DOCX => 'PK\x03\x04',
922
923
  DPX => '(SDPX|XPDS)',
923
- DR4 => 'IIII\x04\0\x04\0',
924
+ DR4 => 'IIII[\x04|\x05]\0\x04\0',
924
925
  DSS => '(\x02dss|\x03ds2)',
925
926
  DV => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
926
927
  DWF => '\(DWF V\d',
@@ -953,7 +954,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
953
954
  JPEG => '\xff\xd8\xff',
954
955
  JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
955
956
  JUMBF=> '.{4}jumb\0.{3}jumd',
956
- JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
957
+ JXL => '(\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )',
957
958
  LFP => '\x89LFP\x0d\x0a\x1a\x0a',
958
959
  LIF => '\x70\0{3}.{4}\x2a.{4}<\0',
959
960
  LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
@@ -1101,6 +1102,11 @@ my @availableOptions = (
1101
1102
  [ 'Filter', undef, 'output filter for all tag values' ],
1102
1103
  [ 'FilterW', undef, 'input filter when writing tag values' ],
1103
1104
  [ 'FixBase', undef, 'fix maker notes base offsets' ],
1105
+ [ 'Geolocation', undef, 'generate geolocation tags' ],
1106
+ [ 'GeolocAltNames', 1, 'search alternate city names if available' ],
1107
+ [ 'GeolocFeature', undef, 'regular expression of geolocation features to match' ],
1108
+ [ 'GeolocMinPop', undef, 'minimum geolocation population' ],
1109
+ [ 'GeolocMaxDist', undef, 'maximum geolocation distance' ],
1104
1110
  [ 'GeoMaxIntSecs', 1800, 'geotag maximum interpolation time (secs)' ],
1105
1111
  [ 'GeoMaxExtSecs', 1800, 'geotag maximum extrapolation time (secs)' ],
1106
1112
  [ 'GeoMaxHDOP', undef, 'geotag maximum HDOP' ],
@@ -1168,6 +1174,7 @@ my @defaultWriteGroups = qw(
1168
1174
 
1169
1175
  # group hash for ExifTool-generated tags
1170
1176
  my %allGroupsExifTool = ( 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'ExifTool' );
1177
+ my %geoInfo = ( Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Location' }, Priority => 0 );
1171
1178
 
1172
1179
  # special tag names (not used for tag info)
1173
1180
  %specialTags = map { $_ => 1 } qw(
@@ -1197,7 +1204,7 @@ sub DummyWriteProc { return 1; }
1197
1204
 
1198
1205
  my %systemTagsNotes = (
1199
1206
  Notes => q{
1200
- extracted only if specifically requested or the L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll> API
1207
+ extracted only if specifically requested or the API L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll>
1201
1208
  option is set
1202
1209
  },
1203
1210
  );
@@ -1480,7 +1487,7 @@ my %systemTagsNotes = (
1480
1487
  FileAttributes => {
1481
1488
  Groups => { 1 => 'System', 2 => 'Other' },
1482
1489
  Notes => q{
1483
- extracted only if specifically requested or the L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll> API
1490
+ extracted only if specifically requested or the API L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll>
1484
1491
  option is set. 2 or 3 values: 0. File type, 1. Attribute bits, 2. Windows
1485
1492
  attribute bits if Win32API::File is available
1486
1493
  },
@@ -1535,7 +1542,7 @@ my %systemTagsNotes = (
1535
1542
  FileUserID => {
1536
1543
  Groups => { 1 => 'System', 2 => 'Other' },
1537
1544
  Notes => q{
1538
- extracted only if specifically requested or the L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll> API
1545
+ extracted only if specifically requested or the API L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll>
1539
1546
  option is set. Returns user ID number with the -n option, or name
1540
1547
  otherwise. May be written with either user name or number
1541
1548
  },
@@ -1549,7 +1556,7 @@ my %systemTagsNotes = (
1549
1556
  FileGroupID => {
1550
1557
  Groups => { 1 => 'System', 2 => 'Other' },
1551
1558
  Notes => q{
1552
- extracted only if specifically requested or the L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll> API
1559
+ extracted only if specifically requested or the API L<SystemTags|../ExifTool.html#SystemTags> or L<RequestAll|../ExifTool.html#RequestAll>
1553
1560
  option is set. Returns group ID number with the -n option, or name
1554
1561
  otherwise. May be written with either group name or number
1555
1562
  },
@@ -1685,7 +1692,7 @@ my %systemTagsNotes = (
1685
1692
  Flags => ['Writable' ,'Protected', 'Binary'],
1686
1693
  Permanent => 0, # (this is 1 by default for MakerNotes tags)
1687
1694
  WriteCheck => q{
1688
- return undef if $val =~ /^IIII\x04\0\x04\0/;
1695
+ return undef if $val =~ /^IIII[\x04|\x05]\0\x04\0/;
1689
1696
  return 'Invalid CanonDR4 data';
1690
1697
  },
1691
1698
  },
@@ -1749,6 +1756,11 @@ my %systemTagsNotes = (
1749
1756
  Notes => 'PDF-format embedded preview image',
1750
1757
  Binary => 1,
1751
1758
  },
1759
+ PreviewJXL => {
1760
+ Groups => { 2 => 'Preview' },
1761
+ Notes => 'JXL-format embedded preview image',
1762
+ Binary => 1,
1763
+ },
1752
1764
  ExifByteOrder => {
1753
1765
  Writable => 1,
1754
1766
  DelCheck => q{"Can't delete"},
@@ -1787,7 +1799,7 @@ my %systemTagsNotes = (
1787
1799
  Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Other' },
1788
1800
  Notes => q{
1789
1801
  the clock time in seconds taken by ExifTool to extract information from this
1790
- file. Not generated unless specifically requested or the L<RequestAll|../ExifTool.html#RequestAll> API
1802
+ file. Not generated unless specifically requested or the API L<RequestAll|../ExifTool.html#RequestAll>
1791
1803
  option is set. Requires Time::HiRes
1792
1804
  },
1793
1805
  PrintConv => 'sprintf("%.3g s", $val)',
@@ -1928,7 +1940,7 @@ my %systemTagsNotes = (
1928
1940
  Groups => { 0 => 'Trailer' },
1929
1941
  Notes => q{
1930
1942
  the full JPEG trailer data block. Extracted only if specifically requested
1931
- or the API RequestAll option is set to 3 or higher
1943
+ or the API L<RequestAll|../ExifTool.html#RequestAll> option is set to 3 or higher
1932
1944
  },
1933
1945
  Writable => 1,
1934
1946
  Protected => 1,
@@ -1957,6 +1969,92 @@ my %systemTagsNotes = (
1957
1969
  the this hash value and the hash type in the file.
1958
1970
  },
1959
1971
  },
1972
+ Geolocate => {
1973
+ Writable => 1,
1974
+ WriteOnly => 1,
1975
+ WriteNothing => 1,
1976
+ AllowGroup => '(exif|gps|xmp|xmp-exif|xmp-iptcext|xmp-iptccore|xmp-photoshop|iptc|quicktime|itemlist|keys|userdata)',
1977
+ Notes => q{
1978
+ this write-only tag may be used to write geolocation city, region, country
1979
+ code and country based in input GPS coordinates, or to write GPS
1980
+ coordinates based on geolocation name. See the
1981
+ L<Writing section of the Geolocation page|../geolocation.html#Write> for
1982
+ details. This tag is writable regardless of the API L<Geolocation|../ExifTool.html#Geolocation>
1983
+ option setting
1984
+ },
1985
+ DelCheck => q{
1986
+ my @tags = $self->GetGeolocateTags($wantGroup);
1987
+ $self->SetNewValue($_) foreach @tags;
1988
+ return '';
1989
+ },
1990
+ ValueConvInv => q{
1991
+ require Image::ExifTool::Geolocation;
1992
+ # write this tag later if geotagging
1993
+ return $val if $val =~ /\bgeotag\b/i;
1994
+ $val .= ',both';
1995
+ my $opts = $$self{OPTIONS};
1996
+ my ($n, $i, $km, $be) = Image::ExifTool::Geolocation::Geolocate($self->Encode($val,'UTF8'), $opts);
1997
+ return '' unless $n;
1998
+ if ($n > 1 and $self->Warn('Multiple matching cities found',2)) {
1999
+ warn "$$self{VALUE}{Warning}\n";
2000
+ return '';
2001
+ }
2002
+ my @geo = Image::ExifTool::Geolocation::GetEntry($i, $$opts{Lang});
2003
+ my @tags = $self->GetGeolocateTags($wantGroup, $km ? 0 : 1);
2004
+ my %geoNum = ( City => 0, Province => 1, State => 1, Code => 3, Country => 4,
2005
+ Coordinates => 89, Latitude => 8, Longitude => 9 );
2006
+ my ($tag, $value);
2007
+ foreach $tag (@tags) {
2008
+ if ($tag =~ /GPS(Coordinates|Latitude|Longitude)?/) {
2009
+ $value = $geoNum{$1} == 89 ? "$geo[8],$geo[9]" : $geo[$geoNum{$1}];
2010
+ } elsif ($tag =~ /(Code)/ or $tag =~ /(City|Province|State|Country)/) {
2011
+ $value = $geo[$geoNum{$1}];
2012
+ next unless defined $value;
2013
+ $value = $self->Decode($value,'UTF8');
2014
+ $value .= ' ' if $tag eq 'iptc:Country-PrimaryLocationCode'; # (IPTC requires 3-char code)
2015
+ } elsif ($tag =~ /LocationName/) {
2016
+ $value = $geo[0] or next;
2017
+ $value .= ', ' . $geo[1] if $geo[1];
2018
+ $value .= ', ' . $geo[4] if $geo[4];
2019
+ $value = $self->Decode($value, 'UTF8');
2020
+ } else {
2021
+ next; # (shouldn't happen)
2022
+ }
2023
+ $self->SetNewValue($tag => $value, Type => 'PrintConv');
2024
+ }
2025
+ return '';
2026
+ },
2027
+ PrintConvInv => q{
2028
+ my @args = split /\s*,\s*/, $val;
2029
+ my $lat = 1;
2030
+ foreach (@args) {
2031
+ next unless /^[-+]?\d/;
2032
+ require Image::ExifTool::GPS;
2033
+ $_ = Image::ExifTool::GPS::ToDegrees($_, 1, $lat ? 'lat' : 'lon');
2034
+ $lat ^= 1;
2035
+ }
2036
+ return join(',', @args);
2037
+ },
2038
+ },
2039
+ GeolocationBearing => { %geoInfo,
2040
+ Notes => q{
2041
+ compass bearing to GeolocationCity center. Geolocation tags are
2042
+ generated only if API L<Geolocation|../ExifTool.html#Geolocation> option is set
2043
+ },
2044
+ },
2045
+ GeolocationCity => { %geoInfo, Notes => 'name of city nearest to the current GPS coordinates', ValueConv => '$self->Decode($val,"UTF8")' },
2046
+ GeolocationRegion => { %geoInfo, Notes => 'geolocation state, province or region', ValueConv => '$self->Decode($val,"UTF8")' },
2047
+ GeolocationSubregion=> { %geoInfo, Notes => 'geolocation county or subregion', ValueConv => '$self->Decode($val,"UTF8")' },
2048
+ GeolocationCountry => { %geoInfo, Notes => 'geolocation country name', ValueConv => '$self->Decode($val,"UTF8")' },
2049
+ GeolocationCountryCode=>{%geoInfo, Notes => 'geolocation country code' },
2050
+ GeolocationTimeZone => { %geoInfo, Notes => 'geolocation time zone name' },
2051
+ GeolocationFeatureCode=>{%geoInfo, Notes => 'feature code, see L<http://www.geonames.org/export/codes.html#P>' },
2052
+ GeolocationPopulation=>{ %geoInfo, Notes => 'city population rounded to 2 significant digits' },
2053
+ GeolocationDistance => { %geoInfo, Notes => 'distance in km from current GPS to city', PrintConv => '"$val km"' },
2054
+ GeolocationPosition => { %geoInfo, Notes => 'approximate GPS coordinates of city',
2055
+ PrintConv => '$val =~ s/ /, /; $val',
2056
+ },
2057
+ GeolocationWarning => { %geoInfo },
1960
2058
  );
1961
2059
 
1962
2060
  # tags defined by UserParam option (added at runtime)
@@ -2563,6 +2661,7 @@ sub ExtractInfo($;@)
2563
2661
  }
2564
2662
  # initialize ExifTool object members
2565
2663
  $self->Init();
2664
+ $$self{InExtract} = 1; # set flag indicating we are inside ExtractInfo
2566
2665
 
2567
2666
  delete $$self{MAKER_NOTE_FIXUP}; # fixup information for extracted maker notes
2568
2667
  delete $$self{MAKER_NOTE_BYTE_ORDER};
@@ -2738,8 +2837,9 @@ sub ExtractInfo($;@)
2738
2837
  if ($isDir or (defined $stat[2] and ($stat[2] & 0170000) == 0040000)) {
2739
2838
  $self->FoundTag('FileType', 'DIR');
2740
2839
  $self->FoundTag('FileTypeExtension', '');
2741
- $self->ExtractAltInfo();
2840
+ $self->DoneExtract();
2742
2841
  $raf->Close() if $raf;
2842
+ delete $$self{InExtract} unless $reEntry;
2743
2843
  return 1;
2744
2844
  }
2745
2845
  # get list of file types to check
@@ -2756,7 +2856,7 @@ sub ExtractInfo($;@)
2756
2856
  } else {
2757
2857
  $self->Error('Unknown file type');
2758
2858
  }
2759
- $self->ExtractAltInfo();
2859
+ $self->DoneExtract();
2760
2860
  last; # don't read the file
2761
2861
  }
2762
2862
  if (@fileTypeList) {
@@ -2924,7 +3024,7 @@ sub ExtractInfo($;@)
2924
3024
  }
2925
3025
  unless ($reEntry) {
2926
3026
  $$self{PATH} = [ ]; # reset PATH
2927
- $self->ExtractAltInfo();
3027
+ $self->DoneExtract();
2928
3028
  # do our HTML dump if requested
2929
3029
  if ($$self{HTML_DUMP}) {
2930
3030
  $raf->Seek(0, 2); # seek to end of file
@@ -2959,27 +3059,10 @@ sub ExtractInfo($;@)
2959
3059
  last; # (loop was a cheap "goto")
2960
3060
  }
2961
3061
 
2962
- # generate Validate tag if requested
2963
- if ($$options{Validate} and not $reEntry) {
2964
- Image::ExifTool::Validate::FinishValidate($self, $$req{validate});
2965
- }
2966
-
3062
+ # Note: This should be the only tag generated after BuildCompositeTags,
3063
+ # and as such it can't be used in user-defined Composite tags
2967
3064
  @startTime and $self->FoundTag('ProcessingTime', Time::HiRes::tv_interval(\@startTime));
2968
3065
 
2969
- # add user-defined parameters that ended with '!'
2970
- if (%{$$options{UserParam}}) {
2971
- my $doMsg = $$options{Verbose};
2972
- my $table = GetTagTable('Image::ExifTool::UserParam');
2973
- foreach (sort keys %{$$options{UserParam}}) {
2974
- next unless /#$/;
2975
- if ($doMsg) {
2976
- $self->VPrint(0, "UserParam tags:\n");
2977
- undef $doMsg;
2978
- }
2979
- $self->HandleTag($table, $_, $$options{UserParam}{$_});
2980
- }
2981
- }
2982
-
2983
3066
  # restore original options
2984
3067
  %saveOptions and $$self{OPTIONS} = \%saveOptions;
2985
3068
 
@@ -2987,14 +3070,8 @@ sub ExtractInfo($;@)
2987
3070
  # restore necessary members when exiting re-entrant code
2988
3071
  $$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
2989
3072
  SetByteOrder($saveOrder);
2990
- } elsif ($$self{ImageDataHash}) {
2991
- my $digest = $$self{ImageDataHash}->hexdigest;
2992
- # (don't store empty digest)
2993
- $self->FoundTag(ImageDataHash => $digest) unless
2994
- $digest eq 'd41d8cd98f00b204e9800998ecf8427e' or
2995
- $digest eq 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' or
2996
- $digest eq 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
2997
3073
  }
3074
+ delete $$self{InExtract} unless $reEntry;
2998
3075
 
2999
3076
  # ($type may be undef without an Error when processing sub-documents)
3000
3077
  return 0 if not defined $type or exists $$self{VALUE}{Error};
@@ -3014,8 +3091,13 @@ sub GetInfo($;@)
3014
3091
  {
3015
3092
  local $_;
3016
3093
  my $self = shift;
3017
- my %saveOptions;
3094
+ my (%saveOptions, @saveMembers, @savedMembers);
3018
3095
 
3096
+ # save necessary members to allow GetInfo to be called from within ExtractInfo
3097
+ if ($$self{InExtract}) {
3098
+ @saveMembers = qw(REQUESTED_TAGS REQ_TAG_LOOKUP IO_TAG_LIST);
3099
+ @savedMembers = @$self{@saveMembers};
3100
+ }
3019
3101
  unless (@_ and not defined $_[0]) {
3020
3102
  %saveOptions = %{$$self{OPTIONS}}; # save original options
3021
3103
  # must set FILENAME so it isn't parsed from the arguments
@@ -3098,8 +3180,9 @@ sub GetInfo($;@)
3098
3180
  @{$$self{IO_TAG_LIST}} = $self->GetTagList($rtnTags, $sort, $$self{OPTIONS}{Sort2});
3099
3181
  }
3100
3182
 
3101
- # restore original options
3183
+ # restore original options and member variables
3102
3184
  %saveOptions and $$self{OPTIONS} = \%saveOptions;
3185
+ @$self{@saveMembers} = @savedMembers if @saveMembers;
3103
3186
 
3104
3187
  return \%info;
3105
3188
  }
@@ -4164,17 +4247,147 @@ sub CombineInfo($;@)
4164
4247
  }
4165
4248
 
4166
4249
  #------------------------------------------------------------------------------
4167
- # Read metadata from alternate files and build composite tags
4250
+ # Finish generating tags after extracting information from a file
4168
4251
  # Inputs: 0) ExifTool ref
4169
- # Notes: This is called after reading the main file so the tags are available
4170
- # for being used in the file name, but before building Composite tags
4171
- # so tags from the alternate files may be used in the Composite tags
4172
- sub ExtractAltInfo($)
4252
+ # Notes: The sequencing here is a bit tricky because tags from the main file
4253
+ # may be used in the names of alternate files, so we finish generating
4254
+ # all main file tags first (including all Composite tags which don't
4255
+ # rely on alternate files) before extracting tags from alternate files,
4256
+ # then we finish by generating the remaingin Composite tags.
4257
+ sub DoneExtract($)
4173
4258
  {
4174
4259
  my $self = shift;
4175
4260
  # extract information from alternate files if necessary
4176
4261
  my ($g8, $altExifTool);
4177
4262
  my $opts = $$self{OPTIONS};
4263
+
4264
+ # generate ImageDataHash if requested
4265
+ if ($$self{ImageDataHash}) {
4266
+ my $digest = $$self{ImageDataHash}->hexdigest;
4267
+ # (don't store empty digest)
4268
+ $self->FoundTag(ImageDataHash => $digest) unless
4269
+ $digest eq 'd41d8cd98f00b204e9800998ecf8427e' or
4270
+ $digest eq 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' or
4271
+ $digest eq 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
4272
+ }
4273
+ # generate Validate tag if requested
4274
+ if ($$opts{Validate}) {
4275
+ Image::ExifTool::Validate::FinishValidate($self, $$self{REQ_TAG_LOOKUP}{validate});
4276
+ }
4277
+ # generate geolocation tags if requested
4278
+ if ($$opts{Geolocation}) {
4279
+ my ($arg, @defaults, @tags, $tag, @coord, @ref, @city, $doneCity, $both);
4280
+ my $geoOpt = $$opts{Geolocation};
4281
+ my @args = split /\s*,\s*/, $$opts{Geolocation};
4282
+ foreach $arg (@args) {
4283
+ lc $arg eq 'both' and $both = 1, next;
4284
+ $arg !~ s/^\$// and push(@defaults, $arg), next;
4285
+ push @tags, $arg; # argument is a tag name
4286
+ }
4287
+ unless (@tags) {
4288
+ # default tags to read if not specified
4289
+ @tags = qw(GPSLatitude GPSLongitude GPSLatitudeRef GPSLongitudeRef
4290
+ GPSCoordinates LocationShownGPSLatitude LocationShownGPSLongitude
4291
+ XMP:City State CountryCode Country
4292
+ IPTC:City Province-State Country-PrimaryLocationCode Country-PrimaryLocationName
4293
+ LocationShownCity LocationShownProvinceState LocationShownCountryCode LocationShownCountryName);
4294
+ }
4295
+ # get information for specified tags
4296
+ my $info = $self->GetInfo(\@tags, { PrintConv => 0, Duplicates => 0 }); # (returns tags in proper case)
4297
+ $opts = $$self{OPTIONS}; # (necessary because GetInfo changes the OPTIONS hash)
4298
+ foreach $tag (@tags) {
4299
+ my $val = $$info{$tag};
4300
+ next unless defined $val;
4301
+ $self->VPrint(0, "Found $tag ($val)\n");
4302
+ if ($tag =~ /Coordinates/) {
4303
+ next if defined $coord[0] and defined $coord[1];
4304
+ @coord = split ' ', $val;
4305
+ next;
4306
+ }
4307
+ my $n = $tag =~ /Latitude/ ? 0 : ($tag =~ /Longitude/ ? 1 : undef);
4308
+ if (defined $n) {
4309
+ if ($tag =~ /Ref$/) {
4310
+ $ref[$n] = $val unless $ref[$n];
4311
+ } else {
4312
+ $coord[$n] = $val unless defined $coord[$n];
4313
+ }
4314
+ next;
4315
+ }
4316
+ # handle city tags (save info for first city found)
4317
+ if ($tag =~ /City/) {
4318
+ @city and $doneCity = 1, next;
4319
+ push @city, $val;
4320
+ } elsif (@city) {
4321
+ push @city, $val unless $doneCity;
4322
+ next if $doneCity;
4323
+ }
4324
+ }
4325
+ if (defined $coord[0] and defined $coord[1]) {
4326
+ $coord[0] = -$coord[0] if $ref[0] and $coord[0] > 0 and $ref[0] eq 'S';
4327
+ $coord[1] = -$coord[1] if $ref[1] and $coord[1] > 0 and $ref[1] eq 'W';
4328
+ $arg = join ',', @coord;
4329
+ } elsif (@city) {
4330
+ $arg = join ',', @city;
4331
+ }
4332
+ if (not defined $arg) {
4333
+ # use specified default values if no tags found
4334
+ $arg = join ',', @defaults;
4335
+ undef $arg if $arg eq '1';
4336
+ $both = 1; # use 'both' GPS and place names if provided
4337
+ }
4338
+ if ($arg) {
4339
+ $arg .= ',both' if $both;
4340
+ $arg = $self->Encode($arg, 'UTF8');
4341
+ require Image::ExifTool::Geolocation;
4342
+ if ($$opts{Verbose}) {
4343
+ if ($Image::ExifTool::Geolocation::dbInfo) {
4344
+ print "Loaded $Image::ExifTool::Geolocation::dbInfo\n";
4345
+ } else {
4346
+ print "Error loading Geolocation.dat\n";
4347
+ }
4348
+ }
4349
+ local $SIG{'__WARN__'} = \&SetWarning;
4350
+ undef $evalWarning;
4351
+ $$opts{GeolocMulti} = $$opts{Duplicates};
4352
+ my ($n, $i, $km, $be) = Image::ExifTool::Geolocation::Geolocate($arg, $opts);
4353
+ delete $$opts{GeolocMulti};
4354
+ # ($i will be an ARRAY ref if multiple matches were found and the Duplicates option is set)
4355
+ if ($n and (ref $i or $n < 2 or not $self->Warn('Multiple Geolocation cities are possible',2))) {
4356
+ my $list = ref $i ? $i : [ $i ]; # make a list if not done alreaday
4357
+ foreach $i (@$list) {
4358
+ my @geo = Image::ExifTool::Geolocation::GetEntry($i, $$opts{Lang});
4359
+ $self->FoundTag(GeolocationCity => $geo[0]);
4360
+ $self->FoundTag(GeolocationRegion => $geo[1]) if $geo[1];
4361
+ $self->FoundTag(GeolocationSubregion => $geo[2]) if $geo[2];
4362
+ $self->FoundTag(GeolocationCountryCode => $geo[3]);
4363
+ $self->FoundTag(GeolocationCountry => $geo[4]) if $geo[4];
4364
+ $self->FoundTag(GeolocationTimeZone => $geo[5]) if $geo[5];
4365
+ $self->FoundTag(GeolocationFeatureCode => $geo[6]);
4366
+ $self->FoundTag(GeolocationPopulation => $geo[7]);
4367
+ $self->FoundTag(GeolocationPosition => "$geo[8] $geo[9]");
4368
+ next if $i != $$list[0];
4369
+ $self->FoundTag(GeolocationDistance => $km) if defined $km;
4370
+ $self->FoundTag(GeolocationBearing => $be) if defined $be;
4371
+ $self->FoundTag(GeolocationWarning => "Search matched $n cities") if $n > 1;
4372
+ }
4373
+ } elsif ($evalWarning) {
4374
+ $self->Warn(CleanWarning());
4375
+ }
4376
+ }
4377
+ }
4378
+ # generate tags for user-defined parameters that ended with '#'
4379
+ if (%{$$opts{UserParam}}) {
4380
+ my $doMsg = $$opts{Verbose};
4381
+ my $table = GetTagTable('Image::ExifTool::UserParam');
4382
+ foreach (sort keys %{$$opts{UserParam}}) {
4383
+ next unless /#$/;
4384
+ if ($doMsg) {
4385
+ $self->VPrint(0, "UserParam tags:\n");
4386
+ undef $doMsg;
4387
+ }
4388
+ $self->HandleTag($table, $_, $$opts{UserParam}{$_});
4389
+ }
4390
+ }
4178
4391
  if ($$opts{Composite} and (not $$opts{FastScan} or $$opts{FastScan} < 5)) {
4179
4392
  # build all composite tags except those requiring tags from alternate files
4180
4393
  $self->BuildCompositeTags();
@@ -4185,6 +4398,7 @@ sub ExtractAltInfo($)
4185
4398
  $$altExifTool{OPTIONS} = $$self{OPTIONS};
4186
4399
  $$altExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET};
4187
4400
  $$altExifTool{REQ_TAG_LOOKUP} = $$self{REQ_TAG_LOOKUP};
4401
+ $$altExifTool{ReqTagAlreadySet} = 1;
4188
4402
  my $fileName = $$altExifTool{ALT_FILE};
4189
4403
  # allow tags from the main file to be used in the alternate file names
4190
4404
  # (eg. -file1 '$originalfilename')
@@ -4554,7 +4768,7 @@ sub ParseArguments($;@)
4554
4768
  my (@exclude, $wasExcludeOpt);
4555
4769
 
4556
4770
  $$self{REQUESTED_TAGS} = [ ];
4557
- $$self{REQ_TAG_LOOKUP} = { };
4771
+ $$self{REQ_TAG_LOOKUP} = { } unless $$self{ReqTagAlreadySet};
4558
4772
  $$self{EXCL_TAG_LOOKUP} = { };
4559
4773
  $$self{IO_TAG_LIST} = undef;
4560
4774
  delete $$self{EXCL_XMP_LOOKUP};
@@ -4838,6 +5052,7 @@ sub SetFoundTags($)
4838
5052
  $allTag = 1;
4839
5053
  } elsif ($tag =~ /[*?]/) {
4840
5054
  # allow wildcards in tag names
5055
+ $tag =~ tr/-_A-Za-z0-9*?//dc; # sterilize
4841
5056
  $tag =~ s/\*/[-\\w]*/g;
4842
5057
  $tag =~ s/\?/[-\\w]/g;
4843
5058
  $tag .= '( \\(.*)?' if $doDups or $allGrp;
@@ -4845,6 +5060,7 @@ sub SetFoundTags($)
4845
5060
  next unless @matches; # don't want entry in list for wildcard tags
4846
5061
  $allTag = 1;
4847
5062
  } elsif ($doDups or defined $group) {
5063
+ $tag =~ tr/-_A-Za-z0-9//dc; # sterilize
4848
5064
  # must also look for tags like "Tag (1)"
4849
5065
  # (but be sure not to match temporary ValueConv entries like "Tag #")
4850
5066
  @matches = grep(/^$tag( \(|$)/i, keys %$tagHash);
@@ -5811,7 +6027,7 @@ sub Decode($$$;$$$)
5811
6027
  # Inputs: 0) ExifTool object ref, 1) string, 2) destination character set name,
5812
6028
  # 3) optional destination byte order (2-byte and 4-byte fixed-width sets only)
5813
6029
  # Returns: string in specified encoding
5814
- sub Encode($$$;$)
6030
+ sub Encode($$;$$)
5815
6031
  {
5816
6032
  my ($self, $val, $to, $toOrder) = @_;
5817
6033
  return $self->Decode($val, undef, undef, $to, $toOrder);
@@ -5892,8 +6108,8 @@ sub MakeTagName($)
5892
6108
  my $name = shift;
5893
6109
  $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
5894
6110
  $name = ucfirst $name; # capitalize first letter
5895
- $name = "Tag$name" if length($name) < 2 or $name =~ /^[-0-9]/;
5896
6111
  # must at least 2 characters long and not start with - or 0-9-
6112
+ $name = "Tag$name" if length($name) < 2 or $name =~ /^[-0-9]/;
5897
6113
  return $name;
5898
6114
  }
5899
6115
 
@@ -71,7 +71,7 @@ supported by ExifTool (r = read, w = write, c = create):
71
71
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
72
72
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
73
73
  A r | DVB r/w | JSON r | OGG r | RM r
74
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
74
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
75
75
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
76
76
  AAE r | EIP r | KDC r | OPUS r | SO r
77
77
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
@@ -592,9 +592,10 @@ Format for printing GPS coordinates. This is a printf format string with
592
592
  specifiers for degrees, minutes and seconds in that order, however minutes
593
593
  and seconds may be omitted. If the hemisphere is known, a reference
594
594
  direction (N, S, E or W) is appended to each printed coordinate, but adding
595
- a C<+> to the first format specifier (eg. C<%+.6f>) prints a signed
596
- coordinate instead. For example, the following table gives the output for
597
- the same coordinate using various formats:
595
+ a C<+> or C<-> to the first format specifier (eg. C<%+.6f> or C<%-.6f>)
596
+ prints a signed coordinate instead (C<+> also adds a leading plus sign to
597
+ positive coordinates, while C<-> does not). For example, the following
598
+ table gives the output for the same coordinate using various formats:
598
599
 
599
600
  CoordFormat Example Output
600
601
  ------------------- ------------------
@@ -714,6 +715,43 @@ value to be added to the maker notes base offset. It may also be set to the
714
715
  empty string ('') for ExifTool will take its best guess at the correct base,
715
716
  or undef (the default) for no base adjustment.
716
717
 
718
+ =item Geolocation
719
+
720
+ Flag to generate geolocation tags based on the GPSLatitude/GPSLongitude or
721
+ City/State/Province/Country read from a file. This feature uses an included
722
+ database with cities over a population of 2000 from geonames.org. May be set
723
+ to a string of the form "Lat,Lon" (eg. "44.56,-72.33") or city with optional
724
+ state/province, country and/or country code (eg. "Paris,France") to act as a
725
+ default for files not containing GPS or geolocation information, or include
726
+ tag names with leading dollar signs separated by commas to specify the tags
727
+ to use for the geolocation input. May also include regular expressions for
728
+ more flexible matching. See L<https://exiftool.org/geolocation.html> for
729
+ more details. Default is undef.
730
+
731
+ =item GeolocAltNames
732
+
733
+ Flag to search alternate Geolocation city names if available (ie. if
734
+ $Image::ExifTool::Geolocation::altDir has been set). Set to 0 to disable
735
+ use of the alternate names. Default is 1.
736
+
737
+ =item GeolocFeature
738
+
739
+ Comma-separated list of feature codes to include in city search, or exclude
740
+ if the list begins with a dash (-). Valid feature codes are PPL, PPLA,
741
+ PPLA2, PPLA3, PPLA4, PPLA5, PPLC, PPLCH, PPLF, PPLG, PPLL, PPLR, PPLS, STLMT
742
+ and Other. See L<http://www.geonames.org/export/codes.html#P> for a
743
+ description of these codes. Default is undef.
744
+
745
+ =item GeolocMaxDist
746
+
747
+ Maximum distance in km to the geolocation city. The Geolocation tags are
748
+ not generated if the distance is greater than this. Default is undef.
749
+
750
+ =item GeolocMinPop
751
+
752
+ Minimum population for the Geolocation city. Cities smaller than this are
753
+ ignored. Default is undef.
754
+
717
755
  =item GeoMaxIntSecs
718
756
 
719
757
  Maximum interpolation time in seconds for geotagging. Geotagging is treated
@@ -2470,27 +2508,27 @@ MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview,
2470
2508
  MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB, MNG, MOBI, MOI,
2471
2509
  MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes, MakerUnknown,
2472
2510
  Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta, MinoltaRaw,
2473
- Motorola, NITF, Nikon, NikonCapture, NikonCustom, NikonScan, NikonSettings,
2474
- NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF, PICT, PNG,
2475
- PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot, Pentax,
2476
- PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript,
2477
- PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF,
2478
- RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP,
2479
- Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2,
2480
- SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw,
2481
- Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData,
2482
- VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM,
2483
- XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth, XMP-GFocus,
2484
- XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1,
2485
- XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi, XMP-ast,
2486
- XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs, XMP-dc,
2487
- XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, XMP-exifEX,
2488
- XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr, XMP-hdrgm,
2489
- XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
2490
- XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf,
2491
- XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism,
2492
- XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, XMP-x,
2493
- XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
2511
+ Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom, NikonScan,
2512
+ NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF,
2513
+ PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot,
2514
+ Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo,
2515
+ PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2,
2516
+ RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR,
2517
+ Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh,
2518
+ SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado,
2519
+ Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent,
2520
+ Track#, UserData, VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP,
2521
+ XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth,
2522
+ XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP,
2523
+ XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi,
2524
+ XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
2525
+ XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
2526
+ XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
2527
+ XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
2528
+ XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
2529
+ XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
2530
+ XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
2531
+ XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
2494
2532
  XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
2495
2533
 
2496
2534
  =item Family 2 (Category):
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.76
3
+ Version: 12.81
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -28,7 +28,7 @@ supported by ExifTool (r = read, w = write, c = create):
28
28
  3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
29
29
  7Z r | DV r | JPEG r/w | OFR r | RWZ r
30
30
  A r | DVB r/w | JSON r | OGG r | RM r
31
- AA r | DVR-MS r | JXL r | OGV r | SEQ r
31
+ AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
32
32
  AAC r | DYLIB r | K25 r | ONP r | SKETCH r
33
33
  AAE r | EIP r | KDC r | OPUS r | SO r
34
34
  AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w